Errori, bug, domande - pagina 2319
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Impostazioni dei simboli, non della grafica.
Nella panoramica del mercato, selezionare "specifica del simbolo" dal menu contestuale del simbolo
Grazie.
Si prega di mostrare i log del terminale al momento del problema dall'inizio
Grazie.
Si prega di mostrare i log del terminale al momento del problema dall'inizio
Ho inviato il file di log via messaggio privato.
Ho inviato il file di log tramite messaggio privato.
Sì, grazie.
I registri sono tutti puliti.
Mi dica, la situazione che ha descritto continua?
Volume senza DoubleToString(Volume, 2). La schermata è EURUSD.
Sì, grazie.
Tutto è chiaro dai registri.
Mi dica, la situazione che ha descritto continua?
Dopo aver riavviato il terminale, per ora va tutto bene.
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Bug, bug, domande
pantural, 2018.11.01 16:03
Ciao cari sviluppatori di MT, vorrei segnalare un bug nell'algoritmo di calcolo dello Sharpe Ratio. Nella relazione in appendice del signorAleksey Vyazmikin dove SR=0,29 ma secondo i miei calcoli è circa 3,7-3,8 (a seconda se zero PnL) suggeriscono che l'errore in assenza di un fattore di scala nella deviazione standard (sqrt(lunghezza)) perché il rendimento medio non dipende dalla lunghezza della serie, converge, e il RMS aumenta come sqrt(lunghezza)
C++
double SharpRatio(vector<double> pnl)
{
double avret = 0;
for (int i = 0; i < pnl.size(); ++i) avret += pnl[i];
avret /= pnl.size();
double var = 0;
for (int i = 0; i < pnl.size(); ++i) var += pow(pnl[i] - avret, 2);
var = sqrt(var / pnl.size()) / sqrt(pnl.size());
return avret / var;
}
Prendiamo due TC identici. Li avviamo simultaneamente. Un giorno dopo entrambi mostrano la matrice pnl. Il primo è stato fermato, il secondo no. Dopo un altro giorno, il secondo ci ha mostrato esattamente lo stesso pnl.
Cioè, il primo ha pnl[] e il secondo ha pnl[]+pnl[]. Cioè, il commercio del secondo giorno era identico a quello del primo giorno.
Quindi, secondo la formula suggerita, lo Sharpe Ratio del secondo TS sarà sqrt(2) (radice di due) inferiore a quello del primo. Ma hanno scambiato in modo identico!
Prendete due TC identici. Eseguiteli allo stesso tempo. Dopo 24 ore entrambi hanno mostrato una serie di pnl. Il primo è stato fermato, il secondo no. Un altro giorno dopo il secondo ha mostrato esattamente lo stesso pnl.
Cioè, il primo ha pnl[] e il secondo ha pnl[]+pnl[]. Cioè, il commercio del secondo giorno era identico a quello del primo giorno.
Quindi, secondo la formula suggerita, lo Sharpe Ratio del secondo TS sarà sqrt(2) (radice di due) inferiore a quello del primo. Ma hanno scambiato in modo identico!
Come fa la battuta? "Dovrebbero essere uccisi mentre sono piccoli".
Bene, guardiamo l'esempio del file allegato a #11396. Perché tutto sembra spaventoso in teoria, finché non lo senti con le tue mani.
Ci sono 144 trade in questo file, il cui valore di Sharpe è 0,29 (il sito lo mostra con una precisione di 2 decimali, e va bene - nessuno ha bisogno di 5 decimali, in questo caso 2 decimali sono sufficienti per una buona misura per confrontare due strategie).
Sharpe è calcolato come rapporto K/STD, dove:
Supponiamo di avere il doppio dei trade che erano copie dei trade precedenti. Significa che ora abbiamo 288 scambi = 144*2. Allo stesso tempo K non cambierà. Quindi, possiamo cambiare Sharpe solo cambiando STD.
STD iniziale=MathSqrt(X2/(n-1)), dove:
Cioè Sharpe=MathSqrt(X2/(144-1)) = MathSqrt(X2/143)
Abbiamo raddoppiato il numero di operazioni, quindi per una storia due volte più grande il nuovo Sharpe è calcolato così
Dove X2_new=2*X2. Pertanto il rapporto SharpeNew/Sharpe = MathSqrt(X2/(144-1)) / MathSqrt(X2_new/(2*144-1)) =
Anche se ho confuso il denominatore con il numeratore, SharpeNew sarà nell'intervallo 0,292919- 0,296025. Cioè, la differenza sarà da qualche parte sulla terza cifra.
Ma non di 10-20 volte. Controllate voi stessi dove ho sbagliato.
Qual è la battuta? "Dovrebbero essere uccisi mentre sono piccoli".
Lei mi ha frainteso.
Forum sul trading, sistemi di trading automatico e test di strategia
Bug, bug, domande
fxsaber, 2018.11.06 13:23
Allora secondo la formula proposta, lo Sharpe ratio del secondo TS sarebbe sqrt(2) (radice di due) inferiore al primo. Ma hanno scambiato in modo identico!
Intendevo la formula citata di C++.
E nella formula usata in MT, ovviamente, uno non verrebbe sottratto. Allora l'esempio proposto, non importa quanti intervalli di 144, Sharp sarebbe sempre lo stesso.