iteration(code too large)

 

Please help me to solve my code, it is too large, I want to use 'i iteration' but I do not know how can I use it in my code

This is my code:

void CheckForOpen()
  {
   int    res;
   

////////////////////////////////////////
bool SellCandle1= iOpen(Symbol(),Period(),1)-iClose(Symbol(),Period(),1)>0;
bool BuyCandle1= iClose(Symbol(),Period(),1)-iOpen(Symbol(),Period(),1)>0;
bool SellCandle2= iOpen(Symbol(),Period(),2)-iClose(Symbol(),Period(),2)>0;
bool BuyCandle2= iClose(Symbol(),Period(),2)-iOpen(Symbol(),Period(),2)>0;
bool SellCandle3= iOpen(Symbol(),Period(),3)-iClose(Symbol(),Period(),3)>0;
bool BuyCandle3= iClose(Symbol(),Period(),3)-iOpen(Symbol(),Period(),3)>0;
////////////////////////////////////////

////////////////////////////////////////
bool CondBUY1= iOpen(Symbol(),Period(),7)-iClose(Symbol(),Period(),7)>0 
            && (((iClose(Symbol(),Period(),6)-iOpen(Symbol(),Period(),6)>0 && iOpen(Symbol(),Period(),7)>iOpen(Symbol(),Period(),5) && iOpen(Symbol(),Period(),7)>iOpen(Symbol(),Period(),4))
                  && (iClose(Symbol(),Period(),6)-iOpen(Symbol(),Period(),6)>0 && iOpen(Symbol(),Period(),7)>iClose(Symbol(),Period(),5) && iOpen(Symbol(),Period(),7)>iClose(Symbol(),Period(),4)))
                && ((iClose(Symbol(),Period(),6)-iOpen(Symbol(),Period(),6)>0 && iClose(Symbol(),Period(),7)<iOpen(Symbol(),Period(),5) && iClose(Symbol(),Period(),7)<iOpen(Symbol(),Period(),4))
                  && (iClose(Symbol(),Period(),6)-iOpen(Symbol(),Period(),6)>0 && iClose(Symbol(),Period(),7)<iClose(Symbol(),Period(),5) && iClose(Symbol(),Period(),7)<iClose(Symbol(),Period(),4))))
            && iOpen(Symbol(),Period(),7)<iClose(Symbol(),Period(),3);
            && iOpen(Symbol(),Period(),6)<iClose(Symbol(),Period(),3);
            
            
bool CondSELL1= iClose(Symbol(),Period(),7)-iOpen(Symbol(),Period(),7)>0 
            && (((iOpen(Symbol(),Period(),6)-iClose(Symbol(),Period(),6)>0 && iOpen(Symbol(),Period(),7)<iOpen(Symbol(),Period(),5) && iOpen(Symbol(),Period(),7)<iOpen(Symbol(),Period(),4))
                  && (iOpen(Symbol(),Period(),6)-iClose(Symbol(),Period(),6)>0 && iOpen(Symbol(),Period(),7)<iClose(Symbol(),Period(),5) && iOpen(Symbol(),Period(),7)<iClose(Symbol(),Period(),4)))
                && ((iOpen(Symbol(),Period(),6)-iClose(Symbol(),Period(),6)>0 && iClose(Symbol(),Period(),7)>iOpen(Symbol(),Period(),5) && iClose(Symbol(),Period(),7)>iOpen(Symbol(),Period(),4))
                  && (iOpen(Symbol(),Period(),6)-iClose(Symbol(),Period(),6)>0 && iClose(Symbol(),Period(),7)>iClose(Symbol(),Period(),5) && iClose(Symbol(),Period(),7)>iClose(Symbol(),Period(),4))))
            && iOpen(Symbol(),Period(),7)>iClose(Symbol(),Period(),3);
            
            double TP;
            double SL;
            if(CondBUY1){
                     if(iLow(Symbol(),Period(),7)<iLow(Symbol(),Period(),6)
                        && iLow(Symbol(),Period(),7)<iLow(Symbol(),Period(),5)
                        && iLow(Symbol(),Period(),7)<iLow(Symbol(),Period(),4)){
                        SL= iLow(Symbol(),Period(),7)-(StopLoss*_Point);
                        if(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),7))*fibo)/100>minimum*_Point){
                             TP=(iOpen(Symbol(),Period(),3))+(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),7))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))+(TakeProfit*Point);}
                        }
                     if(iLow(Symbol(),Period(),6)<iLow(Symbol(),Period(),7)
                        && iLow(Symbol(),Period(),6)<iLow(Symbol(),Period(),5)
                        && iLow(Symbol(),Period(),6)<iLow(Symbol(),Period(),4)){
                        SL= iLow(Symbol(),Period(),6)-(StopLoss*_Point);
                        if(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),6))*fibo)/100>minimum*_Point){
                             TP=(iOpen(Symbol(),Period(),3))+(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),6))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))+(TakeProfit*Point);}
                        }
                     if(iLow(Symbol(),Period(),5)<iLow(Symbol(),Period(),6)
                        && iLow(Symbol(),Period(),5)<iLow(Symbol(),Period(),7)
                        && iLow(Symbol(),Period(),5)<iLow(Symbol(),Period(),4)){
                        SL= iLow(Symbol(),Period(),5)-(StopLoss*_Point);
                        if(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),5))*fibo)/100>minimum*_Point){
                             TP=(iOpen(Symbol(),Period(),3))+(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),5))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))+(TakeProfit*Point);}
                        }
                     if(iLow(Symbol(),Period(),4)<iLow(Symbol(),Period(),6)
                        && iLow(Symbol(),Period(),4)<iLow(Symbol(),Period(),5)
                        && iLow(Symbol(),Period(),4)<iLow(Symbol(),Period(),7)){
                        SL= iLow(Symbol(),Period(),4)-(StopLoss*_Point);
                        if(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),4))*fibo)/100>minimum*_Point){
                             TP=(iOpen(Symbol(),Period(),3))+(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),4))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))+(TakeProfit*Point);}
                        }
                        else{
                        SL= iLow(Symbol(),Period(),7)-(StopLoss*_Point);
                        if(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),7))*fibo)/100>minimum*_Point){
                             TP=(iOpen(Symbol(),Period(),3))+(((iClose(Symbol(),Period(),3)-iLow(Symbol(),Period(),7))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))+(TakeProfit*Point);}}}
                       
            if(CondSELL1){
                     if(iHigh(Symbol(),Period(),7)>iHigh(Symbol(),Period(),6)
                        && iHigh(Symbol(),Period(),7)>iHigh(Symbol(),Period(),5)
                        && iHigh(Symbol(),Period(),7)>iHigh(Symbol(),Period(),4)){
                        SL= iHigh(Symbol(),Period(),7)+(StopLoss*_Point);
                        if(((iHigh(Symbol(),Period(),7)-iClose(Symbol(),Period(),3))*fibo)/100>minimum*_Point){
                           TP=(iOpen(Symbol(),Period(),3))-(((iHigh(Symbol(),Period(),7)-iClose(Symbol(),Period(),3))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))-(TakeProfit*Point);}
                        }
                     if(iHigh(Symbol(),Period(),6)>iHigh(Symbol(),Period(),7)
                        && iHigh(Symbol(),Period(),6)>iHigh(Symbol(),Period(),5)
                        && iHigh(Symbol(),Period(),6)>iHigh(Symbol(),Period(),4)){
                        SL= iHigh(Symbol(),Period(),6)+(StopLoss*_Point);
                        if(((iHigh(Symbol(),Period(),6)-iClose(Symbol(),Period(),3))*fibo)/100>minimum*_Point){
                           TP=(iOpen(Symbol(),Period(),3))-(((iHigh(Symbol(),Period(),6)-iClose(Symbol(),Period(),3))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))-(TakeProfit*Point);}
                        }
                     if(iHigh(Symbol(),Period(),5)>iHigh(Symbol(),Period(),6)
                        && iHigh(Symbol(),Period(),5)>iHigh(Symbol(),Period(),7)
                        && iHigh(Symbol(),Period(),5)>iHigh(Symbol(),Period(),4)){
                        SL= iHigh(Symbol(),Period(),5)+(StopLoss*_Point);
                        if(((iHigh(Symbol(),Period(),5)-iClose(Symbol(),Period(),3))*fibo)/100>minimum*_Point){
                           TP=(iOpen(Symbol(),Period(),3))-(((iHigh(Symbol(),Period(),5)-iClose(Symbol(),Period(),3))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))-(TakeProfit*Point);}
                        }
                     if(iHigh(Symbol(),Period(),4)>iHigh(Symbol(),Period(),6)
                        && iHigh(Symbol(),Period(),4)>iHigh(Symbol(),Period(),5)
                        && iHigh(Symbol(),Period(),4)>iHigh(Symbol(),Period(),7)){
                        SL= iHigh(Symbol(),Period(),4)+(StopLoss*_Point);
                        if(((iHigh(Symbol(),Period(),4)-iClose(Symbol(),Period(),3))*fibo)/100>minimum*_Point){
                           TP=(iOpen(Symbol(),Period(),3))-(((iHigh(Symbol(),Period(),4)-iClose(Symbol(),Period(),3))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))-(TakeProfit*Point);}
                        }
                        else{
                        SL= iHigh(Symbol(),Period(),7)+(StopLoss*_Point);
                        if(((iHigh(Symbol(),Period(),7)-iClose(Symbol(),Period(),3))*fibo)/100>minimum*_Point){
                           TP=(iOpen(Symbol(),Period(),3))-(((iHigh(Symbol(),Period(),7)-iClose(Symbol(),Period(),3))*fibo)/100);}
                        else{TP=(iOpen(Symbol(),Period(),3))-(TakeProfit*Point);}}}
       ///////////////////////////////////////////////////////////////
       
       
       // sell 10 Microlot 
       Open4= iOpen(Symbol(),Period(),6);
       Open5= iOpen(Symbol(),Period(),7);
       bool Buycandle=   iClose(Symbol(),Period(),1)-iOpen(Symbol(),Period(),1)>0
                      && iClose(Symbol(),Period(),2)-iOpen(Symbol(),Period(),2)>0
                      && iClose(Symbol(),Period(),3)-iOpen(Symbol(),Period(),3)>0;
       bool Sellcandle=  iOpen(Symbol(),Period(),1)-iClose(Symbol(),Period(),1)>0
                      && iOpen(Symbol(),Period(),2)-iClose(Symbol(),Period(),2)>0
                      && iOpen(Symbol(),Period(),3)-iClose(Symbol(),Period(),3)>0;
                      
                      
                      
////////////////////////////////////////
   
   //TIME FILTER
   string TradeStartTime = "03:30";
   string TradeStopTime = "23:00";
   //END TIME FILTER
   

//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
  //--- sell conditions
   if(TimeCurrent()>StrToTime(TradeStartTime) && TimeCurrent()<StrToTime(TradeStopTime))
     {
      if (CondSELL1 && Sellcandle) {
      res=OrderSend(Symbol(),OP_BUYSTOP,NormalizeLots(Lots,Symbol()),Open5+(15*Point),3,TP,SL,EA_Comment,MAGICMA,0,Red);
      }
      if (CondSELL2 && Sellcandle) {
      res=OrderSend(Symbol(),OP_BUYSTOP,NormalizeLots(Lots,Symbol()),Open4+(15*Point),3,TP,SL,EA_Comment,MAGICMA,0,Red);}
      return;
     }
     
     //--- buy conditions
   if(TimeCurrent()>StrToTime(TradeStartTime) && TimeCurrent()<StrToTime(TradeStopTime))
     {
      if (CondBUY1 && Buycandle){ 
      res=OrderSend(Symbol(),OP_SELLSTOP,NormalizeLots(Lots,Symbol()),Open5-(15*Point),3,TP,SL,EA_Comment,MAGICMA,0,Blue);}
      if (CondBUY2 && Buycandle){ 
      res=OrderSend(Symbol(),OP_SELLSTOP,NormalizeLots(Lots,Symbol()),Open4-(15*Point),3,TP,SL,EA_Comment,MAGICMA,0,Blue);}
      return;
     }
//---
  }
 
Documentation on MQL5: Event Handling
Documentation on MQL5: Event Handling
  • www.mql5.com
Event Handling - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
salitos #:

Why not use chart events?

https://www.mql5.com/en/docs/event_handlers

it is just the piece of source code that I can not solve
 
And you can use macro substitution (#define) to shorten your code: https://www.mql5.com/en/docs/basis/preprosessor/constant
Code debugging - Developing programs - MetaEditor Help
Code debugging - Developing programs - MetaEditor Help
  • www.metatrader5.com
MetaEditor has a built-in debugger allowing you to check a program execution step by step (by individual functions). Place breakpoints in the code...
 

Just for this condition...

bool CondBUY1= iOpen(Symbol(),Period(),7)-iClose(Symbol(),Period(),7)>0 
            && (((iClose(Symbol(),Period(),6)-iOpen(Symbol(),Period(),6)>0 && iOpen(Symbol(),Period(),7)>iOpen(Symbol(),Period(),5) && iOpen(Symbol(),Period(),7)>iOpen(Symbol(),Period(),4))
                  && (iClose(Symbol(),Period(),6)-iOpen(Symbol(),Period(),6)>0 && iOpen(Symbol(),Period(),7)>iClose(Symbol(),Period(),5) && iOpen(Symbol(),Period(),7)>iClose(Symbol(),Period(),4)))
                && ((iClose(Symbol(),Period(),6)-iOpen(Symbol(),Period(),6)>0 && iClose(Symbol(),Period(),7)<iOpen(Symbol(),Period(),5) && iClose(Symbol(),Period(),7)<iOpen(Symbol(),Period(),4))
                  && (iClose(Symbol(),Period(),6)-iOpen(Symbol(),Period(),6)>0 && iClose(Symbol(),Period(),7)<iClose(Symbol(),Period(),5) && iClose(Symbol(),Period(),7)<iClose(Symbol(),Period(),4))))
            && iOpen(Symbol(),Period(),7)<iClose(Symbol(),Period(),3);
            && iOpen(Symbol(),Period(),6)<iClose(Symbol(),Period(),3);

-Everything is combined with "and" (&&), so if one fails, CondBUY1 is false. You don't need to use parenthesis for that.

-There are a few parenthesis not properly closed and an extra ";".

-"close>open" is the same as saying "close-open>0", so there are a few repeated conditions

-You can make all that into a function, and invert the conditions to evaluate IF one fails (instead of mixing everything to get the result)

The result based on what you had (if I haven't missed anything):

bool CondBuy1(void)
{
   double open7 = iOpen(Symbol(),Period(),7);
   double open6 = iOpen(Symbol(),Period(),6);
   double open5 = iOpen(Symbol(),Period(),5);
   double open4 = iOpen(Symbol(),Period(),4);

   double close7 = iClose(Symbol(),Period(),7);
   double close6 = iClose(Symbol(),Period(),6);
   double close5 = iClose(Symbol(),Period(),5);
   double close4 = iClose(Symbol(),Period(),4);
   double close3 = iClose(Symbol(),Period(),3);

   if (open7<close7) return false;
   if (close6<open6) return false;
   if (open7<open5) return false;
   if (open7<open4) return false;
   //close6<open6 //Repeated condition
   //open7<close5 //Repeated condition
   //open7<close4 //Repeated condition
   //close6<open6 //Repeated condition
   if (close7>open5) return false;
   if (close7>open4) return false;
   //close6<open6 //Repeated condition
   if (close7>close5) return false;
   if (close7>close4) return false;
   if (open7>close3) return false;
   if (open6>close3) return false;

   return true; //If it gets to the end, every inversed condition is false, so CondBuy is true
}

And for the rest of the code... you'll need to do similar things, at least just to start to see what it even does

 
tolotra25:

Please help me to solve my code, it is too large, I want to use 'i iteration' but I do not know how can I use it in my code

This is my code:

bool SellCandle1= iOpen(Symbol(),Period(),1)-iClose(Symbol(),Period(),1)>0;
bool BuyCandle1= iClose(Symbol(),Period(),1)-iOpen(Symbol(),Period(),1)>0;
bool SellCandle2= iOpen(Symbol(),Period(),2)-iClose(Symbol(),Period(),2)>0;
bool BuyCandle2= iClose(Symbol(),Period(),2)-iOpen(Symbol(),Period(),2)>0;
bool SellCandle3= iOpen(Symbol(),Period(),3)-iClose(Symbol(),Period(),3)>0;
bool BuyCandle3= iClose(Symbol(),Period(),3)-iOpen(Symbol(),Period(),3)>0;
////////////////////////////////////////

Above can be replaced by creating just one functions.

bool Candle(int index){
  return (iOpen(Symbol(),Period(),index)-iClose(Symbol(),Period(),index)>0);
}

If Candle(3) return true, it means candle 3 is a sell candle, if it return false, it means candle 3 is a buy candle. Supply any candle number to the function that's all
 
Raphael Adetunji Olaiyapo #:
bool SellCandle1= iOpen(Symbol(),Period(),1)-iClose(Symbol(),Period(),1)>0;
bool BuyCandle1= iClose(Symbol(),Period(),1)-iOpen(Symbol(),Period(),1)>0;
bool SellCandle2= iOpen(Symbol(),Period(),2)-iClose(Symbol(),Period(),2)>0;
bool BuyCandle2= iClose(Symbol(),Period(),2)-iOpen(Symbol(),Period(),2)>0;
bool SellCandle3= iOpen(Symbol(),Period(),3)-iClose(Symbol(),Period(),3)>0;
bool BuyCandle3= iClose(Symbol(),Period(),3)-iOpen(Symbol(),Period(),3)>0;
////////////////////////////////////////

Above can be replaced by creating just one functions.

bool Candle(int index){
  return (iOpen(Symbol(),Period(),index)-iClose(Symbol(),Period(),index)>0);
}

If Candle(3) return true, it means candle 3 is a sell candle, if it return false, it means candle 3 is a buy candle. Supply any candle number to the function that's all

Instead of doing this:

 bool Candle(int index){
  return (iOpen(Symbol(),Period(),index)-iClose(Symbol(),Period(),index)>0);
} 

you could also do that:

bool _candle[];                    // boolean array declaration
int number = 7;                    // number of candles to look at

ArrayResize(candle,number);        // In an EA this goes into OnInit

   for(int i = 0; i < number; i++)   // I think that is also what my pre poster implicitly suggested...
     {
      _candle[i] = Candle(i);        // at each "i" the respective return of the Candle function is stored into its array field with index "i";
      }

// on global scope (outside OnTick):

bool Candle(int index)    {return(Open(i) - Close(i) < 0));}   // here is the Candle() function, nice and tidy

double Open(int index)    {return(iOpen(Symbol(), Period(), index));}    // replacing the hard to read functions 
double Close(int index)   {return(iClose(Symbol(), Period(), index));}   // index is just a place holder where the "i" is put in.
 
thanks for your help, it is ok now beacause of your help
 
tolotra25 #:
thanks for your help, it is ok now beacause of your help
Thank God
Reason: