I need some Help to finish my EA mql4

 

Hello everyone, I would need your help with my EA. I would like to send when the purchase conditions are met, at the same time a "buy" order and a "buystop" order, and when the sale conditions are met , I would like to send a "sell" order and a "sellstop" order ... it's been a while since I tried several methods to get there without success ..... thank you in advance.

//+------------------------------------------------------------------+
//|                                    BOLLINGER_COMPLET_LOOP_V1.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#include <stderror.mqh>
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| Divergences Rsi                                        
//| Rsi Level                      
//| Bollinger Bands 
//| Atr (dynamic TP-SL-TS)
//| Dynamic Lots
//| Spread
//| Margin Level  
//| Pending Order                                     
//+------------------------------------------------------------------+
extern int MagicNumber=21122020;
extern int atrMultipleSL=15;
extern int atrMultipleTP=3;
extern int atrMultipleTS=12;
extern int PeriodATR=1;
extern int ShiftATR=0;
extern int Slippage=3;
extern int shift=9;
double MarginFree; // Free margin in percentage 
extern double   MinMarginLevel = 100; // Lowest allowed Margin level for new positions to be opened. 
extern double LotFactor =170; //lotsize factor
double lot;
extern double Lowlevel=49;
extern double Highlevel=84;
extern int Periode=12;
extern int Indicatorperiod=35;
extern int BBDeviation=2;
extern int barnumber =5;
extern int CandlesToRetrace=15;  //Num.Of Candles For Divergence
extern int RSI=11; //RSI
extern int volume1=1;
extern int volume0=0;
extern int adxperiod= 31;
extern int adxthreshold=23;
extern  int PriceLevel=13;
extern  int numberpositions=0;
double result1,result2,result3,result4;
extern double   AddPriceGap = 0;
extern double martingale =0;

double last_profit, last_lot;
int last_tip;
//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+
int start()
{
//============================================================================
  //double llots = 0.1;
  double llots = (AccountBalance() * 0.01 /LotFactor);
  if( OrdersTotal() == 0 && OrdersHistoryTotal() == 0) llots =/* Lots*/(AccountBalance() * 0.01 /LotFactor);
  else if( OrdersTotal() == 0&& OrdersHistoryTotal() > 0 )  last_history_profit(); 

   if( last_profit < 0 ) llots = martingale*last_lot;
   if( last_profit > 0 ) llots = (AccountBalance() * 0.01 /LotFactor);

//============================================================================
  double MyPoint=Point;
  if(Digits==3 || Digits==5) MyPoint=Point*10;
  
  double TheStopLoss=0;
  double TheTakeProfit=0;
      
   //+------------------------------------------------------------------+
   // dynamic parameters  
   
    double atr = iATR(NULL, 0, PeriodATR, ShiftATR);
    //double StopLossPending = (atr * atrMultipleSL / Point);
    double StopLoss = (atr * atrMultipleSL / Point);
    double TakeProfit =(atr * atrMultipleTP / Point);//(atr * atrMultipleTP / Point);
    double TrailingStop=(atr * atrMultipleTS / Point);
    
//+------------------------------------------------------------------+
     //Calculate and check spread  
   double MaxSpreadInPoints = 30; 
   double Spread = Ask - Bid;
   if(Spread>MaxSpreadInPoints*Point)
      return(false);
  //+------------------------------------------------------------------+        
        double am = 0.000000001;  // Set variable to a very small number 
        double marginlevel; 
  
        // Get the Free Margin 
        MarginFree = AccountFreeMargin();        
        // Calculate Margin level 
        if ( AccountMargin() != 0 ) 
                am = AccountMargin(); 
        marginlevel = AccountEquity() / am * 100;        
         
        // Free Margin is less than the value of MinMarginLevel, so no trading is allowed 
        if ( marginlevel < MinMarginLevel ) 
        { 
      Comment ( "Warning! Free Margin " + DoubleToStr ( marginlevel, 2 ) + " is lower than MinMarginLevel!" ); 
                Alert ( "Warning! Free Margin " + DoubleToStr ( marginlevel, 2 ) + " is lower than MinMarginLevel!" ); 
      return(0);         
        }        
//+------------------------------------------------------------------+  
  
  
  if( TotalOrdersCount()<=numberpositions ) 
  {
     int result=0;
     // Here is your open buy rule
     if( RSI()==1)
     if((iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1)<iBands(NULL,0,Indicatorperiod,BBDeviation,0,PRICE_OPEN,MODE_LOWER,1))
     &&(iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0)>iBands(NULL,0,Indicatorperiod,BBDeviation,0,PRICE_OPEN,MODE_LOWER,0))) // Bollinger bands
     if((iRSI(NULL,0,Periode,PRICE_CLOSE,1)<Lowlevel)&&(iRSI(NULL,0,Periode,PRICE_CLOSE,0)>Lowlevel))// Rsi Level
 
     //if (!IsTradeContextBusy() && IsTradeAllowed()) 
       
     {
        result=OrderSend(Symbol(),OP_BUY,NR(Lot_Volume()),Ask,Slippage,0,0,"BOLLINGER_COMPLET",MagicNumber,0,Blue);
        if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Bid+TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Bid-StopLoss*MyPoint;
           if(OrderSelect(result,SELECT_BY_TICKET))
         bool modif2=  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
     
    
     // Here is your open Sell rule
     if( RSI()==2)
     if((iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1)>iBands(NULL,0,Indicatorperiod,BBDeviation,0,PRICE_OPEN,MODE_UPPER,1))
     &&(iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0)<iBands(NULL,0,Indicatorperiod,BBDeviation,0,PRICE_OPEN,MODE_UPPER,0))) 
     if((iRSI(NULL,0,Periode,PRICE_CLOSE,1)>Highlevel)&&(iRSI(NULL,0,Periode,PRICE_CLOSE,0)<Highlevel))//Rsi Level

    
    // if (!IsTradeContextBusy() && IsTradeAllowed())    
     {
        result=OrderSend(Symbol(),OP_SELL,NR(Lot_Volume()),Bid,Slippage,0,0,"BOLLINGER_COMPLET",MagicNumber,0,Red);
        if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Ask-TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Ask+StopLoss*MyPoint;
         if(OrderSelect(result,SELECT_BY_TICKET))
         bool modif1=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
     //
        // Here is your open buy rule
       if( RSI()==1)
     if((iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1)<iBands(NULL,0,Indicatorperiod,BBDeviation,0,PRICE_OPEN,MODE_LOWER,1))
     &&(iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0)>iBands(NULL,0,Indicatorperiod,BBDeviation,0,PRICE_OPEN,MODE_LOWER,0))) // Bollinger bands
     if((iRSI(NULL,0,Periode,PRICE_CLOSE,1)<Lowlevel)&&(iRSI(NULL,0,Periode,PRICE_CLOSE,0)>Lowlevel))// Rsi Level
     {
       // if (!IsTradeContextBusy() && IsTradeAllowed())
       result=OrderSend(Symbol(), OP_BUYSTOP, NR(Lot_Volume()), Ask + PriceLevel * Point, Slippage, Bid-StopLoss *Point-AddPriceGap, Bid+TakeProfit*Point+AddPriceGap, "BOLLINGER_BANDS_EA_V1", MagicNumber, 0, Blue);
    
      if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Bid+TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Bid-StopLoss*MyPoint;      
        
         if(OrderSelect(result,SELECT_BY_TICKET))
         bool modif1=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
    if( RSI()==2)
     if((iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1)>iBands(NULL,0,Indicatorperiod,BBDeviation,0,PRICE_OPEN,MODE_UPPER,1))
     &&(iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0)<iBands(NULL,0,Indicatorperiod,BBDeviation,0,PRICE_OPEN,MODE_UPPER,0))) 
     if((iRSI(NULL,0,Periode,PRICE_CLOSE,1)>Highlevel)&&(iRSI(NULL,0,Periode,PRICE_CLOSE,0)<Highlevel))//Rsi Level
  {
       // if (!IsTradeContextBusy() && IsTradeAllowed())
       result=OrderSend(Symbol(), OP_SELLSTOP,NR(Lot_Volume()), Bid- PriceLevel * Point, Slippage, Ask+StopLoss *Point+AddPriceGap, Ask-TakeProfit*Point-AddPriceGap, "BOLLINGER_BANDS_EA_V1", MagicNumber, 0, Red);
       
          if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Ask-TakeProfit*MyPoint;
        if(StopLoss>0) TheStopLoss=Ask+StopLoss*MyPoint;      
         
         if(OrderSelect(result,SELECT_BY_TICKET))
        bool modif2= OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
  }
  
  for(int cnt=0;cnt<OrdersTotal();cnt++)
     {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol() &&
         OrderMagicNumber()==MagicNumber 
         )  
        {

         if(OrderType()==OP_BUY)  
           {
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
                 {
                  if (OrderStopLoss()+ 0.5 * Point < Bid-MyPoint*TrailingStop)//+0.5 against error modify 1
                    {
                     bool modif3=  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
                 {
                  if (OrderStopLoss()-0.5*Point >Ask+MyPoint*TrailingStop || (OrderStopLoss()==0))//-0.5 against error modify 1
                    {
                     bool modif4=  OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
}

int TotalOrdersCount()
{
  int result=0;
  for(int i=0;i<OrdersTotal();i++)
  {
     if(OrderSelect(i,SELECT_BY_POS ,MODE_TRADES))
     if (OrderMagicNumber()==MagicNumber) result++;

   }
  return (result);
}
 //+------------------------------------------------------------------+
 //Calculates Lot Size based on balance and factor
 //+------------------------------------------------------------------+
 double NR(double thelot)
 {
 double maxlots=MarketInfo(Symbol(),MODE_MAXLOT),
 minilot=MarketInfo(Symbol(),MODE_MINLOT),
 lstep=MarketInfo(Symbol(),MODE_LOTSTEP);
 double lots=lstep*NormalizeDouble(thelot/lstep,0);
 lots=MathMax(MathMin(maxlots,lots),minilot);
 return (lots);
 }

//+------------------------------------------------------------------+
 double Lot_Volume()
{

 lot=AccountBalance() * 0.01 /LotFactor ;

return(lot);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
 int RSI()//Divergences Rsi
  {

   for(int i=CandlesToRetrace; i>=0; i--)
   
     {   
if(((iRSI(Symbol(),0,RSI,PRICE_HIGH,1)<iRSI(Symbol(),0,RSI,PRICE_HIGH,i))&& (High[1]>iHigh ( Symbol (), 0 , iHighest ( Symbol (), 0 , MODE_HIGH, barnumber , i )) ))
||((iRSI(Symbol(),0,RSI,PRICE_HIGH,1)>iRSI(Symbol(),0,RSI,PRICE_HIGH,i))&& (High[1]<iHigh ( Symbol (), 0 , iHighest ( Symbol (), 0 , MODE_HIGH, barnumber , i )) )))
         
        {
         return(1);
         Comment("The trend is up");
        }
      else           
if(((iRSI(Symbol(),0,RSI,PRICE_LOW,1)>iRSI(Symbol(),0,RSI,PRICE_TYPICAL,i))&& (Low[1]<iLow ( Symbol (), 0 , iLowest ( Symbol (), 0 , MODE_LOW, barnumber , i ))))
||((iRSI(Symbol(),0,RSI,PRICE_LOW,1)<iRSI(Symbol(),0,RSI,PRICE_LOW,i))&& (Low[1]>iLow ( Symbol (), 0 , iLowest ( Symbol (), 0 , MODE_LOW, barnumber , i ))))) 
          
           {
            return(2);
            Comment("The trend is down");
           }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//============================================================================
 double last_history_profit()
   {
   double cpte_profit = 0; //int Magik_No = -1;
        if( OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY) )    
          {
           if( OrderMagicNumber() == MagicNumber ) {
           last_profit  = OrderProfit();
           last_lot = OrderLots();
           last_tip = OrderType();
          } 
       }
  return(0);
 }

 
7413276: at the same time a "buy" order and a "buystop" order, and when the sale conditions are met , I would like to send a "sell" order and a "sellstop" order

Since 2009, hedging is not permitted for US traders.
          NFA Enforces FIFO Rule, Bans Forex Hedging in US Forex Accounts - Trading Heroes September 12, 2016
          FAQ: FIFO in the Forex Market - BabyPips.com May 31, 2011

"Hedging" in Forex trading -Why do it? - Trading Systems - MQL5 programming forum 2017.01.18

 
William Roeder:

Since 2009, hedging is not permitted for US traders.
          NFA Enforces FIFO Rule, Bans Forex Hedging in US Forex Accounts - Trading Heroes September 12, 2016
          FAQ: FIFO in the Forex Market - BabyPips.com May 31, 2011

"Hedging" in Forex trading -Why do it? - Trading Systems - MQL5 programming forum 2017.01.18

Good evening William Roeder

This is not a "hedging" because the orders are not in opposition but carried out in the same direction when a signal is presented ... either: 1 buy + 1 buy stop, .... or: 1 sell + 1sellstop ... it's one or the other but not both at the same time ... the goal is to strengthen a position that goes in the right direction ... thank you for your intervention.