Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 33

 
Artyom Trishkin:

Evidenziato può restituire 0. BCS ha incontrato.

Sì, broker disonesti. Ci mettevano anche i numeri negativi.

Sarebbe bene che gli sviluppatori avessero un limite di valori possibili per ogni parametro quando i broker impostano i simboli.

 
Artyom Trishkin:

Cosa c'è esattamente che non va? Questa era la domanda - cosa sto facendo di sbagliato per ottenere i dati degli indicatori da un timeframe non nativo?

Esempio: l'indicatore viene eseguito su M1, e i dati di AO dovrebbero essere ottenuti da M5. Così, mentre abbiamo limite>1 (la storia deve essere ricalcolata), AO da M5 restituisce zero con assenza di errore di dati. Non appena la storia viene calcolata (limit==0), i dati iniziano ad arrivare da AO con M5.

Per cominciare - non c'è bisogno di fare queste voci:

periodForWork=PeriodForWork;

All'inizio pensavo che stessi assegnando una variabile al suo stesso valore.

Il prossimo:

size_ao=CopyBuffer(handle_ao,0,0,count,array_ao);

Non c'è bisogno di copiare durante l'inizializzazione. L'inizializzazione non serve a questo scopo. Inoltre, questo record non sarà significativo quando si richiedono dati da TF più vecchi, che al momento della richiesta da OnInit() non saranno ancora calcolati.

ArraySetAsSeries(BufferAO,true);

Ma questa registrazione è sufficiente per essere fatta solo una volta nella fase di inizializzazione.

Inoltre... um... Soggettivamente, non è così che farei io.

Mi piace dividere il programma in:

1. Prima esecuzione (analisi della storia);

2. Corse successive:

2.1. ogni spunta;

2.2. La barra formata;

Cioè

if( prev_calculated > 0 )             // Не первый запуск
{
 if( rates_total <= prev_calculated ) // Новый бар не сформирован
  {
  }
 else                                 // Новый бар сформирован
  {
  }
}
else                                  // Первый запуск
{
}

E solo dopo - ciclo di calcolo principale (funzione).

Le vostre funzioni di copia danno errori non informativi. Il codice non è molto buono.

Non c'è controllo della sincronizzazione dei dati del vecchio TF.

E la cosa più importante qui è capire la sequenza. Consiglio di creare un indicatore di prova, in modo che richieda solo i dati del TF maggiore al primo avvio e per capire come viene fatta la copia. Cioè rimuovere questo dall'inizio del codice:

ArraySetAsSeries(array_ao,true);

E disattiva il primo e l'ultimo elemento dell'array. E solo allora, se necessario, cambiare la direzione dell'indicizzazione.

 
Comunque, comincia da lì:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input   ENUM_TIMEFRAMES inpTimeframe=PERIOD_M5;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int _handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   _handle=iAO(_Symbol,inpTimeframe);
   if(_handle==INVALID_HANDLE)
     {
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),"! Хэндл индикатора iAO ТФ "+EnumToString(inpTimeframe)+" не получен!");
      return( INIT_FAILED );
     }
//---
   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[])
  {
//--- Массив-приемник значений индикатора
   double ao[];
//---
   if(prev_calculated>0)
     {

     }
   else                                        // Если первый запуск
     {
      //--- Количество просчитанных баров старшего ТФ
      int bars;
      if(( bars=BarsCalculated(_handle))<0 || !(bool)SeriesInfoInteger(_Symbol,inpTimeframe,SERIES_SYNCHRONIZED))
         return( 0 );
      //--- 
      int num=CopyBuffer(_handle,0,0,bars,ao);
      //---
      if(num<0)
        {
         Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": Запрашиваемая таймсерия еще не построена!");
         return( 0 );
        }
      else if(num!=bars)
        {
         Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": Скопированы не все данные (",num," из ",bars,")");
         return( 0 );
        }
      //---
      Print(__FUNCTION__,": Успех! Скопировано ",num," из ",bars," значение индикатора АО ТФ "+EnumToString(inpTimeframe));
     }
//---
   return( rates_total );
  }
//+------------------------------------------------------------------+
 
Alexey Kozitsyn:

Per cominciare - non c'è bisogno di fare queste voci:

All'inizio ho pensato che stessi assegnando ad una variabile il proprio valore.

Il prossimo:

Non c'è bisogno di copiare durante l'inizializzazione. L'inizializzazione non serve a questo scopo. Inoltre, questo record non sarà significativo quando si richiedono dati da TF più vecchi, che al momento della richiesta da OnInit() non saranno ancora calcolati.

Ma questa registrazione è sufficiente per essere fatta solo una volta nella fase di inizializzazione.

Inoltre... um... Soggettivamente, non è così che farei io.

Mi piace dividere il programma in:

1. Prima esecuzione (analisi della storia);

2. Corse successive:

2.1. ogni spunta;

2.2. La barra formata;

Cioè

E solo dopo - ciclo di calcolo principale (funzione).

Le vostre funzioni di copia danno errori non informativi. Il codice non è molto buono.

Non c'è controllo della sincronizzazione dei dati del vecchio TF.

E la cosa più importante qui è capire la sequenza. Consiglio di creare un indicatore di prova, in modo che richieda solo i dati del TF principale al primo avvio e per capire come viene fatta la copia. Cioè rimuovere questo dall'inizio del codice:

E disattiva il primo e l'ultimo elemento dell'array. E solo allora, se è necessario, cambiare la direzione dell'indicizzazione.

Faccio delle variabili che mi sono chiare a colpo d'occhio. Se non li capite, fateli in un modo in cui li capite ;).

Inizio sempre a scrivere le variabili non globali con una lettera minuscola - la ragione è semplice: l'intelligenza maiuscola...

Questo è il codice di test, poiché il codice non-test è abbastanza grande, e su MT4 vola quando si cambia il traf, e non ci sono errori di dati mancanti - tutto è sempre lì. Ma MT5 quando passo mtf solo per mezzo minuto carica la storia, e poi non funziona con i dati non è il suo TF - dice circa la loro assenza.

Ecco perché ho discusso su cosa stavo facendo di sbagliato. Si è scoperto che è necessario richiedere i dati per tutti i client utilizzati nell'init. Penso che se non si conosce in anticipo il numero stimato di telefoni usati, è necessario richiederli tutti. Solo uno per mezzo minuto conta. Ce ne sono 21 in totale...

C'è di nuovo qualcosa che non va?

 
Questo è molto utile per iprincipianti:

In MT5 ci vuole solo mezzo minuto per scaricare la storia quando si cambia un etf


ha scritto su di esso

я правильно понимаю тогда, что подготовив кэш,терминал при последующих обращениях (начиная со 2 обращения) затрачивает на порядки меньше времени?

можно ли как-то уменьшить время первого обращения после перезагрузки терминала,чтобы было как в МТ4?
Теперь выводы:

    Разница только в скорости начальной инициализации кеша чарта 0.6 мс МТ4 против 113 мс у МТ5

maggiori dettagli qui

https://www.mql5.com/ru/forum/1111/page1871#comment_4866969

https://www.mql5.com/ru/forum/1111/page1871#comment_4867939

Questo è e sarà. Più TF o simboli richiederà, più lento sarà l'inizio.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:


ha scritto su di esso

maggiori dettagli qui

https://www.mql5.com/ru/forum/1111/page1871#comment_4866969

https://www.mql5.com/ru/forum/1111/page1871#comment_4867939

Più TF o personaggi sono interrogati, più lento sarà l'avvio.

Penso che sarebbe bello se solo quando l'indicatore viene avviato per la prima volta. Devo cambiare il timeframe e ci vuole mezzo minuto per caricare la cronologia. So che non dovrebbe essere così, ma... Sto facendo qualcosa di sbagliato... E solo su un indicatore succede - quando cerco di accedere a un timeframe non nativo.
 
Artyom Trishkin:
Sarebbe bello se solo quando avvio l'indicatore per la prima volta. Ho mezzo minuto di caricamento della cronologia ogni volta che cambio di orario. So che non dovrebbe essere così, ma... Sto facendo qualcosa di sbagliato... Sto cercando di accedere a un timeframe non nativo in un solo indicatore.

Bene, misurate la velocità di copia dei dati da un altro periodo e vedete dov'è il collo di bottiglia.
 
Artyom Trishkin:

Se hai bisogno di usare diversi indicatori da diversi TF per i calcoli - hai bisogno di ottenere la maniglia di ogni TF.

Se volete che sia più veloce, riducete la dimensione della cronologia nel terminale.

Hai eseguito il mio indicatore di prova? Sta raccogliendo dati?

 
Alexey Kozitsyn:

Se hai bisogno di usare diversi indicatori da diversi TF per i calcoli - hai bisogno di ottenere la maniglia di ogni TF.

Se volete che sia più veloce, riducete la dimensione della cronologia nel terminale.

Hai eseguito il mio indicatore di prova? Sta raccogliendo dati?

No, non l'ho fatto.

Risulta che se avete bisogno di TUTTI i timeframe, dovreste creare 21 maniglie dell'indicatore AO? Non è uno spreco?

 
Artyom Trishkin:

No, non l'ho ancora eseguito.

Risulta che se avete bisogno di TUTTI i timeframe, dovete creare 21 maniglie di indicatori AO? Non è uno spreco?

Come posso ottenere i dati dal simbolo/TF giusto? CopyBuffer funziona solo con gli handle.
Motivazione: