Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Il dispiegamento delle normali funzioni è una cosa ovvia
cioè per esempio per (int i=0; i<ArraiSize(max); i++)
qui ArraiSize(max); sarà espanso e otterrà qualcosa come l'indirizzo alla dimensione dell'array dato (se guardiamo l'array, ha la sua dimensione in una variabile, e qui abbiamo la sostituzione su questa variabile "indirizzo in memoria") cioè non ha senso cambiarla in una variabile, affatto
per (int i=0; i<ArraiSize(max); i++)
и
per (int i=0; i<size; i++ )
In questo caso ArraiSize(max) e size hanno gli stessi tempi per determinare la dimensione dell'array
dichiarazione errata
testato: l'ho provato 1000 volte, 3 array e 3 loop annidati in ogni array, 2 varianti: la 1a e la 2a
il risultato è stabile (testato 3 volte):
2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=114.5013
2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=99.7722
In questo ciclo di esempio, non credo di essere d'accordo sui tempi.
Al contrario, si raccomanda di ottenere il risultato in una variabile di dimensione e di usarla nella condizione.
Poiché il ciclo ad ogni iterazione perArraiSize(max) si snoderà inutilmente, rallentando l'esecuzione del ciclo.
La funzione ArraiSize(max) espande e restituisce la cella con il record di lunghezza dell'array; viene restituitol'indirizzo della cella dove è memorizzata la lunghezza dell'array
e ciò che è qualsiasi variabile, in questo caso la dimensione - è l'indirizzodella cella dove è memorizzata la lunghezza dell'array
Così, otteniamo la stessa cosa in uscita e anche se cambiamo la dimensione dell'array nel processo del ciclo, l'indirizzo per cella non cambierà né nel primo né nel secondo caso.
Dato che il valore mas è sempre statico (non è un riferimento), semplicemente non ci può essere altra logica))
La stessa funzione ArraiSize(max), dice che una sezione di memoria nell'arraymax dovrebbe essere usata per la lunghezza dell'array; questo viene eseguito in fase di compilazione - distribuzione della funzione
dichiarazione errata
testato: misurazione 1000 volte, 3 array e 3 cicli di forza bruta annidati su ogni array, 2 varianti: 1st e 2nd
il risultato è stabile (testato 3 volte):
2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=114.5013
2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=99.7722
poi alcuni problemi con il build....
allora ci sono alcuni problemi con l'assemblaggio....
È chiaro che l'output è lo stesso.
Ma questa sezione di memoria sarà accessibile in modo diverso, questo era il punto.
L'accesso a una variabile è più veloce che a una funzione, poiché la variabile contiene già il valore.
E una funzione deve ancora recuperare questo valore e restituirlo, cioè fare riferimento a una cella di memoria, un'istruzione non necessaria.
L'esempio di Igor è solo una conferma di quello che stavo dicendo.
poi alcuni problemi con il montaggio....
mentito
ArraySize() è chiamato ad ogni iterazione
anche se non si controlla la dimensione dell'array ogni volta, si ottiene comunque una chiamata alla procedura e almeno un controllo della variabile che memorizza la dimensione dell'array
questo è il test di cui sto scrivendo, ridimensioniamo l'array nel ciclo, il ciclo è interrotto come dovrebbe essere, cioè ad ogni iterazione del ciclo la dimensione dell'array è determinata dopo l'esecuzione del corpo del ciclo:
mentito
ArraySize() è chiamato ad ogni iterazione
anche se la dimensione dell'array non viene controllata ogni volta, la procedura viene comunque chiamata e almeno la variabile che memorizza la dimensione dell'array viene controllata
Ecco il test di cui sto scrivendo: ridimensioniamo l'array nel ciclo, il ciclo viene terminato come previsto, cioè ad ogni iterazione del ciclo la dimensione dell'array viene definita dopo l'esecuzione del corpo del ciclo:
Dammi il codice completo del tuo test.
È chiaro che otteniamo la stessa cosa nell'output.
Ma questo frammento di memoria sarà recuperato in modo diverso, ecco cosa intendo.
L'esempio di Igor è solo una conferma di quello che stavo dicendo.
E tu stesso hai condotto il test, sono a 110000000000000000000 qualcosa del genere non succede.
La funzione ArraiSize(max) è espansa, prende una cella con il record di lunghezza dell'array e lo restituisce, l'indirizzo della cella dove è registrata lalunghezza dell'array
e ciò che è qualsiasi variabile, in questo caso la dimensione - è l'indirizzodella cella dove è memorizzata la lunghezza dell'array
Così, otteniamo la stessa cosa in uscita e anche se cambiamo la dimensione dell'array nel processo del ciclo, l'indirizzo per cella non cambierà né nel primo né nel secondo caso.
Dato che il valore mas è sempre statico (non è un riferimento), semplicemente non ci può essere altra logica))
La stessa funzione ArraiSize(max) dice che dovremmo usare un'area di memoria nell'arraymax responsabile della lunghezza dell'array e questo viene eseguito in fase di compilazione - distribuzione della funzione
Questa opinione sembra essere prematura. Cosa succede esattamente dietro la funzione ArraiSize è sconosciuto, vero? È una scatola nera in MQL. È abbastanza possibile che for (int i=0; i<ArraiSize(max); i++) porti all'esecuzione di diverse istruzioni. Per esempio, una funzione può controllare i parametri di ingresso. Salvare - spingere i dati fuori dallo stack. Salva i registri. Ripristinare i registri. Chiamata di funzione - chiamata, poi ritorno. Quello che voglio dire è che molte cose possono accadere sullo sfondo e noi non possiamo vederle. Ecco perché è meglio usare for (int i=0; i<size; i++) e non fare affidamento sul compilatore per fare ciò che ci aspettiamo che faccia.
Hai fatto tu stesso il test, io non ce l'ho a 110000000000000000000
È stato testato molto tempo fa, ecco perché uso solo le variabili nei cicli.
Questo è stato testato molto tempo fa, quindi uso solo le variabili nei cicli.
Mostrami un test con il codice
Mostrami il test del codice
Quale test? ))
Hai mostrato tu stesso entrambe le varianti della condizione del ciclo.
Anche Igor ha dato il codice qui sopra.
Basta misurare l'esecuzione del ciclo con la variabile size e con ArraySize() nella condizione del ciclo.