Issue on converting EA

 

I have written an EA which works perfectly fine on MT4. However, when it comes to running the same entry positions on MT5 it just doesn't wotk.


I have spent hours tryna get it to work but cant seem to see what I am doing wrong.


Below is the MT4 snippet of the source code.

void OnTick()
{
   if(EnableMA==1)
   {
      
        double rsx =iCustom(NULL,0,"NMS_Momentum",21,0,0,0);
        double rsx1 = iCustom(NULL,0,"NMS_Momentum",21,0,0,1);  
        double ma50=iMA(Symbol(),0,50,0,1,0,0);
        double ma200=iMA(Symbol(),0,200,0,1,0,0);
        
      if(rsx> rsx1 && rsx<30 && ma50>ma200)
         mabuy=1;
      else
         mabuy=0;
      if(rsx< rsx1 && rsx>70 && ma200>ma50)
         masell=1;
      else
         masell=0;
   }

 and below is the MT5 version. Where am I going wrong?

int OnInit()
{
   trade.SetExpertMagicNumber(MagicNumber);
   
   Handle = iCustom(Symbol(),PERIOD_CURRENT,IndicatorName,rsxPeriod);
   

 
   return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{  
   
   if(EnableMA==1)
   {
   
   int handleEMA50 = iMA(Symbol(),PERIOD_CURRENT,50,0,MODE_EMA,PRICE_CLOSE);
   int handleEMA200 = iMA(Symbol(),PERIOD_CURRENT,200,0,MODE_EMA,PRICE_CLOSE);
   
   double ema50array[];
   double ema200array[];
   
   CopyBuffer(handleEMA50,0,0,2,ema50array);
   CopyBuffer(handleEMA200,0,0,2,ema200array);
   CopyBuffer(Handle,0,0,3,BufferRSX);
   
   
   ArraySetAsSeries(ema50array,true);
   ArraySetAsSeries(ema200array,true);
   
   double currentRSX = BufferRSX[1];
   double priorRSX = BufferRSX [0];
   double redline = ema50array[0];
   double greenline = ema200array[0];
   
   Comment("\n 50EMA : ",ema50array[0],
   "\n 200EMA : ",ema200array[0],
   "\n RSX : ",currentRSX,
   "\n RSX previous : ", priorRSX
   
   
   );


        
        
      if(currentRSX>priorRSX && priorRSX<30 && redline>greenline )
         mabuy=1;
      else
         mabuy=0;
         
      if(currentRSX<priorRSX && priorRSX>70 && redline<greenline)
         masell=1;
      else
         masell=0;
   }

I really hope it's an easy fix. Any help would be much appreciated!

 
   int handleEMA50 = iMA(Symbol(),PERIOD_CURRENT,50,0,MODE_EMA,PRICE_CLOSE);
   int handleEMA200 = iMA(Symbol(),PERIOD_CURRENT,200,0,MODE_EMA,PRICE_CLOSE);

Perhaps you should read the manual, especially the examples.
   How To Ask Questions The Smart Way. (2004)
      How To Interpret Answers.
         RTFM and STFW: How To Tell You've Seriously Screwed Up.

They all (including iCustom) return a handle (an int). You get that in OnInit. In OnTick/OnCalculate (after the indicator has updated its buffers), you use the handle, shift and count to get the data.
          Technical Indicators - Reference on algorithmic/automated trading language for MetaTrader 5
          Timeseries and Indicators Access / CopyBuffer - Reference on algorithmic/automated trading language for MetaTrader 5
          How to start with MQL5 - General - MQL5 programming forum - Page 3 #22 (2020)
          How to start with MQL5 - MetaTrader 5 - General - MQL5 programming forum - Page 7 #61 (2020)
          How to call indicators in MQL5 - MQL5 Articles (2010)