MT4 iMAOnArray e iBandsOnArray effetto del numero di elementi sui calcoli - pagina 3

 
Alexey Viktorov:

No, Vladimir. È un po' sbagliato.

In questo caso, dovreste applicare ArraySetAsSeries(array, false); a un array di trecento elementi tra i quali è considerato iMAOnArray(). Ma è meglio usare CopyOpen() invece del ciclo di riempimento dell'array.

Da quanto ho capito, in questa variante sarà meglio

Il modo in cui è stato impostato il compito, è così che l'ho dimostrato. È venuto fuori molto bene. E poi tu stesso :)
 
Alexey Viktorov:

No, Vladimir. È un po' sbagliato.

In questo caso, dovreste applicare ArraySetAsSeries(array, false); a un array di trecento elementi tra i quali è considerato iMAOnArray(). Ma è meglio usare CopyOpen() invece del ciclo di riempimento dell'array.

Da quanto ho capito, in questa variante sarà meglio

Quindi mostrami la variante "funzionante" del codice, il codice sorgente dell'originale è qui, stai cercando di ridurlo a 12 elementi invece dei trecento richiesti, e alla fine dovrebbe risultare in 3 buffer di indicatori con i dati specificati per visualizzare almeno 300 elementi nel seminterrato, E poi, quando arriva una nuova barra, rispettivamente, 301 e poi il valore sarà disegnato, ma non dimenticate che in questo caso, se usate 0 come limite per il calcolo, solo la nuova barra sarà ricalcolata, e il tipo di media (smoothing) per il secondo buffer non è necessariamente SMA, e può essere qualsiasi dei 4 disponibili.
 
Sergey Efimenko:

Questa è la domanda. Se non ho bisogno di calcolare l'intero array, ma solo gli ultimi N elementi.

Non capisco bene la logica del calcolo di queste funzioni quando si limita. Ho un array di serie temporali (uno dei buffer degli indicatori), se lascio il numero di elementi uguale a 0, nessuna domanda, tutto viene contato e calcolato, ma se diminuisco il numero di elementi coinvolti nel calcolo degli stessi offset, ottengo solo quelli primari. In parole povere c'è un array di 5000 elementi (barre sul grafico), per risparmiare tempo ho bisogno di calcolare solo gli ultimi 300, ma quando ho specificato il valore 300 nel secondo parametro ho ottenuto 5000-4700 elementi primari, ma sull'offset 300-0, e gli ulteriori valori ad una chiamata non cambiano. Che senso ha usare questo parametro?

Il diavolo lo sa. Dimenticalo e basta. Se avete bisogno di accelerare i calcoli, riducete il numero di elementi da calcolare nel vostro ciclo.

if(prev_calculated==0)limit=300; else ...; 

Una delle due cose: o è impossibile o hai bisogno di una qualche combinazione segreta di direzioni di calcolo delle serie temporali e non delle serie temporali.

 
Dmitry Fedoseev:

Chi cazzo lo sa. Lascia perdere. Se volete accelerare i calcoli, riducete il numero di elementi da calcolare nel vostro ciclo.

Una delle due cose: o è impossibile o hai bisogno di qualche combinazione segreta di serie temporali, non serie temporali, direzione di calcolo.

Sì, come ho già scritto un po' prima, c'è solo una possibilità - usare i propri analoghi delle funzioni di cui sopra, che possono essere usati per calcolare almeno un elemento.

Il paradosso della situazione è che se facciamo un modello simile, sovrapponendo la media o le barre di bollinger su qualsiasi indicatore (linea di prezzo), non ci sarà un tale rallentamento del calcolo iniziale di tutte le barre della storia, come quando si usano queste funzioni nel codice, quando si riavvia il terminale o si cambia il TF, quindi non è chiaro, cosa ci vuole così tanto tempo per essere calcolato in queste funzioni.

 
Dmitry Fedoseev:

Chi cazzo lo sa. Lascia perdere. Se volete accelerare i calcoli, riducete il numero di elementi da calcolare nel vostro ciclo.

Una delle due cose: o è impossibile o hai bisogno di una qualche combinazione segreta di direzioni di calcolo delle serie temporali e non delle serie temporali.

Anche io ho usato una tale costruzione.

if (limit > 300)limit=300;

A proposito,"MovingAverages.mqh" è due volte più veloce di"iMAOnArray", anche la vecchia versione.

https://www.mql5.com/ru/forum/79988

Использование MovingAverages.mqh в MQL4
Использование MovingAverages.mqh в MQL4
  • www.mql5.com
При вызове в советнике индикатор работает корректно, но если его поместить в тело условного оператора "if", то советник не открывает сделок, хотя логика советника остается та же.
 
Sergey Efimenko:

Sì, come ho scritto poco prima, c'è solo un'opzione - usare i nostri analoghi delle funzioni menzionate dove è possibile calcolare almeno un elemento.

Il paradosso della situazione è che se facciamo un modello simile attaccando la MA e le bande di Bollinger a qualsiasi indicatore (linea di prezzo), non vedremo un tale rallentamento del calcolo iniziale di tutte le barre storiche, come quando si usano queste funzioni nel codice, quando si riavvia il terminale o si cambia il TF, quindi non è chiaro cosa ci voglia così tanto tempo per il calcolo in queste funzioni.

Sta rallentando anche quando si usa iMAOnArray? Non dovrebbe esistere una cosa del genere. Come voi, c'era un ritardo da StdOnArray (o BandsOnArray, non ricordo) gli sviluppatori non hanno ammesso l'esistenza del bug per molto tempo. Poi all'improvviso è stato aggiustato e ha funzionato velocemente. Chi lo sa, forse il bug è tornato. Se anche iMAOnArray() causa notevoli rallentamenti, si tratta di un bug. Sembra che se ne sia parlato un paio di mesi fa... Ma è ancora lì, a quanto pare.

 
Dmitry Fedoseev:

Il rallentamento anche dall'uso di iMAOnArray? Non dovrebbe essere così. Come voi una volta, c'era un rallentamento da StdOnArray, gli sviluppatori non hanno riconosciuto il bug per molto tempo. Poi l'hanno improvvisamente aggiustato e ha funzionato velocemente. Chi lo sa, forse il bug è tornato. Se anche iMAOnArray() causa notevoli rallentamenti, si tratta di un bug. Sembra che se ne sia parlato un paio di mesi fa... Ma è ancora lì, a quanto pare.

È difficile giudicare se "rallenta molto" o è accettabile, perché tutto dipende dalla lunghezza del grafico (numero di barre), la fregatura è che per l'ottimizzazione abbiamo solo bisogno di calcolare un po', ma limitare la lunghezza del calcolo in realtà è impossibile.
 
Sergey Efimenko:
È difficile giudicare se è troppo lento o no, perché tutto dipende dalla lunghezza del grafico (numero di barre), il problema è che per l'ottimizzazione devi calcolare solo un po', e non puoi limitare la lunghezza del calcolo con il calcolo effettivo.
Fate il calcolo suMovingAverages.mqh ed è molto veloce.
 
forexman77:
Fate il calcolo conMovingAverages.mqh e il calcolo sarà molto veloce.
E questa libreria calcola correttamente, se si imposta il calcolo non di tutta la matrice, ma solo della sua ultima parte (valori attuali)? Inoltre, è solo metà del problema, ma che dire di iBandsOnArray?
 
Sergey Efimenko:
Quindi mostrami la variante "funzionante" del codice, il codice originale è qui, che stai cercando di ridurre a 12 elementi visualizzati invece dei trecento richiesti da me, e dovrebbe finire con 3 buffer di indicatori con i dati specificati, in modo che almeno 300 elementi siano stati visualizzati nel seminterrato, E poi, quando arriva una nuova barra, rispettivamente, 301 e poi il valore sarà disegnato, ma non dimenticate che in questo caso, se usate 0 come limite per il calcolo, solo la nuova barra sarà ricalcolata, e il tipo di media (smoothing) per il secondo buffer non è necessariamente SMA, e può essere qualsiasi dei 4 disponibili.

Ecco a voi.

//+------------------------------------------------------------------+
//|                                         Test300AsSeriesFalse.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 clrYellow
#property  indicator_color2 clrGreen
#property  indicator_color3 clrRed
double Buffer[];
double BufferMA[];
double BufferBMA[];
bool firstrun=true;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   firstrun=true;
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMA,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBMA,INDICATOR_DATA);
//---
   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 i, limit;
   limit = rates_total-prev_calculated-1;
   double buffer[];

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
       ArrayCopy(buffer, Buffer, 0, i, 12);
      BufferMA[i] = iMAOnArray(buffer, 300, 12, 0, MODE_SMA, 0);
      BufferBMA[i] = iBandsOnArray(buffer, 300, 12, 2.0, 0, MODE_UPPER, 0);
      int x=0;
     }
   return(rates_total);
}
//+------------------------------------------------------------------+
Motivazione: