Problema de concorrência entre o EA e Indicador

 

Boa noite pessoal,

Estou com um problema que acredito ser por causa de concorrência entre um indicador customizado e o meu EA.

Alguém tem alguma idéia ou sugestão de como resolver?

Cenário:

Sempre que é aberto um novo Candle, o INDICADORrealiza uma validação referente ao Candle que foi FECHADO e preenche o buffer com o valor do fechamento, indicando que deve realizar a compra.

Por sua vez, no EA, apenas na abertura de um novo Candle, ele verifica o buffer referente ao candle anterior para saber se deve executar a compra ou não.


Exemplo do código:

Código EA:

CisNewBar m_newbar;
int m_indicator_handle = iCustom(_Symbol, _Period, caminho_indicador);
....
    
if(m_newbar.isNewBar()) {
  double buffer_buy[];
  int start = 1; //Buffer do candle anterior
  CopyBuffer(m_indicator_handle, 0, start, 1, buffer_buy);
  //Neste momento, acontece o problema de concorrência. O buffer deveria ter o valor de compra, porém retorna 0.
  if(buffer_buy[0] > 0)
    executar_compra();
} 
...
    
    

Código indicador:

...
if(rates_total != prev_calculated)
{
  int index = rates_total-1;
  buffer_buy[index] = 0; //Define o valor do índice do buffer atual igual 0

  bool compra = ValidaCompra();
  if(compra)
    buffer_buy[index-1] = iClose(Symbol(), Period(), 1); //Define o valor do índice do buffer anterior igual 1
}
...
 
Marcus Alexandre Machado De Oliveira:

....

e o que acontece ?

 
Marcus Alexandre Machado De Oliveira:

Boa noite pessoal,

Estou com um problema que acredito ser por causa de concorrência entre um indicador customizado e o meu EA.

Alguém tem alguma idéia ou sugestão de como resolver?

Cenário:

Sempre que é aberto um novo Candle, o INDICADORrealiza uma validação referente ao Candle que foi FECHADO e preenche o buffer com o valor do fechamento, indicando que deve realizar a compra.

Por sua vez, no EA, apenas na abertura de um novo Candle, ele verifica o buffer referente ao candle anterior para saber se deve executar a compra ou não.


Exemplo do código:

Código EA:

Código indicador:

O OnCalculate() do seu indicador já recebe o close[]... por quê usar iClose() ??

E, se realmente for necessário o uso de iClose(), leia ATENTAMENTE a documentação:

The function always returns actual data. For this purpose it performs a request to the timeseries for the specified symbol/period during each call. 
This means that if there is no ready data during the first function call, some time may be taken to prepare the result.
Razão: