Zero Divide (Нашли проблему - но почему?)

 

Итак, я нашел проблему того, что вызывает нулевое деление - я не видел этого раньше до сих пор. Я думал, что закончил работу над своим кодом, пока не появилось это! У меня есть 3 варианта моего советника. Один работает безупречно, два других похожи в этом отношении (код ниже). Я не могу понять, почему это может быть причиной нулевого деления?

Посмотрите на линии со стрелками, указывающими на линии, которые вызывают проблему... Я определил, что это именно эта проблема? Или это, или я получаю аномалию с бэктестом AUDUSD (я загружаю свои исторические данные из Forex Tester 2... кажется, он отлично работает с одним из моих советников).

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//| 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:

Итак, я нашел проблему того, что вызывает нулевое деление - я не видел этого раньше до сих пор. Я думал, что закончил работу над своим кодом, пока не появилось это! У меня есть 3 варианта моего советника. Один работает безупречно, два других похожи в этом отношении (код ниже). Я не могу понять, почему это может быть причиной нулевого деления?

Посмотрите на линии со стрелками, указывающими на линии, которые вызывают проблему... Я определил, что это именно эта проблема? Или это, или я получаю аномалию с бэктестом AUDUSD (я загружаю свои исторические данные из Forex Tester 2... кажется, он отлично работает с одним из моих советников).

Я не уверен, что вы нашли проблему... откуда вы знаете, что нашли?

Я не думаю, что код, который вы указали стрелкой, вызовет ошибку деления на ноль, чтобы быть уверенным, замените это ...

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

на это...

double HalfAPoint = Point / 2.0;



if(ema21 - H1_low > HalfAPoint) 

и попробуйте снова.

Я подозреваю, что ваша ошибка останется, поскольку она находится в другом месте...

 

Я могу обнаружить только одну проблему /раздел выше.

Деление на ноль не происходит из приведенной выше функции.

Если вы не хотите показывать все коды, тогда:

Отследите все проблемы с делением в ea, custom_indicators и включенных файлах.

Убедитесь, что выражение справа от / не может быть равно 0.

Добавлено:

И еще одно замечание, вам бы очень пригодилась функция ArraySort().

Если вы хотите узнать, является ли Daily_3 самым высоким/самым низким, создайте массив и отсортируйте.

 
RaptorUK:

Я не уверен, что вы нашли проблему... откуда вы знаете, что нашли?

Я не думаю, что код, который вы указали стрелкой, вызовет ошибку деления на ноль, чтобы быть уверенным, замените это ...

на это...

и попробуйте снова.

Я подозреваю, что ваша ошибка останется, поскольку она находится в другом месте...


У меня есть "V1-V2-V3" моего советника.

Я скопировал V1 в новый пустой шаблон и изменил часть, которую я проиллюстрировал выше, на (ниже код), и это дало мне ошибку деления нуля во время обратного тестирования на AUDUSD. Имеют ли данные какое-либо отношение к нулевому делению? Когда я запускаю обратный тест всех версий моего советника на EURUSD с 2001-2013 (Forex Tester загрузил данные и импортировал их в ST), я не получаю никаких ошибок ни на одном из моих советников?

            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.
                }
 
Я просто пробежался по другим парам, и эта проблема с нулевым делением, похоже, не проявляется, разве что на AUDUSD с V2 и V3? Поправьте меня, если данные не имеют к этому никакого отношения?
 
DomGilberto:
Я просто пробежался по другим парам, и эта проблема с нулевым делением, похоже, не проявляется, разве что на AUDUSD с V2 и V3? Поправьте меня, если данные не имеют к этому никакого отношения?
Если у вас есть код, где вы используете цену в качестве делителя, а цена равна 0.0, то да, вы можете получить ошибку деления на ноль из-за цены....
 
DomGilberto:


У меня есть "V1-V2-V3" моего советника.

Я скопировал V1 в новый пустой шаблон и изменил часть, которую я проиллюстрировал выше, на (ниже код), и это дало мне ошибку деления нуля во время обратного тестирования на AUDUSD. Имеют ли данные какое-либо отношение к нулевому делению? Когда я запускаю обратный тест всех версий моего советника на EURUSD с 2001-2013 (Forex Tester загрузил данные и импортировал их в ST), я не получаю никаких ошибок ни на одном из моих советников?

Прежде чем менять код, нужно уметь воспроизводить ошибку по своему усмотрению... как только вы сможете это сделать, тогда можно будет ее исследовать.
 
DomGilberto: Имеют ли данные какое-либо отношение к делению нуля?
Здесь нет специалистов по чтению мыслей. Вы не показали нам код с делителем, поэтому никто здесь не сможет вам помочь.
 
WHRoeder:
Здесь нет людей, читающих мысли. Вы не показали нам код с делением, поэтому никто здесь не сможет вам помочь.

Я лишь задал простой вопрос, имеют ли данные какое-то отношение к этому? Если нет, тогда я больше понимаю о нулевом делении от людей, которые имеют опыт с этим... Не думал, что здесь есть читающие мысли...

Здесь слишком много кода, чтобы постить здесь каждое маленькое деление. Что касается меня, я думал, что я изолировал проблему до того, что я объяснил выше, но, видимо, нет. Это просто немного странно, как я меняю одну крошечную вещь, а затем это не работает, потому что я получаю нулевое деление (маленькая вещь, которую я изменил, это то, что я проиллюстрировал в первом сообщении).

@RaptorUK так по сути это может быть аномалия в цене данных во время моего бэк-теста, в таком случае на AUDUSD. Просто немного странно, что V2 и V3 проходят примерно 1/4 пути безупречно, а затем внезапно наступает нулевое деление и советник перестает работать.

 
DomGilberto:


@RaptorUK, по сути, это может быть аномалия в цене данных во время моего бэк-теста, в таком случае, на AUDUSD. Просто немного странно, что V2 и V3 проходят примерно 1/4 пути безупречно, а затем внезапно наступает нулевое деление и советник перестает работать.

Если вы хотите потратить несколько дней на решение этой простой проблемы, то, конечно, не стесняйтесь.... Я бы не стал.

Если вы знаете, когда это происходит во время обратного тестирования, то это легко найти... начните обратное тестирование за день до даты, когда это произойдет... узнайте точно, с точностью до минуты, когда это произойдет... для всех делений в вашем коде... ... да, всех, добавьте Print() перед строкой, содержащей деление, которая выводит делитель и ссылку на соответствующую строку кода....

Например:

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

a = c / d;

Когда ваш код завершается с ошибкой деления на ноль, проверьте файл журнала, и в последних нескольких отпечатках будет выведена строка кода, которая привела к ошибке, и какая переменная была установлена в ноль ...

... учитесь работать умнее и искать проблемы логично и эффективно.

 
DomGilberto: Я всего лишь задал простой вопрос,
Никто здесь не может ответить. Вы ленивы. Вы продолжаете писать "будет ли это работать" или "что не так", но не предоставляете ничего ценного.
DomGilberto:
Эй, вы правы, извините за неясность!

И вы не учитесь - Вас неоднократно просили предоставить ВЕСЬ (релевантный) код и значения переменных. Почему мы все еще спрашиваем 21 пост спустя? Поместите операторы печати в ваш код и получите некоторую информацию, такую как что и было.

Затем, если вы все еще не можете решить свою проблему, спросите.