Help - Zero Divide

[Deleted]  

Hi,

I'm triyng to write my first EA and I've already got the first part of it (entry points).

Unfortunately it gives me various Zero Divide errors in Journal.. :(

I'm around this error for days and getting crazy!!! :(

Can someone please take a look?

//+------------------------------------------------------------------+
//|                                               EXPERT STRUTCH.mq4 |
//|                                                          StRuTcH |
//|                                   http://www.xtb.pt/pt/forum-xtb |
//+------------------------------------------------------------------+
#property copyright "StRuTcH"
#property link      "http://www.xtb.pt/pt/forum-xtb"



// EXTERN PARAMETERS


   extern int PMA_FAST = 5;          // Periodo MA Rápida
   extern int PMA_SLOW = 50;         // Periodo MA lenta
   extern int MA_MODE = 0;           // 0=sma, 1=ema, 2=smma, 3=lwma
   extern int ADXPeriod=14;          // Periodo do ADX
   extern int ADX_START=20;          // Valor do ADX a partir do qual há negócio

   extern int DIST_EXT = 28;         // Periodo para suportes e resistencias dos stops
   extern double Risk_percent = 2;   // Risco máximo (em %) de cada negócio 
   extern double TakeProfit=100;     // TakeProfit definido p/ utilizador
  

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
//----

int ticket, total;

//--------------------------------------------------------------------------------------------------------------------------  

double DIF_ACT_PRIM  = (iMA(NULL,0,PMA_FAST,0,MA_MODE,0,0)-iMA(NULL,0,PMA_SLOW,0,MA_MODE,0,0));

int TREND_PRIMARIA = 0;

if (DIF_ACT_PRIM > 0)        TREND_PRIMARIA = 1; //up
   else
      {
      if(DIF_ACT_PRIM <= 0)  TREND_PRIMARIA = 2; //down
      }

//--------------------------------------------------------------------------------------------------------------------------  

int TREND_SECUNDARIA;
   
double DIF_ACT_SEC  = (iMA( NULL,0,PMA_FAST,0,MA_MODE,0,0)-iMA(NULL,0,PMA_SLOW,0,MA_MODE,0,0));
double DIF_PREV_SEC = (iMA( NULL,0,PMA_FAST,0,MA_MODE,0,1)-iMA(NULL,0,PMA_SLOW,0,MA_MODE,0,1));

if(DIF_ACT_SEC > DIF_PREV_SEC)TREND_SECUNDARIA = 1; //up
if(DIF_ACT_SEC < DIF_PREV_SEC)TREND_SECUNDARIA = 2; //down
      
//--------------------------------------------------------------------------------------------------------------------------  

double ADX = iADX(NULL,0,ADXPeriod,PRICE_CLOSE,MODE_MAIN,0);

//--------------------------------------------------------------------------------------------------------------------------  

double tickvalue = (MarketInfo(Symbol(),MODE_TICKVALUE))*10;

double STOP_HIGH = NormalizeDouble((iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,DIST_EXT,0))-Bid)/(Point*10),Digits);
double STOP_LOW = NormalizeDouble((Ask - iLow(NULL,0,iLowest(NULL,0,MODE_LOW,DIST_EXT,0)))/(Point*10),Digits);

double RESISTENCIA = NormalizeDouble(iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,DIST_EXT,0)),Digits);
double SUPORTE = NormalizeDouble(iLow(NULL,0,iLowest(NULL,0,MODE_LOW,DIST_EXT,0)),Digits);

double LotsDN = NormalizeDouble((AccountBalance()*Risk_percent/100)/((STOP_HIGH)*tickvalue),1);
double LotsUP = NormalizeDouble((AccountBalance()*Risk_percent/100)/((STOP_LOW)*tickvalue),1); 

//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------  


total = OrdersTotal();


if ( total<1 )
   {

// LONG BUY   
   if ( LotsUP>0.09 && TREND_PRIMARIA==1 && TREND_SECUNDARIA==1 && ADX > ADX_START)
      {
      ticket=OrderSend(Symbol(),OP_BUY,LotsUP,Ask,3,SUPORTE,Ask+TakeProfit*Point*10,"Ordem Longa",12345,0,Green);
      if(ticket>0)
         {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
         Print("ENTRADA LONGA AOS : ",OrderOpenPrice());
         }
         else Print("Error opening BUY order : ",GetLastError());
         return(0);
      }

// SHORT BUY     
   if ( LotsDN>0.09 && TREND_PRIMARIA==2 && TREND_SECUNDARIA==2 && ADX > ADX_START)
      {
      ticket=OrderSend(Symbol(),OP_SELL,LotsDN,Bid,3,RESISTENCIA,Bid-TakeProfit*Point*10,"Ordem Curta",12345,0,Red);
      if(ticket>0)
         {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
         Print("ENTRADA CURTA AOS : ",OrderOpenPrice());
         }
         else Print("Error opening BUY order : ",GetLastError());
         return(0);
      }
      return(0);
   }


//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Wherever you have a Division(/) make sure the expression on the right of the (/) sign cannot equal 0.
[Deleted]  

I only have those divisions in the EA:

double STOP_HIGH = NormalizeDouble((iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,DIST_EXT,0))-Bid) / (Point*10),Digits);
double STOP_LOW = NormalizeDouble((Ask - iLow(NULL,0,iLowest(NULL,0,MODE_LOW,DIST_EXT,0))) / (Point*10),Digits);

double LotsDN = NormalizeDouble((AccountBalance()*Risk_percent/100) / ((STOP_HIGH)*tickvalue),1);
double LotsUP = NormalizeDouble((AccountBalance()*Risk_percent/100) / ((STOP_LOW)*tickvalue),1);

I've tried to understand what is wrong but can't see no mistakes in that!!! :(:(:(

 

Example:

if( STOP_HIGH !=0 && tickvalue !=0 ){

double LotsDN = NormalizeDouble((AccountBalance()*Risk_percent/100) /

((STOP_HIGH)*tickvalue),1);

}

Since you already know all the divisions within the EA. Then Line Comment the OTHERS //--. Or /* ---- */.

And fix them One by One. And test em in Back-tester til you no longer see 0-Divide.

[Deleted]  

I will do that... than post here the results :)

Thanks ubzen

[Deleted]  

.

I've made what you've told me..

I found that the EA is given sometimes the ZeroDivision (not always... just a few separated times) because of the

/ (STOP_HIGH)*tickvalue

division. But I can't understand why!!!

I'll continue to break my head on this rock...

.

[Deleted]  

FOUND THE PROBLEM!!! :) :) :)

Sometimes the:

(iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,DIST_EXT,0))-Bid)

That is part of STOP_HIGH can be zero!!!

LOL.. Tester is always right!!

Thank you very much ubzen!! : )

 
Another happy customer. Welcome :)