MQL5 Multi currency big boss big candle ea

 //+------------------------------------------------------------------+

//|                             BigBossCandleAtrCalMulticurrency.mq5 |

//|                                  Copyright 2023, MetaQuotes Ltd. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2023, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

double ATR[];


#include <Trade\Trade.mqh>

CTrade trade;

datetime ExitTime;

enum stmode

  {

   BUY=1,

   SELL=2,

   BOTH=3,

  };

string stgmodes;

input ENUM_TIMEFRAMES Timeframe=0;

input stmode StrategyMode = BOTH;

input string TradeStartTime = "00:00";

input string TradeStopTime = "23:36";

input bool CandleClosing=false;

input bool useclosingpercentage=false;

input double closingpercentage=80;

input double CandleRange=14;

input double AveragingStep=14;

input double NumberOfTrades;

input double Quantity;

input string QtyCalType;

input double QuantityMultiplier;

input double RangePercentage;

input double StoplossStepLevel;

input double TargetRangePercentage;

input double MagicNumber;

input bool USESL;

input bool useRMS=true;

input double maxprofit;

input double maxloss;

input double PercentSqoffAccount;

double Ltp,quantity, Sl_Val,updated_high,updated_low,perval,fixed_low_sell,fixed_high_buy,range,NextOrderQty;

string InitialTrade= NULL,check= NULL,orderlog=NULL;

bool ActivateSl=false,EAActivated=false,tradingenable=true;


struct SymbolData

  {

   string            symbol;           // Symbol name

   double            last_close_price; // Last close price

   double            low;

   double            high;

   double            open;

   double            close;

   double            range;

   double            diff_to_high;

   double            diff_to_low;

   double            atr;

   double            candlerange;

   double            averagingstep;

   bool              rangecondition;

   string            InitialTrade;

   double            AveragingStepCount;

   double            NextTradeVal;

   double            quantity;

   double            NextOrderQty;

   double            updated_high;

   double            fixed_low_sell;

   double            previous_target_val;

   double            perval;

   double            target_val;

   double            Sl_Val;

   bool              ActivateSl;

   datetime          ExitTime;

   double            updated_low;

   double            fixed_high_buy ;

  };


SymbolData symbolDataArray[];

//| Expert initialization function                                   |

//+------------------------------------------------------------------+


//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

int OnInit()

  {

//---

   quantity=Quantity;

   string symbols[] = {"EURUSD","USDCHF","GBPUSD","USDJPY","AUDUSD"};

   ArrayResize(symbolDataArray, ArraySize(symbols));

   for(int i = 0; i < ArraySize(symbols); i++)

     {

      symbolDataArray[i].symbol = symbols[i];

      symbolDataArray[i].InitialTrade = "NOTTAKEN";

      symbolDataArray[i].quantity=Quantity;

      symbolDataArray[i].rangecondition=false;

      symbolDataArray[i].ActivateSl=false;

     }

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---


  }

//| Expert tick function                                             |

//+------------------------------------------------------------------+


double percentagevalue;

double mtm,combined_pnl,low,high,close,diff_to_high,diff_to_low,NextTradeVal,target_val,previous_target_val,open;

double crange,bodysize;

int AveragingStepCount=0;





int currentday=0;

bool IsNewDay()

  {


   MqlDateTime time1,time2;

   TimeToStruct(iTime(Symbol(),PERIOD_D1,0),time1);

   TimeToStruct(iTime(Symbol(),PERIOD_D1,1),time2);




   int today=time1.day,yesterday=time2.day;

//  Alert("today: "+today+"yesterday: "+yesterday+"currentday: "+currentday);



   if(currentday!=today)

     {


      //    Alert("Oce running");

      currentday=today;

      return true;



     }


   return false;


  }



//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+


double total,accbal,desiredper;



void OnTick()

  {



   if(StrategyMode==BOTH)

     {

      stgmodes="BOTH";

     }

   else

      if(StrategyMode==BUY)

        { stgmodes="BUY";}

      else

         if(StrategyMode==SELL)

           { stgmodes="SELL";}

           

   

   

   

   



   mtm=AccountInfoDouble(ACCOUNT_PROFIT);

   

   

  



   for(int i = 0; i < ArraySize(symbolDataArray); i++)

     {

      if(useRMS==true)

        {

         if(mtm>maxprofit && maxprofit>0)

           {

            tradingenable=false;

            close_all_sell_position();

            symbolDataArray[i].rangecondition=false;

            symbolDataArray[i].quantity=Quantity;

            symbolDataArray[i].InitialTrade = "NOTTAKEN";

            symbolDataArray[i].target_val = 0;

            symbolDataArray[i].Sl_Val = 0;

            symbolDataArray[i].AveragingStepCount = 0;

            symbolDataArray[i].updated_low = 0;

            symbolDataArray[i].fixed_high_buy = 0;

            symbolDataArray[i].updated_high = 0;

            symbolDataArray[i].fixed_low_sell = 0;

            close_all_buy_position();

            Alert("Max profit acheived closing all position");

           }


         if(mtm<maxloss && maxloss<0)

           {

            tradingenable=false;

            close_all_sell_position();

            close_all_buy_position();

            symbolDataArray[i].quantity=Quantity;

            symbolDataArray[i].InitialTrade = "NOTTAKEN";

            symbolDataArray[i].target_val = 0;

            symbolDataArray[i].Sl_Val = 0;

            symbolDataArray[i].AveragingStepCount = 0;

            symbolDataArray[i].updated_low = 0;

            symbolDataArray[i].fixed_high_buy = 0;

            symbolDataArray[i].updated_high = 0;

            symbolDataArray[i].fixed_low_sell = 0;

            symbolDataArray[i].rangecondition=false;

            Alert("Max loss acheived closing all position");

           }




        }



     }

   if(IsNewDay()==true)

     {


      tradingenable=true;

      Alert("Day changed we can take new trades");


     }




   if(TimeCurrent()>StringToTime(TradeStartTime) && TimeCurrent()<StringToTime(TradeStopTime))

     {

      EAActivated = true;

     }

   else

     {

      EAActivated = false;

     }


   if(EAActivated == true)

     {

      check="Trading enabled";

     }

   if(EAActivated == false)

     {

      check="Trading Disabled";

     }

     

     

     

     

      if (PercentSqoffAccount>0){

   

   total=mtm+ Today_Closed_Profit() ;

   accbal=AccountInfoDouble(ACCOUNT_BALANCE);

   desiredper=accbal*PercentSqoffAccount*0.01;

   

 

   

   

   if (total>=desiredper){

   

   close_all_sell_position();

   close_all_buy_position();

   Alert("No more trsdes will be taken today ");

   EAActivated = false;

  

   }

   

   

   }


   for(int i = 0; i < ArraySize(symbolDataArray); i++)

     {

      symbolDataArray[i].last_close_price = iClose(symbolDataArray[i].symbol, Timeframe, 0);

      int atrval=iATR(symbolDataArray[i].symbol,Timeframe,CandleRange);


      ArraySetAsSeries(ATR,true);

      CopyBuffer(atrval,0,0,3,ATR);



      if(CandleClosing==false)

        {

         symbolDataArray[i].atr=ATR[0];

         symbolDataArray[i].candlerange=ATR[0];

         symbolDataArray[i].averagingstep=ATR[0];

         symbolDataArray[i].low=  iLow(symbolDataArray[i].symbol,Timeframe,0);

         symbolDataArray[i].high= iHigh(symbolDataArray[i].symbol,Timeframe,0);

         symbolDataArray[i].open= iOpen(symbolDataArray[i].symbol,Timeframe,0);

         symbolDataArray[i].close= iClose(symbolDataArray[i].symbol,Timeframe,0);


         symbolDataArray[i].range=symbolDataArray[i].high-symbolDataArray[i].low;

         symbolDataArray[i].diff_to_high=symbolDataArray[i].close - symbolDataArray[i].high;

         symbolDataArray[i].diff_to_high =MathAbs(symbolDataArray[i].diff_to_high);

         symbolDataArray[i].diff_to_low=symbolDataArray[i].close - symbolDataArray[i].low;

         symbolDataArray[i].diff_to_low =MathAbs(symbolDataArray[i].diff_to_low);

        }


      if(CandleClosing==true)

        {

         symbolDataArray[i].atr=ATR[1];

         symbolDataArray[i].candlerange=ATR[1];

         symbolDataArray[i].averagingstep=ATR[1];

         symbolDataArray[i].low= iLow(symbolDataArray[i].symbol,Timeframe,1);

         symbolDataArray[i].high= iHigh(symbolDataArray[i].symbol,Timeframe,1);

         symbolDataArray[i].close= iClose(symbolDataArray[i].symbol,Timeframe,1);

         symbolDataArray[i].open= iOpen(symbolDataArray[i].symbol,Timeframe,1);

         symbolDataArray[i].range=symbolDataArray[i].high-symbolDataArray[i].low;

         symbolDataArray[i].diff_to_high=symbolDataArray[i].close - symbolDataArray[i].high;

         symbolDataArray[i].diff_to_high =MathAbs(symbolDataArray[i].diff_to_high);

         symbolDataArray[i].diff_to_low=symbolDataArray[i].close - symbolDataArray[i].low;

         symbolDataArray[i].diff_to_low =MathAbs(symbolDataArray[i].diff_to_low);

        }

     }


   for(int i = 0; i < ArraySize(symbolDataArray); i++)

     {


      if(useclosingpercentage==true&& CandleClosing==true)

        {

         if(iClose(symbolDataArray[i].symbol,Timeframe,1) > iOpen(symbolDataArray[i].symbol,Timeframe,1))

           {


            crange=0;

            bodysize=0;

            percentagevalue=0;

            crange=iHigh(symbolDataArray[i].symbol,Timeframe,1)-iLow(symbolDataArray[i].symbol,Timeframe,1);

            bodysize=iClose(symbolDataArray[i].symbol,Timeframe,1)-iOpen(symbolDataArray[i].symbol,Timeframe,1);

            percentagevalue= crange*closingpercentage*0.01;

            if(symbolDataArray[i].rangecondition==false&&bodysize>=percentagevalue&&crange>symbolDataArray[i].candlerange)

              {


               symbolDataArray[i].rangecondition=true;


              }


           }

         if(iClose(symbolDataArray[i].symbol,Timeframe,1)<iOpen(symbolDataArray[i].symbol,Timeframe,1))

           {


            crange=0;

            bodysize=0;

            percentagevalue=0;

            crange=iHigh(symbolDataArray[i].symbol,Timeframe,1)-iLow(symbolDataArray[i].symbol,Timeframe,1);

            bodysize=iOpen(symbolDataArray[i].symbol,Timeframe,1)-iClose(symbolDataArray[i].symbol,Timeframe,1);

            percentagevalue= crange*closingpercentage*0.01;

            if(symbolDataArray[i].rangecondition==false&&bodysize>=percentagevalue&&crange>symbolDataArray[i].candlerange)

              {


               symbolDataArray[i].rangecondition=true;


              }

           }


        }


      if(useclosingpercentage==false)

        {

         symbolDataArray[i].rangecondition=true;

        }


     }




   for(int i = 0; i < ArraySize(symbolDataArray); i++)

     {


      if(

         symbolDataArray[i].rangecondition==true&&

         tradingenable==true&&

         symbolDataArray[i].range >= symbolDataArray[i].candlerange &&

         symbolDataArray[i].InitialTrade == "NOTTAKEN" &&

         symbolDataArray[i].diff_to_high < symbolDataArray[i].diff_to_low && EAActivated == true&&

         symbolDataArray[i].ExitTime != iTime(symbolDataArray[i].symbol,Timeframe,0) &&

         (stgmodes=="BOTH" || stgmodes=="SELL")

      )

        {

         symbolDataArray[i].InitialTrade = "SHORT";

         symbolDataArray[i].AveragingStepCount = symbolDataArray[i].AveragingStepCount + 1;

         symbolDataArray[i].NextTradeVal = symbolDataArray[i].close + symbolDataArray[i].averagingstep;

         symbolDataArray[i].quantity=Quantity;

         if(CandleClosing==true)

           {

            symbolDataArray[i].NextTradeVal = symbolDataArray[i].high + symbolDataArray[i].averagingstep;

           }

         if(QtyCalType=="MUL")

           { symbolDataArray[i].NextOrderQty = symbolDataArray[i].quantity * QuantityMultiplier;}

         if(QtyCalType=="ADD")

           {  symbolDataArray[i].NextOrderQty =symbolDataArray[i].quantity +QuantityMultiplier;}


         symbolDataArray[i].updated_high = symbolDataArray[i].high;

         symbolDataArray[i].fixed_low_sell = symbolDataArray[i].low;


         symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_high;

         symbolDataArray[i].perval= symbolDataArray[i].updated_high- symbolDataArray[i].fixed_low_sell;


         Alert("perval: "+symbolDataArray[i].perval+" updated_high: "+symbolDataArray[i].updated_high+" updated_low: "+symbolDataArray[i].updated_low);


         if(StoplossStepLevel>0)

           {

            symbolDataArray[i].Sl_Val=StoplossStepLevel*AveragingStep;

            symbolDataArray[i].Sl_Val=SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_BID)+symbolDataArray[i].Sl_Val;

           }

         symbolDataArray[i].target_val = symbolDataArray[i].perval * TargetRangePercentage * 0.01;

         symbolDataArray[i].target_val = symbolDataArray[i].updated_high - symbolDataArray[i].target_val;

         orderlog = "Initial Short order executed @ "+symbolDataArray[i].symbol+"for lotsize="+symbolDataArray[i].quantity+

         ",Step = "+symbolDataArray[i].AveragingStepCount+",Target1 = "+symbolDataArray[i].target_val+

         ",Sl_Val= "+symbolDataArray[i].Sl_Val+"Previous candle check time: "+iTime(symbolDataArray[i].symbol,Timeframe,1)+"diff_to_high: "+symbolDataArray[i].diff_to_high +"diff_to_low:"+symbolDataArray[i].diff_to_low;

         Alert(orderlog);

         trade.Sell(symbolDataArray[i].quantity,symbolDataArray[i].symbol,NormalizeDouble(SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_BID),_Digits),0,0,"Sell backtest order");

         

        }



      if(symbolDataArray[i].rangecondition==true&&

         tradingenable==true&&

         symbolDataArray[i].range >= symbolDataArray[i].candlerange &&

         symbolDataArray[i].InitialTrade == "NOTTAKEN" &&

         symbolDataArray[i].diff_to_high > symbolDataArray[i].diff_to_low &&

         EAActivated == true&&

         symbolDataArray[i].ExitTime != iTime(symbolDataArray[i].symbol,Timeframe,0)&&

         (stgmodes=="BOTH" || stgmodes=="BUY")

        )

        {

         symbolDataArray[i].InitialTrade = "BUY";

         symbolDataArray[i].AveragingStepCount = symbolDataArray[i].AveragingStepCount + 1;

         symbolDataArray[i].NextTradeVal = symbolDataArray[i].close - symbolDataArray[i].averagingstep;

         quantity=Quantity;

         if(CandleClosing==true)

           {

            symbolDataArray[i].NextTradeVal = symbolDataArray[i].low - symbolDataArray[i].averagingstep;

           }

         if(QtyCalType=="MUL")

           { symbolDataArray[i].NextOrderQty = symbolDataArray[i].quantity * QuantityMultiplier;}

         if(QtyCalType=="ADD")

           {  symbolDataArray[i].NextOrderQty =symbolDataArray[i].quantity +QuantityMultiplier;}

         if(StoplossStepLevel>0)

           {

            symbolDataArray[i].Sl_Val=StoplossStepLevel*AveragingStep;

            symbolDataArray[i].Sl_Val=SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_ASK)-symbolDataArray[i].Sl_Val;

           }

         symbolDataArray[i].updated_low= symbolDataArray[i].low;

         symbolDataArray[i].fixed_high_buy = symbolDataArray[i].high;

         symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_low;

         symbolDataArray[i].perval=symbolDataArray[i].fixed_high_buy - symbolDataArray[i].updated_low;

         Alert("perval: "+symbolDataArray[i].perval+" updated_high: "+symbolDataArray[i].updated_high+" updated_low: "+symbolDataArray[i].updated_low);

         symbolDataArray[i].target_val= symbolDataArray[i].perval * TargetRangePercentage * 0.01;

         symbolDataArray[i].target_val = symbolDataArray[i].updated_low+ symbolDataArray[i].target_val;

         orderlog = "Initial Buy order executed @ "+symbolDataArray[i].symbol+"for lotsize="+symbolDataArray[i].quantity+

         ",Step = "+symbolDataArray[i].AveragingStepCount+",Target1 = "+symbolDataArray[i].target_val+

         ",Sl_Val= "+symbolDataArray[i].Sl_Val+"Previous candle check time: "+iTime(symbolDataArray[i].symbol,Timeframe,1)+"diff_to_high: "+symbolDataArray[i].diff_to_high +"diff_to_low:"+symbolDataArray[i].diff_to_low;

         Alert(orderlog);

         trade.Buy(symbolDataArray[i].quantity,symbolDataArray[i].symbol,NormalizeDouble(SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_ASK),_Digits),0,0,"Buy backtest order");

        

        }


      if(

         tradingenable==true&&

         symbolDataArray[i].InitialTrade == "BUY" &&

         symbolDataArray[i].close <= symbolDataArray[i].NextTradeVal &&

         symbolDataArray[i].NextTradeVal > 0 &&

         symbolDataArray[i].AveragingStepCount < NumberOfTrades&&symbolDataArray[i].ExitTime != iTime(symbolDataArray[i].symbol,Timeframe,0)

      )

        {

         symbolDataArray[i].AveragingStepCount = symbolDataArray[i].AveragingStepCount + 1;

         symbolDataArray[i].NextTradeVal = symbolDataArray[i].close - symbolDataArray[i].averagingstep;

         if(CandleClosing==true)

           {

            symbolDataArray[i].NextTradeVal = symbolDataArray[i].low - symbolDataArray[i].averagingstep;

           }

         symbolDataArray[i].quantity= symbolDataArray[i].NextOrderQty;

         if(QtyCalType == "MUL")

           { symbolDataArray[i].NextOrderQty = symbolDataArray[i].quantity * QuantityMultiplier;}

         if(QtyCalType == "ADD")

           { symbolDataArray[i].NextOrderQty= symbolDataArray[i].quantity + QuantityMultiplier;}

         symbolDataArray[i].updated_low = symbolDataArray[i].low;

         symbolDataArray[i].previous_target_val= symbolDataArray[i].updated_low;

         symbolDataArray[i].perval = symbolDataArray[i].fixed_high_buy - symbolDataArray[i].updated_low;

         Alert("perval: "+symbolDataArray[i].perval+" symbolDataArray[i].updated_high: "+updated_high+" symbolDataArray[i].updated_low: "+updated_low);

         symbolDataArray[i].target_val = symbolDataArray[i].perval* TargetRangePercentage* 0.01;

         symbolDataArray[i].target_val = symbolDataArray[i].updated_low +symbolDataArray[i].target_val;

         if(symbolDataArray[i].AveragingStepCount == NumberOfTrades)

           {

            symbolDataArray[i].ActivateSl = false;

            //   Sl_Val = close - AveragingStep;

           }

         orderlog = "Buy order executed @ "+symbolDataArray[i].symbol+"for lotsize="+symbolDataArray[i].quantity+",Step = "+symbolDataArray[i].AveragingStepCount+",Target1 = "+symbolDataArray[i].target_val;

         Alert(orderlog);

         trade.Buy(symbolDataArray[i].quantity,symbolDataArray[i].symbol,NormalizeDouble(SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_ASK),_Digits),0,0,"Buy backtest order");

       

        }


      if(

         tradingenable==true&&symbolDataArray[i].InitialTrade == "SHORT" &&

         symbolDataArray[i].close >= symbolDataArray[i].NextTradeVal &&

         symbolDataArray[i].NextTradeVal > 0 &&

         symbolDataArray[i].AveragingStepCount < NumberOfTrades&&symbolDataArray[i].ExitTime != iTime(symbolDataArray[i].symbol,Timeframe,0)

      )



        {

         Alert("Atempt sell order");

         symbolDataArray[i].AveragingStepCount = AveragingStepCount + 1;

         symbolDataArray[i].NextTradeVal = symbolDataArray[i].close + AveragingStep;

         if(CandleClosing==true)

           {

            symbolDataArray[i].NextTradeVal = symbolDataArray[i].high + symbolDataArray[i].averagingstep;

           }

         symbolDataArray[i].quantity=symbolDataArray[i].NextOrderQty;

         if(QtyCalType== "MUL")

           {symbolDataArray[i].NextOrderQty = symbolDataArray[i].quantity * QuantityMultiplier;}

         if(QtyCalType== "ADD")

           { symbolDataArray[i].NextOrderQty =symbolDataArray[i].quantity +QuantityMultiplier;}

         symbolDataArray[i].updated_high= symbolDataArray[i].high;

         symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_high;

         symbolDataArray[i].perval= symbolDataArray[i].updated_high- symbolDataArray[i].fixed_low_sell;

         Alert("perval: "+symbolDataArray[i].perval+" updated_high: "+symbolDataArray[i].updated_high+" updated_low: "+symbolDataArray[i].updated_low);

         symbolDataArray[i].target_val = symbolDataArray[i].perval* TargetRangePercentage * 0.01;

         symbolDataArray[i].target_val = symbolDataArray[i].updated_high-target_val;

         if(symbolDataArray[i].AveragingStepCount == NumberOfTrades)

           {

            symbolDataArray[i].ActivateSl = false;

            //    Sl_Val = close + AveragingStep;

           }


         orderlog = "Short order executed @ "+symbolDataArray[i].symbol+"for lotsize="+symbolDataArray[i].quantity+",Step = "+symbolDataArray[i].AveragingStepCount+",Target1 = "+symbolDataArray[i].target_val;

         Alert(orderlog);

         trade.Sell(symbolDataArray[i].quantity,symbolDataArray[i].symbol,NormalizeDouble(SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_BID),_Digits),0,0,"Sell backtest order");

        

        }


      ///---#   target calculation


      if(symbolDataArray[i].InitialTrade == "SHORT")

        {

         symbolDataArray[i].updated_high = takeprofit_calculation(symbolDataArray[i].high,symbolDataArray[i].InitialTrade,

                                           symbolDataArray[i].previous_target_val);

         symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_high;

         symbolDataArray[i].perval = symbolDataArray[i].updated_high- symbolDataArray[i].fixed_low_sell;

         // Alert("perval: "+perval+" updated_high: "+updated_high+" updated_low: "+updated_low);

         symbolDataArray[i].target_val = symbolDataArray[i].perval * TargetRangePercentage * 0.01;

         symbolDataArray[i].target_val = symbolDataArray[i].updated_high - symbolDataArray[i].target_val;

      

        }

      if(InitialTrade== "BUY")

        {

         symbolDataArray[i].updated_low = takeprofit_calculation(symbolDataArray[i].low, symbolDataArray[i].InitialTrade,

                                          symbolDataArray[i].previous_target_val);

         symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_low;

         symbolDataArray[i].perval = symbolDataArray[i].fixed_high_buy - symbolDataArray[i].updated_low;

         //   Alert("perval: "+perval+" updated_high: "+updated_high+" updated_low: "+updated_low);

         symbolDataArray[i].target_val = symbolDataArray[i].perval * TargetRangePercentage * 0.01;

         symbolDataArray[i].target_val= symbolDataArray[i].updated_low +symbolDataArray[i].target_val;


        }

      //        target and stoploss execution

      if(

         symbolDataArray[i].InitialTrade == "SHORT" &&

         symbolDataArray[i].last_close_price >=symbolDataArray[i].Sl_Val &&

         symbolDataArray[i].Sl_Val > 0 &&USESL==true

      )

        {

         symbolDataArray[i].rangecondition=false;

         orderlog = "Stoploss Executed For Short Trade All Position Exited @ "+symbolDataArray[i].symbol+"@ price"+ symbolDataArray[i].close+", high:"+symbolDataArray[i].updated_high+", low="+ symbolDataArray[i].fixed_low_sell;

         Alert(orderlog);

         symbolDataArray[i].InitialTrade = "NOTTAKEN";

         symbolDataArray[i].target_val = 0;

         symbolDataArray[i].Sl_Val = 0;

         symbolDataArray[i].quantity = Quantity;

         ExitTime = iTime(symbolDataArray[i].symbol,Timeframe,0);

         symbolDataArray[i].AveragingStepCount = 0;

         symbolDataArray[i].updated_low = 0;

         symbolDataArray[i].fixed_high_buy = 0;

         symbolDataArray[i].updated_high = 0;

         symbolDataArray[i].fixed_low_sell = 0;

         close_sell_position(symbolDataArray[i].symbol);

      


        }


      if(

         symbolDataArray[i].InitialTrade == "SHORT" &&

         symbolDataArray[i].last_close_price <=symbolDataArray[i].target_val &&

         symbolDataArray[i].target_val > 0

      )

        {

         symbolDataArray[i].rangecondition=false;

         orderlog = "Target Executed For Short Trade All Position Exited @ "+symbolDataArray[i].symbol+"@ price"+ symbolDataArray[i].close+", high:"+symbolDataArray[i].updated_high+", low="+ symbolDataArray[i].fixed_low_sell;

         Alert(orderlog);

         symbolDataArray[i].InitialTrade = "NOTTAKEN";

         symbolDataArray[i].target_val = 0;

         symbolDataArray[i].Sl_Val = 0;

         symbolDataArray[i].quantity = Quantity;

         symbolDataArray[i].ExitTime = iTime(symbolDataArray[i].symbol,Timeframe,0);

         symbolDataArray[i].AveragingStepCount = 0;

         symbolDataArray[i].updated_low = 0;

         symbolDataArray[i].fixed_high_buy = 0;

         symbolDataArray[i].updated_high = 0;

         symbolDataArray[i].fixed_low_sell = 0;

         close_sell_position(symbolDataArray[i].symbol);

       

        }



      if(

         symbolDataArray[i].InitialTrade== "BUY" &&

         symbolDataArray[i].last_close_price <= symbolDataArray[i].Sl_Val &&

         symbolDataArray[i].Sl_Val > 0&&USESL==true

      )

        {

         symbolDataArray[i].rangecondition=false;

         symbolDataArray[i].InitialTrade = "NOTTAKEN";

         symbolDataArray[i].target_val = 0;

         symbolDataArray[i].Sl_Val = 0;

         orderlog = "Stoploss Executed For Buy Trade All Position Exited @ "+symbolDataArray[i].symbol+"@ price"+ symbolDataArray[i].close+", high:"+symbolDataArray[i].updated_high+", low="+ symbolDataArray[i].fixed_low_sell;

         Alert(orderlog);

         symbolDataArray[i].ExitTime = iTime(symbolDataArray[i].symbol,Timeframe,0);

         symbolDataArray[i].AveragingStepCount= 0;

         symbolDataArray[i].quantity = Quantity;

         symbolDataArray[i].updated_low = 0;

         symbolDataArray[i].fixed_high_buy= 0;

         symbolDataArray[i].updated_high= 0;

         symbolDataArray[i].fixed_low_sell = 0;

         close_buy_position(symbolDataArray[i].symbol);

        

        }




      if(

         symbolDataArray[i].InitialTrade== "BUY" &&

         symbolDataArray[i].last_close_price >= symbolDataArray[i].target_val &&

         symbolDataArray[i].target_val > 0

      )

        {

         symbolDataArray[i].InitialTrade = "NOTTAKEN";

         symbolDataArray[i].target_val = 0;

         symbolDataArray[i].Sl_Val = 0;

         symbolDataArray[i].rangecondition=false;

         orderlog = "Target Executed For Buy Trade All Position Exited @ "+symbolDataArray[i].symbol+"@ price"+ symbolDataArray[i].close+", high:"+symbolDataArray[i].updated_high+", low="+ symbolDataArray[i].fixed_low_sell;

         Alert(orderlog);

         symbolDataArray[i].ExitTime = iTime(symbolDataArray[i].symbol,Timeframe,0);

         symbolDataArray[i].AveragingStepCount= 0;

         symbolDataArray[i].quantity = Quantity;

         symbolDataArray[i].updated_low = 0;

         symbolDataArray[i].fixed_high_buy= 0;

         symbolDataArray[i].updated_high= 0;

         symbolDataArray[i].fixed_low_sell = 0;

         close_buy_position(symbolDataArray[i].symbol);

         

        }



      //---Main for loop

      //---

     }

//  PrintSymbolDataArray();

  }


//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+






//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void PrintSymbolDataArray()

  {




   for(int i = 0; i < ArraySize(symbolDataArray); i++)

     {

      Print("Symbol: ", symbolDataArray[i].symbol,

            ", Ltp: ", DoubleToString(symbolDataArray[i].last_close_price, 5),

            ", low: ", DoubleToString(symbolDataArray[i].low, 5),

            ", high: ", DoubleToString(symbolDataArray[i].high, 5),

            ", open: ", DoubleToString(symbolDataArray[i].open, 5),

            ", close: ", DoubleToString(symbolDataArray[i].close, 5),

            ", range: ", DoubleToString(symbolDataArray[i].range, 5),

            ", diff_to_high: ", DoubleToString(symbolDataArray[i].diff_to_high, 5),

            ", diff_to_low: ", DoubleToString(symbolDataArray[i].diff_to_low, 5),

            ", atr: ", DoubleToString(symbolDataArray[i].atr, 5),

            ", candlerange: ", DoubleToString(symbolDataArray[i].candlerange, 5),

            ", averagingstep: ", DoubleToString(symbolDataArray[i].averagingstep, 5),

            ", rangecondition: ", symbolDataArray[i].rangecondition,

            ", InitialTrade: ", symbolDataArray[i].InitialTrade,

            ", AveragingStepCount: ", DoubleToString(symbolDataArray[i].AveragingStepCount, 5),

            ", NextTradeVal: ", DoubleToString(symbolDataArray[i].NextTradeVal, 5),

            ", quantity: ", DoubleToString(symbolDataArray[i].quantity, 5),

            ", NextOrderQty: ", DoubleToString(symbolDataArray[i].NextOrderQty, 5),

            ", updated_high: ", DoubleToString(symbolDataArray[i].updated_high, 5),

            ", fixed_low_sell: ", DoubleToString(symbolDataArray[i].fixed_low_sell, 5),

            ", previous_target_val: ", DoubleToString(symbolDataArray[i].previous_target_val, 5),

            ", Sl_Val: ", DoubleToString(symbolDataArray[i].Sl_Val, 5),

            ", ActivateSl: ", symbolDataArray[i].ActivateSl,

            ", perval: ", DoubleToString(symbolDataArray[i].perval, 5),

            ", target_val: ", DoubleToString(symbolDataArray[i].target_val, 5),

            ", ExitTime: ", DoubleToString(symbolDataArray[i].ExitTime, 5),

            ", updated_low: ", DoubleToString(symbolDataArray[i].updated_low, 5),

            ", fixed_high_buy: ", DoubleToString(symbolDataArray[i].fixed_high_buy, 5)

           );

     }

  }




//+------------------------------------------------------------------+

void close_sell_position(string sym)

  {


   for(int i = 0; i < ArraySize(symbolDataArray); i++)

     {



      for(int i=PositionsTotal()-1; i>=0; i--)

        {

         string currencypair=PositionGetSymbol(i);

         int position_direction=PositionGetInteger(POSITION_TYPE);

         if(currencypair==sym && position_direction == POSITION_TYPE_SELL)

           {

            int ticket=PositionGetTicket(i);

            trade.PositionClose(ticket);

           }

        }


     }

  }


//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+



//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+





double  takeprofit_calculation(double updated_price, string tradetype,double previous_target_value)

  {

   if(tradetype == "SHORT")

     {

      if(updated_price >= previous_target_value)

        {previous_target_value = updated_price;}

     }

   if(tradetype == "BUY")

     {

      if(updated_price <= previous_target_value)

        {

         previous_target_value = updated_price;

         return previous_target_value;

        }

     }


   return previous_target_value;

  }


//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void close_buy_position(string sym)

  {

   for(int i = 0; i < ArraySize(symbolDataArray); i++)

     {

      for(int i=PositionsTotal()-1; i>=0; i--)

        {

         string currencypair=PositionGetSymbol(i);

         int position_direction=PositionGetInteger(POSITION_TYPE);

         if(currencypair==sym && position_direction == POSITION_TYPE_BUY)

           {

            int ticket=PositionGetTicket(i);

            trade.PositionClose(ticket);

           }

        }


     }

  }

//+------------------------------------------------------------------+

void close_all_sell_position()

  {

   for(int i=PositionsTotal()-1; i>=0; i--)

     {

      string currencypair=PositionGetSymbol(i);

      int position_direction=PositionGetInteger(POSITION_TYPE);


        {

         int ticket=PositionGetTicket(i);

         trade.PositionClose(ticket);

        }

     }

  }


//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void close_all_buy_position()

  {

   for(int i=PositionsTotal()-1; i>=0; i--)

     {

      string currencypair=PositionGetSymbol(i);

      int position_direction=PositionGetInteger(POSITION_TYPE);


        {

         int ticket=PositionGetTicket(i);

         trade.PositionClose(ticket);

        }

     }

  }

//+------------------------------------------------------------------+

double Today_Closed_Profit() 

   MqlDateTime SDateTime;

   TimeToStruct(TimeCurrent(),SDateTime);


   SDateTime.hour=0;

   SDateTime.min=0;

   SDateTime.sec=0;

   datetime  from_date=StructToTime(SDateTime);     // From date


   SDateTime.hour=23;

   SDateTime.min=59;

   SDateTime.sec=59;

   datetime  to_date=StructToTime(SDateTime);     // To date

   to_date+=60*60*24;


   HistorySelect(from_date,to_date);

   int trades_of_day=0;

   double wining_trade=0.0;

   double losing_trade=0.0;

   double total_profit=0.0;

   uint total=HistoryDealsTotal();

   ulong    ticket=0;

//--- for all deals

   for(uint i=0; i<total; i++)

     {

      //--- try to get deals ticket

      if((ticket=HistoryDealGetTicket(i))>0)

        {

         long entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);

         if(entry==DEAL_ENTRY_IN)

            continue;

         //--- get deals properties

         trades_of_day++;

         double deal_commission=HistoryDealGetDouble(ticket,DEAL_COMMISSION);

         double deal_swap=HistoryDealGetDouble(ticket,DEAL_SWAP);

         double deal_profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);

         double profit=deal_commission+deal_swap+deal_profit;

         if(profit>0.0)

            wining_trade+=profit;

         if(profit<0.0)

            losing_trade+=profit;

         total_profit+=profit;

        }

     }

return total_profit;


//---


Comments

Popular posts from this blog

MQL5 : Add time to current time in mins

MQL5: Closed order detail