Sometimes zero value from iMA when running 32 EA on virtual server

To add comments, please log in or register
Christoph Pedretti
17086
Christoph Pedretti  

Hello all,

I'm facing a strange problem with my automated trading system, which is running 32 EA (for 32 currency pairs) on a virtual server. In every EA I'm calculating the exponential moving average, but sometimes for some EA, the function iMA is returning 0. Here is the code snippet I use for all scripts:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  if (isNewBar()){    
    hEMA = iMA(NULL,Timeframe,EMA_period,0,MODE_EMA,PRICE_CLOSE);
Does anyone has ever experienced something like this?

thank you in advance,

Kind regards

Christoph

William Roeder
21863
William Roeder  
  1. When you post code please use the CODE button (Alt-S)! (For large amounts of code, attach it.) Please edit your post.
              General rules and best pratices of the Forum. - General - MQL5 programming forum
              Messages Editor

  2.  hEMA = iMA(NULL,CalcPeriodInMin,EMA_period,0,MODE_EMA,PRICE_CLOSE);
    CalcPeriodInMin is not in minutes. It's an enumeration. On MT5 ENUM_TIMEFRAMES values are not the period in minutes.
    Use EnumToString(TF[i]) to see the string representation of the time frame.
    Use PeriodSeconds(TF[i]) to see the duration of the time frame.
              Why calculations of period()_value are different? (over 30 minutes) What's Burg? - Indices - Technical Indicators - MQL5 programming forum
  3. On MT5: Unless the chart is that specific pair/TF, you must Synchronize the terminal Data from the Server.
              Timeseries and Indicators Access /  Data Access - Reference on algorithmic/automated trading language for MetaTrader 5
Christoph Pedretti
17086
Christoph Pedretti  
whroeder1:
  1. When you post code please use the CODE button (Alt-S)! (For large amounts of code, attach it.) Please edit your post.
              General rules and best pratices of the Forum. - General - MQL5 programming forum
              Messages Editor

  2. CalcPeriodInMin is not in minutes. It's an enumeration. On MT5 ENUM_TIMEFRAMES values are not the period in minutes.
    Use EnumToString(TF[i]) to see the string representation of the time frame.
    Use PeriodSeconds(TF[i]) to see the duration of the time frame.
              Why calculations of period()_value are different? (over 30 minutes) What's Burg? - Indices - Technical Indicators - MQL5 programming forum
  3. On MT5: Unless the chart is that specific pair/TF, you must Synchronize the terminal Data from the Server.
              Timeseries and Indicators Access /  Data Access - Reference on algorithmic/automated trading language for MetaTrader 5

Hello Whroeder,

thank you very much for the fast reply, sorry for the wrong formatation I have corrected it (1.).

For 2. in fact the variable name is misleading, it is of type ENUM_TIMEFRAMES.

3. I think this could be my problem, do you mean that i got zero value for certain pairs because the data of iMA is not ready?

Just for completion, attached is the terminal output of the experts if I put a printf right after the iMA call, you see the last one is zero.

Thank you in advance,

Kind regards

Christoph

Files:
Capture.PNG 46 kb
Christoph Pedretti
17086
Christoph Pedretti  

I saw some threads about calculation data not being ready, so i tryed to repeat the CopyBuffer instruction, but it seems not helping:

    hEMA=iMA(NULL,Timeframe,EMA_period,0,MODE_EMA,PRICE_CLOSE);
    CopyBuffer(hEMA,0,0,3,pEMA);
    ArraySetAsSeries(pEMA,true);

    int cnt = 0;

    while((hEMA==INVALID_HANDLE || pEMA[1] < 0.0001) && cnt < 100)
      {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Timeframe),
                  GetLastError());
      CopyBuffer(hEMA,0,0,3,pEMA);
      ArraySetAsSeries(pEMA,true);
      cnt += 1;  
      }    

The output is continuosly repeating the CopyBuffer instruction without sucess:

...

2018.03.08 18:32:11.703    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:33:02.564    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:33:53.423    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:34:44.283    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:35:35.143    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:36:26.002    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:37:16.862    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:38:07.722    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:38:58.582    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:39:49.441    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:40:40.303    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
...

Can someone help?

Thanks in advance,

Kind regards

Christoph

Alain Verleyen
40390
Alain Verleyen  
Christoph Pedretti:

I saw some threads about calculation data not being ready, so i tryed to repeat the CopyBuffer instruction, but it seems not helping:

The output is continuosly repeating the CopyBuffer instruction without sucess:

...

2018.03.08 18:32:11.703    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:33:02.564    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:33:53.423    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:34:44.283    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:35:35.143    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:36:26.002    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:37:16.862    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:38:07.722    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:38:58.582    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:39:49.441    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
2018.03.08 18:40:40.303    GBPDKK_SuperSafeCross_H3 (GBPDKK,H3)    Failed to create handle of the iMA indicator for the symbol GBPDKK/PERIOD_H3, error code 4806
...

Can someone help?

Thanks in advance,

Kind regards

Christoph

It will never work this way. On each tick you are trying to create an handle (launch an indicator), this is done asynchronously, the data are not ready for your CopyBuffer.

Initialize your handle in OnInit(), then use CopyBuffer() in OnTick(). And check your handle right after, before using it.

aslkdjf
22
aslkdjf  
Christoph Pedretti:

I saw some threads about calculation data not being ready, so i tryed to repeat the CopyBuffer instruction, but it seems not helping:


At some point you are passing bad data into the iMA function. Don't use "NULL" for symbols in Mql5 functions, and always specify the symbol and timeframe. You'll also want to check for errors when using CopyBuffer. Here is an example that will check to make sure you correctly called iMA and then loop CopyBuffer if the handle is valid but there was an error in copying the buffer. 

void OnStart()
  {
//---
   double ma_buffer[];
   int total = myMA(ma_buffer,20,"GBPUSD",PERIOD_H2);
   if(total > 0)
      printf("No errors in MA, size of buffer = %d",total);

  }
//+------------------------------------------------------------------+

int myMA(double                 &buffer[], 
         const int               ema_period,
         string                  symbol              = NULL,
         const ENUM_TIMEFRAMES   timeframe           = PERIOD_CURRENT, 
         const int               start               = 0,
         int                     count               = NULL,
         const bool              as_series           = true,
         const uint              millisecond_timeout = 250)
{
   ResetLastError();
   symbol = symbol == NULL ? _Symbol : symbol;
   int ma_handle = iMA(symbol,timeframe,ema_period,0,MODE_EMA,PRICE_CLOSE);
   if(ma_handle == INVALID_HANDLE)
   {
      printf("[%s]::Invalid indicator handle, code = %d",__FUNCSIG__,_LastError);
      return (int)false;
   }
   uint milliseconds = GetTickCount();
   ArraySetAsSeries(buffer,as_series);
   int result=0;
   
   do
   {
      ResetLastError();
      count = count == NULL ? Bars(symbol,timeframe) : count;
      result = CopyBuffer(ma_handle,0,start,count,buffer);  
   }
   while(_LastError != ERR_SUCCESS && GetTickCount()-milliseconds < millisecond_timeout);
   
   if(_LastError != ERR_SUCCESS || result < 1)
   {
      printf("[%s]::CopyBuffer error, code = %d",__FUNCSIG__,_LastError);
      return (int)false;
   } 
   return result;  
} 
Alain Verleyen
40390
Alain Verleyen  
aslkdjf:

At some point you are passing bad data into the iMA function. Don't use "NULL" for symbols in Mql5 functions, and always specify the symbol and timeframe. You'll also want to check for errors when using CopyBuffer. Here is an example that will check to make sure you correctly called iMA and then loop CopyBuffer if the handle is valid but there was an error in copying the buffer. 

There is no problem to use NULL with iMA. It means current chart symbol as documented.

Using a loop to manage asynchronous function is really a poor coding practice. If you really can't wait for a tick (why???), use a timer.

aslkdjf
22
aslkdjf  
Alain Verleyen:

There is no problem to use NULL with iMA. It means current chart symbol as documented.

Using a loop to manage asynchronous function is really a poor coding practice. If you really can't wait for a tick (why???), use a timer.

What asynchronous function
Alain Verleyen
40390
Alain Verleyen  
aslkdjf:
What asynchronous function

iMA.

It returns an handle, but the underlying indicator is not yet ready (most of the time).

aslkdjf
22
aslkdjf  
Alain Verleyen:

iMA.

It returns an handle, but the underlying indicator is not yet ready (most of the time).

That's exactly why the example function has a timeout feature, to keep calling CopyBuffer until either it's ready within an acceptable delay or it times-out and returns false. 
Alain Verleyen
40390
Alain Verleyen  
aslkdjf:
That's exactly why the example function has a timeout feature, to keep calling CopyBuffer until either it's ready within an acceptable delay or it times-out and returns false. 
I know. What I am saying is it's not a good approach to loop...at least you should add a Sleep() inside your loop, as you are keeping the thread busy 'all' the time, so in my opinion a timer is nicer.
12
To add comments, please log in or register