Quando faccio i test, confondo il codice il più possibile per evitare che l'ottimizzatore butti fuori dei cicli vuoti
avete
// for(int i = 0; i < 5; i++) sum += u.param[i];
L'ottimizzazione dell'esecuzione MQL può terminare il primo ciclo in anticipo, poiché i valori calcolati non vengono utilizzati, quindi qualcosa dovrebbe essere fatto dopo lo SpeedTest() con i risultati - questo ciclo
Ho controllato con il ciclo commentato, non l'ho buttato via, ma nell'altro test potrei andare in crash
La macro è una questione di gusto, l'ho provata molte volte e funziona, non vedo il senso di scrivere la stessa cosa a mano
UPD: trovato dove ho letto come funzionano i compilatori moderni ora, abbastanza informativo
Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.
Poi, è necessario ottenere i valori sulla barra di destra
//--- создадим хэндл индикатораif(type==Call_iRSI)
handle=iRSI(name,period,ma_period,applied_price);
//--- индикаторный буферdouble rsi_buffer[];
//--- заполняем часть массива iRSIBuffer значениями из индикаторного буфера под индексом 0if(CopyBuffer(ind_handle,0,0,amount,rsi_buffer)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iRSI, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
Leggete la guida, o cercate le risposte sul forum - sono molte
la differenza non è significativa, è altamente probabile che se cambiamo i test nell'ordine opposto, i risultati saranno opposti
non critico
non è affatto giusto includere rand() nel test poiché questa funzione consuma molte più risorse degli altri comandi. Penso che questo sarebbe un test più corretto:
#define Num 1000000#define SpeedTest(msg,s,EX) {ulong mss=GetMicrosecondCount(); EX \
mss=GetMicrosecondCount()-mss;\
printf("%-22s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
ulong sum = 0;
ushort in[];
ArrayResize(in,Num*2);
for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
SpeedTest("test binary shift : ", sum,
for (int i =0;i<(2*Num-1) && !_StopFlag;i+=2)
{
sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
});
//--
sum = 0;
union ushortTouint
{
uint param;
ushort in[2];
} u;
SpeedTest("test union : ", sum,
for (int i =0;i<(2*Num-1) && !_StopFlag;i+=2)
{
u.in[0]=in[i+1];
u.in[1]=in[i];
sum+=u.param;
});
}
Risultato:
2020.10.1517:14:03.168 TestMakanu (USDCAD,M1) test binary shift : 1384 µs; Сумма - 10744345820541982020.10.1517:14:03.169 TestMakanu (USDCAD,M1) test union : 1209 µs; Сумма - 10744345820541982020.10.1517:14:19.370 TestMakanu (USDCAD,M1) test binary shift : 1891 µs; Сумма - 10739246168449492020.10.1517:14:19.371 TestMakanu (USDCAD,M1) test union : 1289 µs; Сумма - 10739246168449492020.10.1517:14:20.949 TestMakanu (USDCAD,M1) test binary shift : 1342 µs; Сумма - 10731947888316532020.10.1517:14:20.950 TestMakanu (USDCAD,M1) test union : 1178 µs; Сумма - 10731947888316532020.10.1517:14:27.141 TestMakanu (USDCAD,M1) test binary shift : 1365 µs; Сумма - 10750172905531682020.10.1517:14:27.142 TestMakanu (USDCAD,M1) test union : 1362 µs; Сумма - 10750172905531682020.10.1517:14:28.202 TestMakanu (USDCAD,M1) test binary shift : 1354 µs; Сумма - 10750518179145632020.10.1517:14:28.203 TestMakanu (USDCAD,M1) test union : 1105 µs; Сумма - 1075051817914563
Per fortuna, alla fine l'ho messo sul cavallo sbagliato. I sindacati sono un po' più veloci. Sono più convenienti per lavorare e il codice è più leggibile.
è difficilmente corretto includere rand() nel test, poiché questa funzione è un ordine di grandezza più dispendioso in termini di risorse degli altri comandi.
per niente critico
Il tempo di esecuzione di rand() è costante, molto probabilmente è una comune funzione C++, cercate su google "rand c++ source code"
dovete inizializzarlo, ma se lo inizializzate con delle costanti potreste incontrare un'ottimizzazione
in generale, non capisco l'antipatia di rand()
un'opzione è quella di inizializzare con qualcosa come questo:
È improbabile che sia corretto includere rand() nel test, poiché questa funzione consuma un ordine di grandezza più risorse degli altri comandi. Penso che questo sarebbe un test più corretto:
Risultato:
Per fortuna, alla fine ho scommesso sul cavallo sbagliato. I sindacati sono un po' più veloci. Sono più convenienti per lavorare e il codice è più leggibile.
Una volta per una volta, e a distanza della prima vittoria, (come il primo metodo ha rimosso la linea di conversione da breve a qualcosa)
L'ho rielaborato un po
(è meglio non usare una macro in questo modo ;)
L'ho rielaborato un po
(quindi è meglio non usare macro ;)
Quando faccio i test, confondo il codice il più possibile per evitare che l'ottimizzatore butti fuori dei cicli vuoti
avete
// for(int i = 0; i < 5; i++) sum += u.param[i];L'ottimizzazione dell'esecuzione MQL può terminare il primo ciclo in anticipo, poiché i valori calcolati non vengono utilizzati, quindi qualcosa dovrebbe essere fatto dopo lo SpeedTest() con i risultati - questo ciclo
Ho controllato con il ciclo commentato, non l'ho buttato via, ma nell'altro test potrei andare in crash
La macro è una questione di gusto, l'ho provata molte volte e funziona, non vedo il senso di scrivere la stessa cosa a mano
UPD: trovato dove ho letto come funzionano i compilatori moderni ora, abbastanza informativo
https://habr.com/ru/post/431688/
https://habr.com/ru/post/47878/
il codice dà il valore iRSI di handles e tps sempre solo 10, ma i prezzi e il grafico cambiano, anche.
iRSI(_Symbol,PERIOD_H1,14,PRICE_CLOSE)
costruire 2652
il codice dà il valore iRSI di handles e tps sempre solo 10, ma i prezzi e il grafico cambiano, anche.
iRSI(_Symbol,PERIOD_H1,14,PRICE_CLOSE)
costruire 2652
Hai la maniglia dell'indicatore, è il 10
Poi, è necessario ottenere i valori sulla barra di destra
Leggete la guida, o cercate le risposte sul forum - sono molte
Hai la maniglia dell'indicatore, è il 10
Poi, è necessario ottenere i valori sulla barra di destra
Leggete la guida, o cercate le risposte sul forum - ce ne sono molte
Capito. Studierò i buffer. È strano, avevo la sensazione che tutto dovesse funzionare così com'è, forse l'ho confuso con mql4.
La cosa strana è che l'ho cercato su Google e non sono riuscito a trovarlo in mql5 per ottenere i dati dell'indicatore.
Aha, secondo il tuo esempio come ho capito il valore dell'indicatore RSI è alla fine in una variabile della seguente forma
controllato:
2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst 1 : : : loops=10000000000 ms=10864370
2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst 2 : : : loops=10000000000 ms=10862287
la differenza non è significativa, è altamente probabile che se cambiamo i test nell'ordine opposto, i risultati saranno opposti
non critico
non è affatto giusto includere rand() nel test poiché questa funzione consuma molte più risorse degli altri comandi.
Penso che questo sarebbe un test più corretto:
Risultato:
Per fortuna, alla fine l'ho messo sul cavallo sbagliato. I sindacati sono un po' più veloci. Sono più convenienti per lavorare e il codice è più leggibile.
è difficilmente corretto includere rand() nel test, poiché questa funzione è un ordine di grandezza più dispendioso in termini di risorse degli altri comandi.
per niente critico
Il tempo di esecuzione di rand() è costante, molto probabilmente è una comune funzione C++, cercate su google "rand c++ source code"
dovete inizializzarlo, ma se lo inizializzate con delle costanti potreste incontrare un'ottimizzazione
in generale, non capisco l'antipatia di rand()
un'opzione è quella di inizializzare con qualcosa come questo:
sarebbe veloce.
ha eseguito il tuo script, imho non corretto.
Il tempo principale è il caricamento del codice nella cache e poi nel processore
e aggiungere la discrezione del timer del sistema
otteniamo... quasi un numero casuale.
è necessario testarlo a lungo, circa 100500 volte, imho
È improbabile che sia corretto includere rand() nel test, poiché questa funzione consuma un ordine di grandezza più risorse degli altri comandi.
Penso che questo sarebbe un test più corretto:
Risultato:
Per fortuna, alla fine ho scommesso sul cavallo sbagliato. I sindacati sono un po' più veloci. Sono più convenienti per lavorare e il codice è più leggibile.
Una volta per una volta, e a distanza della prima vittoria, (come il primo metodo ha rimosso la linea di conversione da breve a qualcosa)
per niente critico
Il tempo di esecuzione di rand() è costante, molto probabilmente è una comune funzione C++, cercate su google "rand c++ source code"
dovete inizializzarlo, ma se lo inizializzate con delle costanti potreste incontrare un'ottimizzazione
in generale, non capisco l'antipatia di rand()
come variante da inizializzare con qualcosa del genere:
sarà veloceIl punto è che si dovrebbe misurare esattamente ciò che è necessario misurare, senza roba estranea.
Il punto era di misurare esattamente ciò che è richiesto, senza extra
no
Se ci sono frammenti di codice ripetuti, si otterranno test di ottimizzazione!
Che differenza fa la durata di esecuzione di rand()?
lasciare che venga eseguito 2/3 del tempo di test, la cosa principale è che il tempo di rand() sia costante
Il vostro codice MQL userà le funzioni MQL del sistema, giusto? - che senso ha testare un codice perfetto?