MQL4マスターに質問です。ダブルコンペアについてもう一度。 - ページ 3

 
komposter:

そして、簡略化された形で、ComparePriceと同じように高速に動作します:
しかし、それほど正確ではありません :)
Pointで 値が異なると、半分くらいの確率で誤った結果を出してしまいます。

ところで、簡易モードと何か関係があるのでしょうか?簡略化された形式のComparePriceは、非簡略化されたイコールと同じくらい遅くなることがあります。
 
Irtron:
整数

まず、自分の注文でExpert Advisorをいくつか書き、いきなりストップロスが1ポイント間違っていたというお客様の嵐を感じながら...。そして、NormalizeDouble()関数の不条理さを説明すると、どうなるんでしょうね=)

秘密を教えてあげよう。
私はこれまで、必要以上に多くのカスタムExpert Advisorを作成してきましたが、購入する理由がないため、購入したいという衝動に駆られたことは一度もありません。私のプログラムでは、ストップロスはあるべき位置にあることが保証されています(「見える」のではありません)。そのため、特に特殊な機能については、お客様に説明する必要がありません。EAを書く意味は、そうしたクライアントへの疑問や説明をなくすことにあるように思います。

また、NormalizeDouble()関数なしで、どのようにしてあるべき場所に確実に位置づけることができるのでしょうか?また、NormalizeDouble()を使わずに説明から解放されるにはどうしたらいいのでしょうか?
 
Irtron:
VBAG です。
そして、注文からサーバーから取り出した価格も、まだ正規化する必要があることが判明しました!!!!
それはないでしょう。MTのガワはもうほとんど正規化されていない。
昔も今も、理解しがたい過去のデータでテストすると、Expert Advisorのパフォーマンスが理解できない、という話はよく聞きます。
その通り、間違った記事があったのを覚えています。しかし、テスターにとって致命的だったのは、ノーマライズができないことだった。何でもいいんです。
また、ノーマライズせずに0などと比較する場合、インジケータダブりをどのように処理するのでしょうか。とても興味深いです。
 
VBAG:
また、ノーマライズせずに0などと比較する場合、インジケーターのダブりをどう処理するのでしょうか。とても興味深いです。
信じられないかもしれませんが :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
 
Irtron:
VBAG です。
また、ノーマライズせずに0などと比較する場合、インジケーターのダブりをどう処理するのでしょうか。とても興味深いです。
信じられないかもしれませんが :)
    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");
ええ、まあ...- というのは理解できる。それぞれの状況において、最もシンプルな解決策を求めるという、あなたの考え方は理解できました。


 
VBAGはこのスクリプトを見てください
int start()
  {
//----
string str;
bool ok1,ok2;
   for(int i=0;i<10;i++){
      double NotNormPrice_1=StrToDouble("1.1111"+i);
         for(int j=0;j<10;j++){
            double NotNormPrice_2=StrToDouble("1.1111"+j);
               if(NormalizeDouble(NotNormPrice_1,4)==NormalizeDouble(NotNormPrice_2,4)){
                  str="Metod 1: "+DoubleToStr(NotNormPrice_1,5)+" = "+DoubleToStr(NotNormPrice_2,5)+" ";
                  ok1=true;
               }                 
               else{
                  str="Metod 1: "+DoubleToStr(NotNormPrice_1,5)+" != "+DoubleToStr(NotNormPrice_2,5)+" ";
                  ok1=false;
               }
               if(NormalizeDouble(NotNormPrice_1-NotNormPrice_2,4)==0.0){
                  str=str+"Metod 2: "+DoubleToStr(NotNormPrice_1,5)+" = "+DoubleToStr(NotNormPrice_2,5);
                  ok2=true;
               }         
               else{
                  str=str+"Metod 2: "+DoubleToStr(NotNormPrice_1,5)+" != "+DoubleToStr(NotNormPrice_2,5);                
                  ok2=false;
               }
            if(ok1!=ok2)Print(str);
         }
   }
//----
   return(0);
  }

とその成果

09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11111 != 1.11115 Metod 2: 1.11111 = 1.11115
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11111 != 1.11116 Metod 2: 1.11111 = 1.11116
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11112 != 1.11115 Metod 2: 1.11112 = 1.11115
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11112 != 1.11116 Metod 2: 1.11112 = 1.11116
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11112 != 1.11117 Metod 2: 1.11112 = 1.11117
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11113 != 1.11115 Metod 2: 1.11113 = 1.11115
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11113 != 1.11116 Metod 2: 1.11113 = 1.11116
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11113 != 1.11117 Metod 2: 1.11113 = 1.11117
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11115 Metod 2: 1.11114 = 1.11115
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11116 Metod 2: 1.11114 = 1.11116
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11117 Metod 2: 1.11114 = 1.11117
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11118 Metod 2: 1.11114 = 1.11118
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11114 != 1.11119 Metod 2: 1.11114 = 1.11119
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11115 != 1.11111 Metod 2: 1.11115 = 1.11111
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11115 != 1.11112 Metod 2: 1.11115 = 1.11112
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11115 != 1.11113 Metod 2: 1.11115 = 1.11113
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11115 != 1.11114 Metod 2: 1.11115 = 1.11114
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11116 != 1.11111 Metod 2: 1.11116 = 1.11111
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11116 != 1.11112 Metod 2: 1.11116 = 1.11112
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11116 != 1.11113 Metod 2: 1.11116 = 1.11113
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11116 != 1.11114 Metod 2: 1.11116 = 1.11114
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11117 != 1.11112 Metod 2: 1.11117 = 1.11112
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11117 != 1.11113 Metod 2: 1.11117 = 1.11113
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11117 != 1.11114 Metod 2: 1.11117 = 1.11114
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11118 != 1.11114 Metod 2: 1.11118 = 1.11114
09:04:13 NormExperiment EURUSD,M5: Metod 1: 1.11119 != 1.11114 Metod 2: 1.11119 = 1.11114

どちらの算術が好きかは、ご自身でお決めください。

指標線(例えばMA)と価格(Price_Now>MA_Now、Previous_Price<=Previous_MA)のクロスを判定する場合、常に8桁に正規化する必要があります。

 
Integer:

は、8 桁に正規化することが必須である。


いや、なぜ8人に減らしたのか?:)7、9、6もある。4を目指す人もいる。
本当に、なぜ8点なのか?基準は何ですか?
 
VBAG:
それぞれの状況において、最もシンプルな解決策を探すという姿勢は理解できます。

訂正します。しかし、残念ながら、それは必ずしも簡単なことではありません。
 
Irtron:
整数

は、8 桁に正規化することが必須である。


いいえ、なぜ8までなのでしょうか?:)7、9、6もある。4を目指す人もいる。
本当に、なぜ8点なのか?基準は何ですか?

仮に

価格=1.1111

ma = 1.11110001

8桁に正規化すれば、マ>プライスは正しい。桁数を少なくして正規化すると、両者が等しくなる-不正確となる。 このようにして、最大限の精度を得ることができる。

9桁に正規化してもうまくいきません。まるで、価格が9桁でインジケーターが8桁、あるいはその逆(忘れた)、要するに未知の謎に覆われているのである。

 
Irtron:

    double cci;
    
    cci = iCCI(NULL, 0, 14, PRICE_CLOSE, 1);
    
    if (cci > 0.)
        Print("Above");
    else if (cci < 0.)
        Print("Below");
    else
        Print("Bingo!");

このメソッドは合格です。今のところ、誰もその結果の誤差に気づいていない)。