Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1501

 
Николай К:

Favor informar como resolver o erro 4806 - dados solicitados não encontrados. Quero obter dados de diferentes períodos médios para o indicador. O cabo é recebido no OnInit, mas para meu propósito deve estar noOnCalculate, daí o erro. Ajude-me a entender isso através do exemplo.


código
 
//+------------------------------------------------------------------+
//|                                                          вап.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  int limit=rates_total-prev_calculated;
   if(limit>1) 
     {
      limit=rates_total-1;                 
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(i>=rates_total-10) 
         continue;

      ArrayInitialize(middle1,0);
      ArrayInitialize(middle2,0);


      for(BandsPeriod=2; BandsPeriod<=5; BandsPeriod++)
        {
         int T=3;
         Handle1=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_HIGH);
         Handle2=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_LOW);
         count=Bars(Symbol(),PERIOD_CURRENT)-10;
         if(!iGetArray(Handle1,BASE_LINE,start_pos,count,middle1) ||
            !iGetArray(Handle2,BASE_LINE,start_pos,count,middle2))// ||
            //CopyRates(Symbol(),PERIOD_CURRENT,start_pos,count,rates)!=count)

           {
            return(false);
           }
        }
      //--- return value of prev_calculated for next call
      return(rates_total);
     }
     }
//+------------------------------------------------------------------+
   
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
Organizado de forma mais ou menos assim, lamentando a integridade.
 
Николай К:
Organizado desta forma, lamentando a integridade.

O cabo indicador na MQL5 deve ser criado no OnInit()!

 
Vladimir Karputov:

O cabo indicador na MQL5 deve ser criado no OnInit()!

Então haverá uma alça separada para cada período de cálculo da média?

 
Николай К:
É organizado assim, lamentando a consistência.

O recurso não é liberado...mas é correto, embora não eficiente

após o iMA(...) e operações com ele, você precisa chamar o IndicatorRelease se não precisar mais dele

A função IndicatorRelease() serve para liberar o indicador da memória do computador, para o qual este cabo indicador é passado.

E um cabo indicador pode ser criado em qualquer lugar, exceto o OnDeinit. Preocupar-se apenas com "o que fazer em caso de erro de criação".

 
@Vladimir Karputov @Maxim Kuznetsov Cola ou prego? )) Tarefa simples - preparação complexa, em mql4 foi feita em um ou dois. Então, como posso reunir os dados de reforço para diferentes períodos de tempo e períodos de média em uma matriz sem erros?
 
Николай К:
@Vladimir Karputov @Maxim Kuznetsov Pregue ou pregue? )) Tarefa simples - preparação complexa, em mql4 foi feita em um dois. Então, como posso reunir os dados de reforço para diferentes períodos de tempo e períodos de média em uma matriz sem erros?

Você acertou, você acabou de comer todos os cabos, é um recurso esgotável... você precisa libertá-los.

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

veja como o fxsaber fez isso em suas bibliotecas para facilitar a mudança de 4 para 5

 
MakarFX:
A primeira coisa que me vem à mente é verificar o funcionamento do indicador e depois observar o EA

Não encontro nada lá, no indicador não há linhas como - saídas se..., cada carrapato é processado, e no robô vem cada carrapato.

O m1 inteiro não tem sinal até que a barra mude e um novo sinal, lembre-se do sinal que todos os ticks estão observando, o processamento de uma nova barra não está.

E lembro que tenho que testar em 3 terminais ao mesmo tempo. Serei enterrado com 3 terminais na mão.

 
Fast235:

Não encontro nada lá, no indicador não há linhas como - saídas se..., cada carrapato é processado, e no robô vem cada carrapato.

O m1 inteiro não tem sinal até que a barra mude e um novo sinal, lembre-se do sinal que todos os ticks estão observando, o processamento de uma nova barra não está.

O robô não tem sinal em todos os aspectos do robô.

Talvez no indicador o sinal só quando a barra muda...

É melhor ver o código, é claro.

 
Olá Artem!
Tenho inveja de ver a rapidez com que os camaradas em código MQL5 usam o CTrade e outras classes, originalmente construídas no MT5.
Devido a várias circunstâncias, eu tenho que codificar no MQL4 e inventar minhas próprias construções incômodas.
Talvez, já exista tal conjunto de classes para a MQL4?
Obrigado antecipadamente)