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

 

Non ho suggerito una calcolatrice o Excell per niente. Aiuta a capire come funziona questa merda. Potete usare un numero di elementi diverso da zero per calcolare solo se avete già un array pronto. Supponiamo che abbiate un array di 1000 elementi e che vogliate fare la media solo degli ultimi 100. Abbiamo due scelte: convertire questi 100 elementi in un array personalizzato e ricalcolarli, o usare il ciclo da 100 a 0 e non convertire il numero di elementi in 0, ma in 100.

Ma qui affrontiamo il problema di cambiare la dimensione dell'array, che è inevitabile negli indicatori.

Di nuovo, stavo parlando di altri modi per limitare il numero di elementi per il calcolo. Bene, puoi impostare la condizione iMAOnArray() solo se(rates_total-i >= rates_total-100); e solo le ultime 100 barre saranno ricalcolate e tutto andrà bene quando arriva una nuova barra.

int i, limit;
   limit = prev_calculated == 0 ? rates_total-1 : rates_total-prev_calculated;

   for(i = limit; i >= 0; i--)
     {
      Buffer[i]=open[i];
      if(rates_total-i >= rates_total-100)
      BufferMA[i] = NormalizeDouble(iMAOnArray(Buffer, 0, 5, 0, MODE_LWMA, i), _Digits);
      
     }

return(rates_total);


 
Alexey Viktorov:

Non ho suggerito una calcolatrice o Excell per niente. Aiuta a capire come funziona questa merda. Potete usare un numero di elementi diverso da zero per calcolare solo se avete già un array pronto. Supponiamo che abbiate un array di 1000 elementi e che dobbiate fare la media solo degli ultimi 100. Abbiamo due scelte: convertire questi 100 elementi in un array personalizzato e ricalcolarli, o usare il ciclo da 100 a 0 e non convertire il numero di elementi in 0, ma in 100.

Ma qui affrontiamo il problema di cambiare la dimensione dell'array, che è inevitabile negli indicatori.

Di nuovo, stavo parlando di altri modi per limitare il numero di elementi per il calcolo. Bene, impostate la condizione per leggere iMAOnArray() solo se(rates_total-prev_calculated-i >= 100); e solo le ultime 100 barre saranno ricalcolate e tutto andrà bene quando arriva una nuova barra.


Dimmi, sei un programmatore o lo fai per hobby o per necessità? Non ho bisogno di un excel o di un pezzo di carta per capire come funziona, e Barabashka ha dimostrato tutte le "difficoltà" nello screenshot di prima. Andiamo in ordine.

1. iMAOnArray (così come iBandsOnArray) può funzionare in due versioni, può leggere l'intero array e farlo correttamente (ma rallenta durante il calcolo primario) o può leggere una parte dell'array, ma lo farà solo per gli elementi iniziali, nonostante il fatto che lo spostamento sia specificato per quelli finali. Cioè comunque ho cercato di limitare il calcolo alle barre che ho ancora bisogno di calcolare o tutto l'array (cioè la versione iniziale della "frenata"), o di inventare una variante simile alla tua con la copia del buffer e il ricalcolo di tutti gli elementi di questo buffer, che, come descritto nei miei post precedenti, non dà il risultato giusto per i metodi di lisciatura complessi e aumenta anche il tempo di elaborazione dei dati in generale.

2. il problema, descritto da te negli indicatori con il ridimensionamento dell'array, si verifica solo se l'array non è uno dei buffer dell'indicatore, cioè il tuo descritto "ballare intorno" ha anche un effetto negativo, perché tornando al codice sorgente primario il problema era solo nel calcolo lento e solo al primo passo.

3. La variante offerta da voi con il ricalcolo solo di una parte degli array su 100 (N) barre, dà di nuovo una perdita di produttività generale e problemi inutili di implementazione con la copia degli array o il ricalcolo non necessario. Inoltre nel tuo screenshot e nel codice sopra tutti i calcoli sono fatti (sospetto da qualche parte nell'array interno, questo è molto probabilmente il motivo per cui si verificano i ritardi primari), altrimenti in questo tipo di smoothing i primi risultati riempiti sarebbero diversi, e tu semplicemente non hai riempito l'array del buffer con loro. Perché 0 nel parametro della dimensione dell'array per calcolare la funzione gli dice esplicitamente di leggere tutti i dati, questa è la fregatura.

L'unico modo per farlo bene è usare la mia funzione, che lavorerà come dovrebbe e non ricalcolerà tutti i dati (N parte di essi) quando arriva una nuova barra, ma li leggerà soltanto, soprattutto perché ho e uso una tale funzione di mediazione in molti dei miei prodotti. La domanda di questo argomento del forum era come "battere" le funzioni standard di MT4, senza peggiorare la velocità di elaborazione e il risultato. Se credo al messaggio di cui sopra,la "deviazione standard" sull'array è calcolata senza freni, o come ripiego posso scrivere il mio calcolo della deviazione, tanto più che le formule di calcolo sono disponibili per tutti qui nella documentazione.

 

Così tante lettere... Ed è tutto finalizzato unicamente a dissentire dall'opzione proposta.

Grazie per l'idea, almeno ho capito come funziona, altrimenti non mi sono addentrato nella complessità di queste funzioni perché non ne avevo bisogno.

Se non ti piace, usa quelli scritti da te.

 
Alexey Viktorov:

Così tante lettere... E tutto è finalizzato esclusivamente al disaccordo con l'opzione proposta.

Grazie per l'idea, almeno ho capito come funziona, altrimenti non sono entrato nella complessità di queste funzioni perché non ne avevo bisogno.

Se non ti piace, usa quelli scritti da te.

Perché su disaccordo, per spiegare perché non si dovrebbe fare così, perché scrivere il codice legato alle funzioni di stallo o il codice che crea ulteriori cicli di copia - non è sempre l'opzione giusta, anche se, a volte, e meno tempo :)
E non si tratta di "mi piace"/"non mi piace", ma del fatto che le funzioni non funzionano esattamente come dovrebbe, perché in effetti, creare degli analoghi è come reinventare la ruota, ma in questo caso particolare non possiamo farne a meno.

Ho fatto delle conclusioni per me stesso diverse pagine fa, ma il tuo modo, forse, aiuterà qualcuno a capire che questa situazione è già stata risolta qui, e cosa devo fare per risolvere questo problema, tante lettere :)

 

In quest'ultima variante non c'è copia o cicli extra. E il metodo di calcolo MODE_LWMA di cui tu e Dimitri parlavate prima non può essere ricalcolato correttamente.

Guarda il codice e lo screenshot. Nello screenshot, periodo MA 5 come nel codice, metodo MODE_LWMA e fate attenzione al numero di barre calcolate, alla coincidenza dei valori MA e indicatore con iMAOnArray() nel basamento. Se volete ricalcolare tutte le barre o solo 100. Se non ci sono cambiamenti, significa che altri calcoli sono lenti.

 
Un vero peccato!
 
Sergey Efimenko:

Dimmi, sei un programmatore o lo fai per hobby, o per necessità...?

In passato, iniziava a farfugliare che non era un programmatore, ma un dilettante e quindi poteva essere vittima di bullismo.
 
Alexey Viktorov:

In quest'ultima variante non c'è copia o cicli extra. E il metodo di calcolo MODE_LWMA di cui tu e Dimitri parlavate prima non può essere ricalcolato correttamente.

Guarda il codice e lo screenshot. Nello screenshot, periodo MA 5 come nel codice, metodo MODE_LWMA e fate attenzione al numero di barre calcolate, alla coincidenza dei valori MA e indicatore con iMAOnArray() nel basamento. Se volete ricalcolare tutte le barre o solo 100. Se non ci sono cambiamenti, significa che altri calcoli sono lenti.

Quest'ultima variante è essenzialmente la stessa di quella originale. Come ho scritto prima con la dimensione 0 dell'array, è ancora contato come un intero. La mia prima soluzione per ridurre il tempo di calcolo, anche prima della creazione del thread del forum, è stata quella di limitare il numero di barre ma, purtroppo, non ha influito sulla produttività; poi ho iniziato a sperimentare con la lunghezza dell'array per iMAOnArray e questo è quando ho capito la complessità della situazione. È stato allora e solo allora, dopo aver provato quasi tutte le varianti facili, compreso il cambiamento dell'indicizzazione dell'array per diverse combinazioni, che ho creato questo argomento. Bene, dopo di che ho ricevuto alcune risposte, alcune delle quali confermavano che anche altri li avevano provati e tutti avevano trovato la loro funzione. Ecco perché ho chiesto il tuo codice, inizialmente sapendo che avrebbe funzionato :) Senza offesa :) Forse alcuni utenti supereranno questo "rastrellamento" leggendo questo thread. :)
 
Dmitry Fedoseev:
In passato, lui stesso cominciava a blaterare che non era un programmatore, ma un dilettante, e che quindi era libero di rintanarsi.

Era più una domanda retorica :)

PS Signori, cerchiamo di essere tolleranti gli uni con gli altri. Dopo tutto, siamo tutti qui per una ragione: "fregare" il mercato. :) Quindi andiamo verso questo obiettivo senza distrazioni. Ognuno di noi ha le proprie difficoltà, e caratteristiche di percezione, ma solo in una disputa nata verità, anche se come Napoleone diceva: "Discutere, sapendo che hai torto - stupido, discutere, sapendo che hai ragione media. Ecco perché non discuto mai".

 
Sergey Efimenko:
Quest'ultima opzione non è essenzialmente diversa dall'originale. Come ho già scritto, quando la dimensione dell'array è 0, viene ancora contato nella sua interezza. La mia prima soluzione, anche prima della creazione del thread del forum, è stata quella di limitare il numero di barre, ma purtroppo non ha influito sulla produttività; poi ho iniziato a sperimentare con la lunghezza dell'array per iMAOnArray e lì ho visto la complessità della situazione. È stato allora e solo allora, dopo aver provato quasi tutte le varianti facili, compreso il cambiamento dell'indicizzazione dell'array per diverse combinazioni, che ho creato questo argomento. Bene, dopo di che ho ricevuto alcune risposte, alcune delle quali confermavano che anche altri li avevano provati e tutti avevano trovato la loro funzione. Ecco perché ho chiesto il tuo codice, inizialmente sapendo che avrebbe funzionato :) Senza offesa :) Forse alcuni utenti supereranno questo "rastrellamento" leggendo questo thread. :)

Stai dicendo che dopo if(rates_total-i >= rates_total-100);, quando ci sono solo 100 barre rimaste da calcolare, la funzione iMAOnArray() ricalcola prima TUTTO l'array?