Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1501

 
Николай К:

Por favor, indíqueme cómo resolver el error 4806 - datos solicitados no encontrados. Quiero obtener datos de diferentes periodos de media para el bolinger del indicador. El Handle se recibe en OnInit, pero para mi propósito debería estar enOnCalculate, de ahí el error. Ayúdame a entenderlo con el ejemplo.


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 más o menos así, perdón por la integridad.
 
Николай К:
Organizado así, perdón por la integridad.

¡La manija del indicador en MQL5 debe ser creada en OnInit()!

 
Vladimir Karputov:

¡La manija del indicador en MQL5 debe ser creada en OnInit()!

Entonces, ¿habrá una manija separada para cada período de promedio?

 
Николай К:
Está organizado así, perdón por la coherencia.

El recurso no se libera... pero por lo demás es correcto, aunque no eficiente

después de iMA(...) y de las operaciones con él, debe llamar a IndicatorRelease si ya no lo necesita

La función IndicatorRelease() sirve para liberar el indicador de la memoria del ordenador, al que se le pasa el asa del indicador.

Y un manejador de indicador puede ser creado en cualquier lugar, excepto en OnDeinit. Sólo preocúpate de "qué hacer en caso de error de creación".

 
@Vladimir Karputov @Maxim Kuznetsov ¿Pegamento o clavo? )) Tarea sencilla - preparación compleja, en mql4 se hacía en una o dos. Entonces, ¿cómo reúno los datos de Bolinger para diferentes plazos y períodos de promediación en una matriz sin errores?
 
Николай К:
@Vladimir Karputov @Maxim Kuznetsov ¿Clavar o clavar? )) Tarea simple - preparación compleja, en mql4 se hizo en uno dos. Entonces, ¿cómo reúno los datos de Bolinger para diferentes plazos y períodos de promediación en una matriz sin errores?

Has acertado, te acabas de comer todas las asas, es un recurso agotable... tienes que liberarlas.

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

ver como fxsaber lo hizo en sus bibliotecas para facilitar el paso de 4 a 5

 
MakarFX:
Lo primero que se me ocurre es comprobar el funcionamiento del indicador y luego ver el EA

No encuentro nada ahí, en el indicador no hay líneas como - salidas si..., se procesa cada tick, y en el robot viene cada tick.

Todo el m1 no tiene señal hasta que la barra cambia y una nueva señal, recuerde la señal todas las garrapatas están viendo, el procesamiento de una nueva barra no es.

Y te recuerdo que tengo que hacer la prueba en 3 terminales a la vez. me enterrarán con 3 terminales en la mano.

 
Fast235:

No encuentro nada ahí, en el indicador no hay líneas como - salidas si..., se procesa cada tick, y en el robot viene cada tick.

Todo el m1 no tiene señal hasta que la barra cambia y una nueva señal, recuerde la señal todas las garrapatas están viendo, el procesamiento de una nueva barra no es.

El robot no tiene señal en todos sus aspectos.

Tal vez en el indicador la señal sólo cuando la barra cambia...

Mejor ver el código, por supuesto.

 
¡Hola Artem!
Me da envidia ver la rapidez con la que los compañeros de MQL5 codifican utilizando CTrade y otras clases, originalmente construidas en MT5.
Debido a diversas circunstancias, tengo que codificar en MQL4 e idear mis propias construcciones incómodas.
¿Quizá ya existe un conjunto de clases de este tipo para MQL4?
Gracias de antemano)
Razón de la queja: