How to calculate Stop Loss below/above 2 bars from entry

 


 This EA trades a 3 bar setup
 LONG - One bearish and two bullish bar formation
 SHORT - One bullish and two bearish bar formation
 StopLoss - 2 bars below or above entry (may be Highest High or Lowest low of Bar[2])
 TakeProfit - time after 40 minutes 

1. How do I calculate stop loss based on previous candles below or above entry point using PositionModify?

2. Did I do my ClosePositionByTime correctly?

I am trying to code this EA to execute a single trade from this setup:


void OnTick()
  {
//--- 
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);  
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);  
   int    digits  =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);             
//--- work only at the time of the birth of new bar
   datetime time_0=iTime(m_symbol.Name(),Period(),0);
   if(time_0==m_prev_bars)
      return;
   m_prev_bars=time_0;
//--- Condition for opening BUY position
   if(m_need_open_buy)
//--- Check one bearish and two bullish bar formation
   if ((iOpen(m_symbol.Name(), 15, 1) - iClose(m_symbol.Name(), 15, 1)) < 0) { // 1st candle before current must be bullish
      ((iOpen(m_symbol.Name(), 15, 2) - iClose(m_symbol.Name(), 15, 2)) < 0) { // 2st candle before current must be bullish  
      ((iOpen(m_symbol.Name(), 15, 3) - iClose(m_symbol.Name(), 15, 3)) > 0)   // 3rd candle before current must be bearish
    {
     m_need_open_buy=true;
      return;
    }   
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
      double free_margin_check=m_account.FreeMarginCheck(m_symbol.Name(),
                          ORDER_TYPE_BUY,
                          m_symbol.LotsMin(),
                          m_symbol.Ask());
      double margin_check=m_account.MarginCheck(m_symbol.Name(),
                          ORDER_TYPE_BUY,
                          m_symbol.LotsMin(),
                          m_symbol.Ask());
      if(free_margin_check>margin_check)
        {
         if(InpPrintLog)
            Print(__FILE__," ",__FUNCTION__,", OK: ","Signal BUY");
         m_trade.Buy(m_symbol.LotsMin(),m_symbol.Name(),m_symbol.Ask(),0);
        }
      m_need_open_buy=false;
     }    
//--- Condition for opening SELL position
  
   if(m_need_open_sell)
//--- Check one bullish and two bearish bar formation
   if ((iOpen(m_symbol.Name(), 15, 1) - iClose(m_symbol.Name(), 15, 1)) > 0) { // 1st candle before current must be bearish
      ((iOpen(m_symbol.Name(), 15, 2) - iClose(m_symbol.Name(), 15, 2)) > 0) { // 2st candle before current must be bearish 
      ((iOpen(m_symbol.Name(), 15, 3) - iClose(m_symbol.Name(), 15, 3)) < 0)   // 3rd candle before current must be bullish
    {
     m_need_open_sell=true;
      return;
    }
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
      double free_margin_check=m_account.FreeMarginCheck(m_symbol.Name(),
                          ORDER_TYPE_SELL,
                          m_symbol.LotsMin(),
                          m_symbol.Ask());
      double margin_check=m_account.MarginCheck(m_symbol.Name(),
                          ORDER_TYPE_SELL,
                          m_symbol.LotsMin(),
                          m_symbol.Ask());
      if(free_margin_check>margin_check)
        {
         if(InpPrintLog)
            Print(__FILE__," ",__FUNCTION__,", OK: ","Signal SELL");
         m_trade.Sell(m_symbol.LotsMin(),m_symbol.Name(),m_symbol.Bid(),0);
        
        }
      m_need_open_sell=false;
        }
   }                
//+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
bool PositionCloseByTime(int minutes,int seconds)
  {
   ulong m_ticket;
   int m_total=PositionsTotal();
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      {
      m_ticket=PositionGetTicket(i);
      if(PositionSelectByTicket(m_ticket))  // selects the position by ticket for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            if(TimeCurrent()-PositionGetInteger(POSITION_TIME)>=minutes*2400+seconds*60)
               return(m_trade.PositionClose(m_ticket)); // close position after 40 minutes thats 2400 seconds
                  if(InpPrintLog)
                     Print(__FILE__," ",__FUNCTION__,", ERROR: ","CTrade.PositionClose ",m_position.Ticket());
   
     }     
//---
   return(false);
  }        
//+------------------------------------------------------------------+