MT4 iMAOnArray e iBandsOnArray effetto del numero di elementi sui calcoli

 

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 turni, ottengo solo i 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?

 
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?

Datemi un esempio di codice per capire bene la domanda.
 
Alexander Voronkov:
Datemi un codice di esempio per comprendere appieno la domanda.

questo funziona bene:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i)

questo non funziona bene:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

 
Sergey Efimenko:

questo funziona bene:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

questo non funziona normalmente:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

Per risparmiaretempo e contare solo le ultime 300(barre sul grafico) usate gli operatori for() o if().
 
Alexander Voronkov:
Per risparmiaretempo e contare solo le ultime 300(barre sul grafico) usate i valori degli operatori for() o if().

Come posso dirlo con delicatezza... Hai idea di cosa stai parlando? Avete mai usato le funzioni menzionate nel titolo nel vostro codice e provato a calcolare una parte di un array piuttosto che l'intero array? Beh, provate e forse capirete "visivamente" di cosa stiamo parlando. La tua offerta è rilevante quando si calcolano le barre o altre situazioni in cui è possibile specificare esplicitamente quanto contare, ma non per un array utilizzando queste funzioni. La parte di codice sopra è assolutamente identica, l'unica differenza è che nel primo caso sto contando l'intero array, e nel secondo sto contando solo 300 dei suoi valori, ma i valori sono contati alla fine dell'array, mentre i riferimenti sono usati all'inizio. Forse non sto descrivendo chiaramente la situazione, ma il codice aiuterà a vedere questo se lo si attacca a qualche indicatore e si confronta il risultato...

PS Sulla versione "auto-scritta" degli analoghi di funzioni alternative è chiaro, ma vorrei ottenere il risultato richiesto per mezzo di un linguaggio.

 
Sergey Efimenko:

Come posso dirlo con delicatezza... Hai idea di cosa stai parlando? Avete mai usato le funzioni menzionate nel titolo nel vostro codice e provato a calcolare una parte di un array piuttosto che l'intero array? Beh, provate e forse capirete "visivamente" di cosa stiamo parlando. La tua offerta è rilevante quando si calcolano le barre o altre situazioni in cui è possibile specificare esplicitamente quanto contare, ma non per un array utilizzando queste funzioni. La parte di codice sopra è assolutamente identica, l'unica differenza è che nel primo caso sto contando l'intero array, mentre nel secondo sto contando solo 300 dei suoi valori, ma i valori sono contati alla fine dell'array, mentre i riferimenti sono usati all'inizio. Forse non sto descrivendo chiaramente la situazione, ma il codice aiuterà a vedere questo se lo si attacca a qualche indicatore e si confronta il risultato...

PS Circa gli analoghi di funzioni alternative "auto-scritte" è chiaro, ma vorrei ottenere il risultato desiderato per mezzo di un linguaggio.

Basta dire le cose come stanno, va bene così.

Quindi ti ho frainteso.

 
Nessuno usa queste funzioni e affronta questa situazione?
 
Sergey Efimenko:

questo funziona bene:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,0,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,0,PeriodBands,DevBands,0,MODE_MAIN,i);

questo non funziona normalmente:

Buffer[i]=GetValue(i);
BufferMA=iMAOnArray(Buffer,300,PeriodMA,0,MethodMA,i);
BufferBMA[i]=iBandsOnArray(Buffer,300,PeriodBands,DevBands,0,MODE_MAIN,i);

Cosa vi aspettate che sia il risultato e come dovrebbe funzionare normalmente?
 
Alexey Viktorov:
Cosa vi aspettate che sia il risultato e come dovrebbe funzionare normalmente?
Cosa vuoi dire, cosa mi aspetto? Ho scritto sopra, che ho bisogno degli ultimi (attuali) 300 valori effettivi, e non dei primi 300 (iniziali), inoltre, che accedo a un array all'offset 299-0, ma ottengo dati all'offset da "fine dell'array" a "fine dell'array - 300" valori (nel mio caso da 4999 a 4700), il che significa, all'offset 299 è il valore che dovrebbe essere all'offset 4999 e analogamente all'offset 0 è il valore, che dovrebbe essere all'offset 4700. Quando si riduce il numero di calcoli dell'array, è importante ottenere non i dati storici iniziali, ma i dati attuali; la domanda è: qual è lo scopo di calcolare i valori più vecchi, mentre i valori attuali non vengono calcolati?
 
Sergey Efimenko:
Cosa intendi per "cosa mi aspetto"? Ho scritto che ho bisogno di 300 ultimi valori attuali (attuali), non 300 primi (iniziali), inoltre, che accedo a un array all'offset 300-0, ma ottengo i dati all'offset da "fine dell'array" a "fine dell'array - 300" valori (nel mio caso da 4999 a 4700), cioè, all'offset 300 è il valore che dovrebbe essere all'offset 4999 e allo stesso modo all'offset 0 è il valore che dovrebbe essere all'offset 4700. Quando si riduce il numero di calcoli dell'array, è importante ottenere dati attuali invece di dati storici iniziali, la domanda è: qual è lo scopo di calcolare i valori più vecchi quando i valori attuali non sono calcolati?

ArraySetAsSeries() aiuta?

Ho affrontato una volta una cosa del genere - non ho potuto vincere, così ho rinunciato. L'ho fatto senza iMAOnArray().

 
Artyom Trishkin:

ArraySetAsSeries() aiuta?

Ho affrontato una volta una cosa del genere - non ho potuto vincere, così ho rinunciato. L'ho fatto senza iMAOnArray().

Questo è il problema - l'array è inizialmente un buffer "seriale". Il problema è nel limitare il numero di calcoli, come ho già scritto, i dati sono normali quando si utilizza il calcolo dell'intero array ma rallenta il terminale durante l'inizializzazione e ancora più difficile quando si utilizzano diversi indicatori per diversi timeframe, per non parlare dell'ottimizzazione di un EA per tale indicatore; il problema è di natura interna a MT4, cioè l'unica soluzione è quella di utilizzare il proprio analogo delle funzioni specificate ma voglio evitarle

PS Io uso anche il mio analogo di iMAOnArray, ma non sarò solo io ad avere il codice sorgente. Anche se è possibile usare le librerie, iBands è anche necessario, ma il calcolo delle deviazioni dovrà essere fatto. In generale è un peccato che questa sia la situazione delle funzioni standard.

Motivazione: