Calculate Lot Size and Trailling Stop – EA MetaTrader 5

I. Condition Buy-Sell

2. Backtest



1. Main function for calculate lot size

//+------------------------------------------------------------------+
//| caculate lot sisze Function                                      |
//+------------------------------------------------------------------+
double calculate_lotsize(double sl, double price)   
 
 {
  double lots=0.;
  double lotstep= SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
 double ticksize = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   double tickvalue = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
  double balance= AccountInfoDouble(ACCOUNT_BALANCE);
  double point= SymbolInfoDouble(_Symbol,SYMBOL_POINT);
  //double  loss=MathRound((MathAbs(price-sl)/ ticksize) * ticksize );
  double  loss=MathAbs(price-sl)/point;  m_symbol.NormalizePrice(loss);
  double Risk= initial_risk*balance;



  

if(loss!=0)    {     lots=MathAbs(Risk/loss);     lots=MathFloor(lots/lotstep)*lotstep;    }    lots=MathMax(lots,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN));    lots=MathMin(lots,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX));    return lots; }

2. Trailling and Count Position

//+------------------------------------------------------------------+
//|Count position and Trailling Functiom                              |
//+------------------------------------------------------------------+

void  count_position(int &count_buy, int &count_sell)

  {
   count_buy=0; count_sell=0;
   int total_postion=PositionsTotal();
   double cp=0.0, op=0.0, sl=0.0,tp=0.0; ulong ticket=0.0;
   for ( int i=total_postion-1; i>=0; i--)
     {
     if(m_position.SelectByIndex(i))
      {
      if(m_position.Symbol()==_Symbol && m_position.Magic()== m_magicnumber)
       cp=m_position.PriceCurrent();op=m_position.PriceOpen();sl=m_position.StopLoss();tp=m_position.TakeProfit();ticket=m_position.Ticket();
       {       
       if(m_position.PositionType()== POSITION_TYPE_BUY)
        {
        count_buy++;
        double Traill= cp-ExtTraill_Stop;
        if(cp>sl+ExtTraill_Step && Traill>sl)
         {
          trade.PositionModify(ticket,Traill,tp);
         }
        }
      
       if(m_position.PositionType()== POSITION_TYPE_SELL)
        {
         count_sell++;
         double Traill= cp+ExtTraill_Stop;
         if(cp<sl-ExtTraill_Step && Traill<sl)
         
         {
          trade.PositionModify(ticket,Traill,tp);
         }
        }
         
       }
      }
     
     }
  }

3. Only buy or sell at new candle function

//+------------------------------------------------------------------+
 //|Only buy or sell at new candle                                     |
 //+------------------------------------------------------------------+
 datetime    mprevBar; 
 bool    OpenBar(string  symbol)
 
 {
  datetime     CurBar=iTime(symbol,timeframe,0);
  if(  CurBar==mprevBar)
    {
     return   false;
    }
    mprevBar=CurBar;
    return  true;
 }

4. Drawn suport and resistance

void Drawline(string name, color  Color, double  price)
   {
     if(ObjectFind(0,name)<0)
      {
       ResetLastError();;
      }
     if(!ObjectCreate(0,name,OBJ_HLINE,0,0,price))
     {
      return;
     }
    // Setup color for object
     ObjectSetInteger(0,name,OBJPROP_COLOR,Color);
    // Setup color for object
     ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DASHDOT);
     // Setup color for object
     ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
     
     if(!ObjectMove(0,name,0,0,price))
     {
      return;
     }
   ChartRedraw();
   }

II. Main function void Ontick

Alternative:  NRTR_Revers - EA MetaTrader 5
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
 if(OpenBar(Symbol()))
  {

 //+------------------------------------------------------------------+
//|   // Candle declaration                                           |
//+------------------------------------------------------------------+  
 double High[],Low[],open[],close[];
 ArraySetAsSeries(High,true);ArraySetAsSeries(Low,true);ArraySetAsSeries(close,true);ArraySetAsSeries(open,true);
 CopyHigh(Symbol(),timeframe,0,1000,High);
 CopyLow(Symbol(),timeframe,0,1000,Low);
 CopyOpen(_Symbol,timeframe,0,100,open);
 CopyClose(_Symbol,timeframe,0,100,close);
 
// Highest high and lowest low declaration

int highest= ArrayMaximum(High,HL_shift,HL_period);
int lowest= ArrayMinimum(Low,HL_shift,HL_period); 
double  HH= High[highest];
Drawline(" Kháng Cự ", clrRed,HH);
double  LL= Low[lowest];
Drawline(" hỗ trợ ", clrBlue,LL);

// Moving average declaration

CopyBuffer(Handle_MA,0,0,100,MA_Filter);
ArraySetAsSeries(MA_Filter,true);

//|   Broker parameter                                               
     
double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT);
double ask= SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double bid= SymbolInfoDouble(_Symbol,SYMBOL_BID);
double spread=ask-bid;
double stoplevel= (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
int freezerlevel= (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL); 

//     Count bjuy and count sell                                   
  

 int count_buy=0; int count_sell=0;
 count_position(count_buy,count_sell);

 // Main condition for buy and sell
 

    if(count_buy==0)
     {
       if(ask>(HH) && High[highest] > MA_Filter[highest]  )
        {
         double  entryprice= ask;
         double  sl        = LL;
         double  tp        = entryprice   +Exttakeprofit;
         double lotsize    = calculate_lotsize(sl,entryprice);
        if(  bid-sl>stoplevel && tp-bid>stoplevel&& CheckVolumeValue(lotsize) )
         {
         trade.Buy(lotsize,_Symbol,entryprice,sl,tp, " Buy Mr Tan ");
        
         }
       }
     }
    if(count_sell==0)
     {
    if(bid<(LL) && Low[lowest] < MA_Filter[lowest])
        {
         double  entryprice= bid;
         double  sl        = HH;
         double  tp        = entryprice   -Exttakeprofit;
         double lotsize    = calculate_lotsize(sl,entryprice);
         if(  sl-ask>stoplevel && ask-tp>stoplevel&& CheckVolumeValue(lotsize) )
         {
          trade.Sell(lotsize,_Symbol,entryprice,sl,tp, " Sell Mr Tan ");
         }
        }
     }
   
  }
 
  }




📈 ROBOTFX MetaTrader Expert Advisors and Indicators to maximize profits and minimize the risks