Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1501

 
Николай К:

Si prega di consigliare come risolvere l'errore 4806 - dati richiesti non trovati. Voglio ottenere i dati di diversi periodi di media per bolinger dall'indicatore. L'Handle viene ricevuto in OnInit, ma per il mio scopo dovrebbe essere inOnCalculate, da cui l'errore. Aiutami a capirlo con l'esempio.


codice
 
//+------------------------------------------------------------------+
//|                                                          вап.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);
  }
//+------------------------------------------------------------------+
Organizzato all'incirca così, scusate l'integrità.
 
Николай К:
Organizzato così, scusate l'integrità.

Il manico dell'indicatore in MQL5 deve essere creato in OnInit()!

 
Vladimir Karputov:

Il manico dell'indicatore in MQL5 deve essere creato in OnInit()!

Allora ci sarà una maniglia separata per ogni periodo di mediazione?

 
Николай К:
È organizzato così, scusate la coerenza.

La risorsa non è liberata...ma è corretta, anche se non efficiente

dopo iMA(...) e le operazioni con esso, dovete chiamare IndicatorRelease se non ne avete più bisogno

La funzione IndicatorRelease() serve a rilasciare l'indicatore dalla memoria del computer, a cui viene passato questo handle dell'indicatore.

E un handle di indicatore può essere creato ovunque, eccetto OnDeinit. Preoccupatevi solo di "cosa fare in caso di errore di creazione".

 
@Vladimir Karputov @Maxim Kuznetsov Colla o chiodo? )) Compito semplice - preparazione complessa, è stato fatto in mql4 per uno o due. Quindi, come faccio a raccogliere i dati di bolinger per diversi timeframe e periodi di media in un array senza errori?
 
Николай К:
@Vladimir Karputov @Maxim Kuznetsov Inchiodare o inchiodare? )) Compito semplice - preparazione complessa, in mql4 è stato fatto in un due. Quindi, come faccio a raccogliere i dati di bolinger per diversi timeframe e periodi di media in un array senza errori?

Hai capito bene, hai appena mangiato tutte le maniglie, è una risorsa esauribile... devi liberarle.

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

vedere come fxsaber l'ha fatto nelle sue librerie, per rendere più facile il passaggio dal 4 al 5

 
MakarFX:
La prima cosa che mi viene in mente è controllare il funzionamento dell'indicatore e poi guardare l'EA

Non ci trovo niente, nell'indicatore non ci sono linee come - uscite se..., ogni tick viene elaborato, e nel robot viene ogni tick.

L'intero m1 non ha alcun segnale fino a quando la barra cambia e un nuovo segnale, richiamare il segnale tutti i tick stanno guardando, l'elaborazione di una nuova barra non è.

E vi ricordo che devo testare in 3 terminali contemporaneamente. Sarò sepolto con 3 terminali in mano.

 
Fast235:

Non ci trovo niente, nell'indicatore non ci sono linee come - uscite se..., ogni tick viene elaborato, e nel robot viene ogni tick.

L'intero m1 non ha alcun segnale fino a quando la barra cambia e un nuovo segnale, richiamare il segnale tutti i tick stanno guardando, l'elaborazione di una nuova barra non è.

Il robot non ha alcun segnale in tutti i suoi aspetti.

Forse nell'indicatore il segnale solo quando la barra cambia...

Meglio vedere il codice, naturalmente.

 
Ciao Artem!
Sono invidioso di vedere quanto velocemente i compagni in MQL5 codificano usando CTrade e altre classi, originariamente costruite in MT5.
A causa di varie circostanze, devo codificare in MQL4 e inventare i miei costrutti imbarazzanti.
Forse, c'è già un tale insieme di classi per MQL4?
Grazie in anticipo)