ゼロディバイド(課題を発見、しかしなぜ?)

 

そこで、私はゼロ除算を引き起こして いる問題を見つけました。これが出てくるまで、自分のコードは完成していると思っていました。私のEAには3つのバリエーションがあります。1つは完璧に動作し、他の2つはこの部門で類似しています(以下のコード)。なぜこれがゼロディバイドを引き起こすのか、理解できません。

矢印のついたラインは、問題を起こしているラインを表しています。私はそれがここにこの問題であることを分離しましたか?それとも、AUDUSDのバックテストで異常が発生しているのでしょうか (Forex Tester 2から履歴データをダウンロードしています。私のEAの1つでは問題なく動作しているようです。)

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//| Function that checks for an MA Cross                                                                                                   |
//+----------------------------------------------------------------------------------------------------------------------------------------+   

void CheckForMaTrade()
   {
   double CurrentSmallFish1   =  iMA(NULL,60,3,0,1,0,1),  Hour4_3   =  iMA(NULL,240,3,0,1,0,1),  Daily_3   =  iMA(NULL,1440,3,0,1,0,1); 
   double CurrentSmallFish2   =  iMA(NULL,60,5,0,1,0,1),  Hour4_5   =  iMA(NULL,240,5,0,1,0,1),  Daily_5   =  iMA(NULL,1440,5,0,1,0,1);
   double CurrentSmallFish3   =  iMA(NULL,60,8,0,1,0,1),  Hour4_8   =  iMA(NULL,240,8,0,1,0,1),  Daily_8   =  iMA(NULL,1440,8,0,1,0,1);
   double CurrentSmallFish4   =  iMA(NULL,60,10,0,1,0,1), Hour4_10  =  iMA(NULL,240,10,0,1,0,1), Daily_10  =  iMA(NULL,1440,10,0,1,0,1);
   double CurrentSmallFish5   =  iMA(NULL,60,12,0,1,0,1), Hour4_12  =  iMA(NULL,240,12,0,1,0,1), Daily_12  =  iMA(NULL,1440,12,0,1,0,1);
   double CurrentSmallFish6   =  iMA(NULL,60,15,0,1,0,1), Hour4_15  =  iMA(NULL,240,15,0,1,0,1), Daily_15  =  iMA(NULL,1440,15,0,1,0,1);
   double CurrentBigFish1     =  iMA(NULL,60,30,0,1,0,1), Hour4_30  =  iMA(NULL,240,30,0,1,0,1), Daily_30  =  iMA(NULL,1440,30,0,1,0,1);
   double CurrentBigFish2     =  iMA(NULL,60,35,0,1,0,1), Hour4_35  =  iMA(NULL,240,35,0,1,0,1), Daily_35  =  iMA(NULL,1440,35,0,1,0,1);
   double CurrentBigFish3     =  iMA(NULL,60,40,0,1,0,1), Hour4_40  =  iMA(NULL,240,40,0,1,0,1), Daily_40  =  iMA(NULL,1440,40,0,1,0,1);
   double CurrentBigFish4     =  iMA(NULL,60,45,0,1,0,1), Hour4_45  =  iMA(NULL,240,45,0,1,0,1), Daily_45  =  iMA(NULL,1440,45,0,1,0,1);
   double CurrentBigFish5     =  iMA(NULL,60,50,0,1,0,1), Hour4_50  =  iMA(NULL,240,50,0,1,0,1), Daily_50  =  iMA(NULL,1440,50,0,1,0,1);
   double CurrentBigFish6     =  iMA(NULL,60,60,0,1,0,1), Hour4_60  =  iMA(NULL,240,60,0,1,0,1), Daily_60  =  iMA(NULL,1440,60,0,1,0,1);
   double ema21               =  iMA(NULL,60,21,0,1,0,1);

 //-------------------(-H1 Fish-)------------------\\  - //------------(-H4 Fish-)-----------\\ - //------------(-D1 Fish-)-----------\\
   
  // Check for Moving Averages Fanned up ON THE DAILY TIME FRAME, creating an UP bias.   
    if(D1_Bias=="None") 
      if(Daily_3>Daily_5)
         if(Daily_5>Daily_8)
            if(Daily_8>Daily_10)
               if(Daily_10>Daily_12)
                  if(Daily_12>Daily_15)
                     if(Daily_15>Daily_30)
                        if(Daily_30>Daily_35)
                           if(Daily_35>Daily_40)
                              if(Daily_40>Daily_45)
                                 if(Daily_45>Daily_50)
                                    if(Daily_50>Daily_60)
                                       {
                                       D1_Bar=Time[1];
                                       D1_Bias="Daily is Up";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
  
  // Check for Moving Averages Fanned up ON THE 4 HOUR TIME FRAME, creating an UP bias.  
    if(D1_Bias=="Daily is Up" && H4_Bias=="None") 
      if(Hour4_3>Hour4_5)
         if(Hour4_5>Hour4_8)
            if(Hour4_8>Hour4_10)
               if(Hour4_10>Hour4_12)
                  if(Hour4_12>Hour4_15)
                     if(Hour4_15>Hour4_30)
                        if(Hour4_30>Hour4_35)
                           if(Hour4_35>Hour4_40)
                              if(Hour4_40>Hour4_45)
                                 if(Hour4_45>Hour4_50)
                                    if(Hour4_50>Hour4_60)
                                       {
                                       H4_Bar=Time[1];
                                       H4_Bias="4 Hour is Up";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned up on H1, creating an UP bias.
   if(D1_Bias=="Daily is Up" && H4_Bias=="4 Hour is Up" && H1_Bias=="None")
      if(CurrentSmallFish1>CurrentSmallFish2)
         if(CurrentSmallFish2>CurrentSmallFish3)
            if(CurrentSmallFish3>CurrentSmallFish4)
               if(CurrentSmallFish4>CurrentSmallFish5)
                  if(CurrentSmallFish5>CurrentSmallFish6)
                     if(CurrentSmallFish6>CurrentBigFish1)
                        if(CurrentBigFish1>CurrentBigFish2)
                           if(CurrentBigFish2>CurrentBigFish3)
                              if(CurrentBigFish3>CurrentBigFish4)
                                 if(CurrentBigFish4>CurrentBigFish5)
                                    if(CurrentBigFish5>CurrentBigFish6)
                                       {
                                       triggerBarTime=Time[1];
                                       H1_Bias="H1 is Up";
                                       Comment("Bias is: "+H1_Bias+" since: "+TimeToStr(triggerBarTime,TIME_DATE|TIME_MINUTES));
                                       H4_Bias="4 Hour is Up";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       D1_Bias="Daily is Up";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   
   
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

   H1_low  = iLow(NULL, PERIOD_H1, 1);
   H1_close = iClose(NULL, PERIOD_H1, 1);
   if(H1_Bias=="H1 is Up" && H4_Bias=="4 Hour is Up" && D1_Bias=="Daily is Up" && H1_close > CurrentBigFish6)
      {
       
        if(ema21 - H1_low > Point / 2)  // << These parts here?
            {
            PullBack_Bar = Time[1];  // << These parts here?
            }
            if(PullBack_Bar > triggerBarTime)  // << These parts here?
                {
                H1_Buy_Touch = "H1 Buy Touch";
                OrderEntry(0); // Pending order Buy Stop function is called.
                }


  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  
// The other way I write it on the other EA thats works perfectly is:

  ///////////////////////////////////////////////////////////////////////////////////////

   H1_high  = iHigh(NULL, PERIOD_H1, 1);
   H1_close = iClose(NULL, PERIOD_H1, 1);
   H4_close = iClose(NULL, PERIOD_H4, 1);
   D1_close = iClose(NULL, PERIOD_D1, 1);
   
   if(H1_Bias=="Down" && H4_Bias=="4 Hour is Down" && D1_Bias=="Daily is Down" && H1_high >= ema21 && H1_close < CurrentBigFish6)
      {
      H1_Sell_Touch = "H1 Sell Touch";
         {
         OrderEntry(1); // Pending order Sell Stop function is called.
         }
      }
 
DomGilberto:

そこで、私はゼロ除算を引き起こしている問題を見つけました。これが出てくるまで、自分のコードは完成していると思っていました。私のEAには3つのバリエーションがあります。1つは完璧に動作し、他の2つはこの部門で類似しています(以下のコード)。なぜこれがゼロディバイドを引き起こすのか、理解できません。

矢印のついたラインは、問題を起こしているラインを表しています。私はそれがここにこの問題であることを分離しましたか?それともAUDUSDのバックテストで異常が発生しているのでしょうか(Forex Tester 2から履歴データをダウンロードしています。私のEAの1つではうまく動作しているようです。)。

私は、あなたが問題を見つけたかどうか確信が持てません ... ... どうやってあなたが見つけたことを知るのですか?

私は、あなたが矢印で示したコードがゼロによる除算エラーを引き起こすとは思いません。

if(ema21 - H1_low > Point / 2)  // << These parts here?

をこのように置き換えてください.

double HalfAPoint = Point / 2.0;



if(ema21 - H1_low > HalfAPoint) 

に置き換えて、もう一度試してみてください。

あなたのエラーは他の場所にあるため、残るのではないかと思います ... ...

 

私は上記の1つの/divisionの問題しか見つけることができません。

ゼロ除算は、上記の関数から来るのではありません。

もし、すべてのコードを表示したくないのであれば。

ea、custom_indicators、included filesの中からすべての割り算の問題を探し出してください。

の右辺の式が0にならないことを確認してください。

を追加しました。

もう一つ、ArraySort()は本当に便利です。

もし、Daily_3が最高値か最安値か知りたいなら、配列を作り、ソートしてください。

 
RaptorUK:

問題が見つかったかどうかは分かりませんが ... ... どうして分かったのでしょうか?

あなたが矢印で示したコードがゼロによる除算エラーを引き起こすとは思えません。

をこれに置き換えてください.

に置き換えて、もう一度試してみてください。

私は、あなたのエラーは他の場所にあるので、残っていると思います。


私のEAの「V1-V2-V3」があります。

V1を新しい白紙のテンプレートにコピーして、上で説明した部分を(下のコード)に変更したところ、AUDUSDのバックテスト中にゼロディバイドエラーが 発生しました。データはゼロディバイドと関係あるのでしょうか?2001年から2013年までのEURUSDの全バージョンのEAのバックテスト(Forex TesterでデータをダウンロードしてSTでインポート)を行うと、どのEAもエラーにならないのですが?

            PullBack_Bar = Time[1];  // << These parts here?
            }
            if(PullBack_Bar > triggerBarTime)  // << These parts here?
                {
                H1_Buy_Touch = "H1 Buy Touch";
                OrderEntry(0); // Pending order Buy Stop function is called.
                }
 
私はちょうど他のペアを実行して、このゼロ除算の 問題は、V2とV3で、そのAUDUSDを除いて表示されていないようです?データが関係ないのなら訂正してください。
 
DomGilberto:
私はちょうど他のペアを実行して、このゼロ除算の問題は、V2とV3で、そのAUDUSDを除いて表示されていないようです?データが関係ないのなら訂正してください。
もしあなたが価格を除数として使用するコードを持っていて、価格が0.0であれば、はい、あなたは価格のためにゼロによる除算エラーを得ることができます... ...。
 
DomGilberto:


私のEAの「V1-V2-V3」があります。

V1を新しい白紙のテンプレートにコピーして、上で説明した部分を(下のコード)に変更したところ、AUDUSDのバックテスト中にゼロディバイドエラーが発生しました。データはゼロディバイドと関係あるのでしょうか?2001年から2013年までのEURUSDの全バージョンのEAのバックテスト(Forex TesterでデータをダウンロードしてSTでインポート)を行うと、どのEAもエラーにならないのですが?

コードを変更する前に、そのエラーを再現できるようにする必要があります。
 
DomGilberto: このデータはゼロディバイドと関係があるのでしょうか?
ここには心を読む人はいません。あなたは除算のあるコードを示していないので、ここの誰もあなたを助けることはできません。
 
WHRoeder:
ここには読心術師はいません。あなたは割り算のコードを見せてくれないので、ここでは誰もあなたを助けることはできません。

私が聞いたのは素朴な疑問で、データは関係あるのでしょうか?もしそうでないなら、ゼロディバイドについて 経験者の話を聞いた方が理解できるのですが...。ここに読心術師がいるとは思わなかった...。

このサイトでは、コードが多すぎて、細かいディバイドをいちいち投稿できません。私としては、上で説明したことに問題を分離したつもりだったのですが、どうやらそうではないようです。ただ、1つの小さなことを変更したら、ゼロ除算になってしまい、うまくいかないのはちょっと不思議です(私が変更した小さなことは、最初の投稿で図解したものです)。

@RaptorUK だから本来は私のバックテスト中のデータの価格の異常かもしれない、その場合、AUDUSDで。ただ、V2とV3が1/4くらいは完璧に動いているのに、突然ゼロ除算になり、EAが一斉に動かなくなるのは少し変ですね。

 
DomGilberto:


@RaptorUK なので、本来は私のバックテスト中のデータの価格の異常かもしれませんが、その場合はAUDUSDで。ただ、V2とV3が1/4ほど完璧に動いていたのに、突然ゼロ除算になり、EAが一斉に動かなくなるのは少し変ですね。

この単純な問題を解決するのに何日もかけたいのなら、どうぞご自由に ... ....私はそうしません。

バックテスト中にいつ起こるかが分かれば、見つけるのは簡単です。... そう、それらすべてについて、除数を含む行の前にPrint()を追加して、除数と問題のコードの行への参照を表示します ... ....

例えば

if(d == 0.0) Print("a = c / d - divisor d is " + d );

a = c / d;

あなたのコードがゼロによる除算エラーで終了したとき、ログファイルをチェック し、最後のいくつかのプリントに、エラーを発生させたコード行とどの変数がゼロに設定されたかを示すプリントがあります ...

... 賢く働くことを学び、論理的かつ効率的に問題を追い詰めることができます。

 
DomGilberto: 私が尋ねたのは単純な質問だけです。
ここでは誰も答えられないことを。あなたは怠け者です。あなたは「これはうまくいくか」「何が問題か」という投稿ばかりで、何の価値も提供していません。
DomGilberto です。
おい、その通りだ!曖昧で悪かったな。

そして、あなたは学習しない - あなたはすべての(関連する)コードとあなたの変数の値を繰り返し要求されています。なぜ21回も質問する必要があるのでしょうか?あなたのコードにprint文を入れて、何や何だったかのようないくつかの情報を取得します。

それから、それでも問題が解決しない場合は、質問してください。

理由: