Скачать MetaTrader 5

ошибка "zero divide"

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Анатолий
645
Анатолий  

Вчера впервые сталкнулся с этой ошибкой, при оптимизации, в "Результаты оптимизации" некоторые варианты параметров ничем неотличаясь от других показывали прибыль, но установив их, получаю полный лог ошибки "...EURUSD,M5: zero divide" и как следствие ни одной открытой сделки.., причину этой ошибки удалось устранить, суть: переменной extern double x1 =...; в стандартной функции int start() присваивал другое значение(константа), зависящее от первоначального, за что и получал "zero divide", для решения проблемы добавил еще одну переменную, на которую уже присваивалось вычисляемое значение... Здесь все ок)

НО сегодня столкнулся с ошибкой  еще более странной из той же серии "zero divide":

if (Fmax!=maX[1])
     {
        Fmax=maX[1];//maX[1]-это Close[z], где z!=0
        return(1);
     }
else return(-1);

данный код часть вызываемой функции, так вот ошибка возникала изза переменной типа double Fmax, которая используется только в этом участке кода, как видно она может только принимать значения, и быть сравниваемой, пробовал и нормализовывать и приводить обе переменные Fmax и maX[1] к целым, многое что еще, ничего непомогало, а если ее "затереть" то эксперт работает без ошибок, но если затереть то будет другой результат торговли, да и не выход.

if (NormalizeDouble(Fmax,4)!=NormalizeDouble(maX[1],4))
     {
        Fmax=NormalizeDouble(maX[1],4);//maX[1]-это Close[z], где z!=0
        return(1);
     }
else return(-1);

Причину нашел, эта функция у меня за один "проход" функции start() вызывалась несколько раз(с одним и тем же ответом либо 1 либо -1), что не запрещено(:, так вот при втором вызове и вылетала эта ошибка, недавая добраться до открытия позиции. Решение: добавил переменную, которой и стал присваивать результат функции, а уже потом, эту переменную тыкал там где нать))

Впринципе интересные головоломки выскакивают иногда, но больно уж много времени уходит на их решение ;)

p.s. осталась еще парочка "zero divide", так к примеру при тестировании на м5 за 1 год, в первый день (в не зависимости от какой даты начинается тестирование) в течение первых суток периодически выскакивают энти сюрпризы, а на протежении оставшейся даты больше невстречаются..

Советник тестовый, и операции деления в нем неиспользуются

Левитин Сергей В.
5163
Левитин Сергей В.  
storm писал(а) >>

Советник тестовый, и операции деления в нем неиспользуются

Не могЁт такого быть. Косяк должен быть ваш, будет код постараюсь показать ошибки...

Анатолий
645
Анатолий  
Figar0 >>:

Не могЁт такого быть. Косяк должен быть ваш, будет код постараюсь показать ошибки...


Код показать немогу, ошибки может быть и есть, но не влияющие на это явление. Описал все как есть. А что деление не использую, это прада, у меня даже нет в нем ММ, но пару раз перемножаются целые с дробными
Vadim Zhunko
5226
Vadim Zhunko  
Значит есть функция использующая деление.
Анатолий
645
Анатолий  
Наверное все же есть ошибка(, как найду поделюсь:)
Левитин Сергей В.
5163
Левитин Сергей В.  
storm писал(а) >>

А что деление не использую, это прада, у меня даже нет в нем ММ...

Глубокомысленно)

----------------------------

Из того что смог уловить из первог о поста: это Close[z], где z!=0 А z не больше Bars? Тогда Close может быть 0.

Кроме, если ошибка вылезает в начале тестирования, обратите внимание на инициализацию переменных.

Анатолий
645
Анатолий  
Нашел!! Вы были правы, было одно деление, не относящееся к основной части советника, используемое для расчета настоящего матожидания для убыточных вариантов настроек советника при оптимизации т.е. за вычетом своп и спрэда из общего убытка(так как оптимизирую в основном на минус, т.е. все параметры получаю из убыточных вариантов, после чего переворот МТС). Сей факт я и упустил, забыл про это дело.
//---------------------------------------------------------------
 if (Hour()==12&&Minute()==5)
 {
 double Profit=0; 
 double Swap=0;
 int sh=0;//на этот ноль в дальнейшем и происходило деление, исправил на 1
 while(true)
 {
   if(OrderSelect(sh,SELECT_BY_POS,MODE_HISTORY )==false)        break;
   if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
   //Swap=Swap+OrderSwap();
   Profit=Profit+OrderProfit(); 
   sh++;
 }
 //Alert(Swap);
 Alert("кол-во позиций ",sh," мат.ожид.=",(Profit+MarketInfo(Symbol(),13)*sh)/sh);
 }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }

И еще, возникновение этой ошибки "zero divide" позволяло советнику открывать позиции. После того как ее исправил, советник перестал открывать позы, с чем тоже разобрался)

Больше Ашибок нету!

Спасиб за помощь)

Robertas
30
Robertas  

Помогите, пожалуста! Тажи проблема, индикатор неработает :/


for (int i=limit; i>2; i--)
{
//---- Блок Up-фракталов
if (iFractals(NULL,0,MODE_UPPER,i)!=0)
{
Up++;
BufPriceUp[Up]=iFractals(NULL,0,MODE_UPPER,i);
BufCandleUp[Up]=i;
if (Up>2 && Up-BufUp>1 && BufPriceUp[Up]<BufPriceUp[Up-1] && BufPriceUp[Up-1]<BufPriceUp[Up-2])
{
BufUp=Up;
int x1=BufCandleUp[Up-1];
int x2=BufCandleUp[Up];
double y1=NormalizeDouble(BufPriceUp[Up-1],4);
double y2=NormalizeDouble(BufPriceUp[Up],4);
}
}
//---- Блок Down-фракталов
if (iFractals(NULL,0,MODE_LOWER,i)!=0)
{
Down++;
BufPriceDown[Down]=iFractals(NULL,0,MODE_LOWER,i);
BufCandleDown[Down]=i;
if (Down>2 && Down-BufDown>1 && BufPriceDown[Down]>BufPriceDown[Down-1] && BufPriceDown[Down-1]>BufPriceDown[Down-2])
{
BufDown=Down;
int x13=BufCandleDown[Down-1];
int x23=BufCandleDown[Down];
double y13=NormalizeDouble(BufPriceDown[Down-1],4);
double y23=NormalizeDouble(BufPriceDown[Down],4);
}

}

int x =i;
double y =((x-x1)*(y2-y1)/(x2-x1))-x; // Функция описуваещая линию тренда UP 
double y3 =((x-x13)*(y23-y13)/(x23-x13))-y13;// Функция описуваещая линию тренда DOWN
if (y<Bid) BuffDn[i]=High[i] + ArrShift;
if (y3<Bid) BuffUp[i]=High[i] + ArrShift;

}
Rid
3170
Rid  
fraktalas >>:

Помогите, пожалуста! Тажи проблема, индикатор неработает :/




Скорее всего, ошибка возникает вот на этих действиях
double y =((x-x1)*(y2-y1)/(x2-x1))-x; // Функция описуваещая линию тренда UP
double y3 =((x-x13)*(y23-y13)/(x23-x13))-y13;


Попробуйте иначе задать эти величины. Чтобы не было деления вообще.

Похоже, MQL4 вообще не любит операцию "/", и даже если деление задается и проводится корректно, то всё равно, зачастую,  без причины возвращается ошибка "zero divide"

Неоднократно с этим сталкивался!

Можете и вот сюда глянуть тож - Ошибка "zero divide".......... кто дурак????

Robertas
30
Robertas  
rid >>:


Скорее всего, ошибка возникает вот на этих действиях
double y =((x-x1)*(y2-y1)/(x2-x1))-x; // Функция описуваещая линию тренда UP
double y3 =((x-x13)*(y23-y13)/(x23-x13))-y13;


Попробуйте иначе задать эти величины. Чтобы не было деления вообще.

Похоже, MQL4 вообще не любит операцию "/", и даже если деление задается и проводится корректно, то всё равно, зачастую, без причины возвращается ошибка "zero divide"

Неоднократно с этим сталкивался!

Можете и вот сюда глянуть тож - Ошибка "zero divide".......... кто дурак????

Да похожи вы правы, в етом мести ошибка, беда в том что без зтой функции, все бесполезно... :/

Igor Malcev
1941
Igor Malcev  
fraktalas >>:

Да похожи вы правы, в етом мести ошибка, беда в том что без зтой функции, все бесполезно... :/


поставте перед делением условие проверки ноля, наподобии:

if((x2-x1)==0){return;}
и тогда не будет возникать ошибки.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий