Fehler, Irrtümer, Fragen - Seite 2319
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Symbol-Einstellungen, nicht Grafiken.
Wählen Sie in der Marktübersicht aus dem Kontextmenü des Symbols "Symbolspezifikation".
Ich danke Ihnen.
Bitte zeigen Sie die Terminalprotokolle zum Zeitpunkt des Problems von Anfang an
Ich danke Ihnen.
Bitte zeigen Sie die Terminalprotokolle zum Zeitpunkt des Problems von Anfang an
Ich habe die Protokolldatei per privater Nachricht geschickt.
Ich habe die Protokolldatei per privater Nachricht geschickt.
Ja, ich danke Ihnen.
Die Protokolle sind alle sauber.
Sagen Sie mir, ob die von Ihnen beschriebene Situation anhält?
Volumen ohne DoubleToString(Volumen, 2). Der Screenshot zeigt EURUSD.
Ja, ich danke Ihnen.
Aus den Protokollen geht alles klar hervor.
Sagen Sie mir, ob die von Ihnen beschriebene Situation weiterhin besteht?
Nach dem Neustart des Terminals ist soweit alles in Ordnung.
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Wanzen, Wanzen, Fragen
pantural, 2018.11.01 16:03
Hallo liebe MT-Entwickler, ich möchte einen Fehler im Algorithmus zur Berechnung der Sharpe Ratio melden. Im Anhang Bericht von HerrnAleksey Vyazmikin, wo SR = 0,29, aber nach meinen Berechnungen ist es etwa 3,7-3,8 (je nachdem, ob Null PnL) deuten darauf hin, dass der Fehler in Ermangelung eines Skalierungsfaktors in der Standardabweichung (sqrt(Länge)), weil die durchschnittliche Rendite nicht auf die Länge der Serie ab, es konvergiert, und die RMS steigt als sqrt(Länge)
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;
}
Nehmen wir zwei identische TCs. Wir starten sie gleichzeitig. Einen Tag später zeigen sie beide das pnl-Array. Der erste wurde gestoppt, der zweite nicht. Nach einem weiteren Tag hat uns der zweite genau das gleiche gezeigt.
Das heißt, die erste hat pnl[] und die zweite hat pnl[]+pnl[]. Das heißt, der Handel am zweiten Tag war identisch mit dem Handel am ersten Tag.
Nach der vorgeschlagenen Formel ist die Sharpe Ratio des zweiten TS dann sqrt(2) (Wurzel aus zwei) kleiner als die des ersten. Aber sie haben identisch gehandelt!
Nehmen Sie zwei identische TCs. Lassen Sie sie gleichzeitig laufen. Nach 24 Stunden zeigten sie beide eine Reihe von pnl. Der erste wurde gestoppt, der zweite nicht. Einen Tag später zeigte das zweite Exemplar genau das gleiche Bild.
Das heißt, die erste hat pnl[] und die zweite hat pnl[]+pnl[]. Das heißt, der Handel am zweiten Tag war identisch mit dem Handel am ersten Tag.
Nach der vorgeschlagenen Formel ist die Sharpe Ratio des zweiten TS dann sqrt(2) (Wurzel aus zwei) kleiner als die des ersten. Aber sie haben identisch gehandelt!
Wie geht der Witz? "Man sollte sie töten, solange sie noch klein sind".
Schauen wir uns das Beispiel aus der Datei im Anhang zu #11396 an. Denn in der Theorie sieht alles unheimlich aus, bis man es mit den Händen fühlt.
Es gibt 144 Trades in dieser Datei, deren Sharpe-Wert 0,29 beträgt (die Website zeigt ihn mit einer Genauigkeit von 2 Dezimalstellen an, und das ist in Ordnung - niemand braucht 5 Dezimalstellen, in diesem Fall sind 2 Dezimalstellen ausreichend, um zwei Strategien zu vergleichen).
Sharpe wird als Verhältnis K/STD berechnet, wobei:
Nehmen wir an, wir haben doppelt so viele Abschlüsse, die Kopien früherer Abschlüsse waren. Das bedeutet, dass wir jetzt 288 Abschlüsse = 144*2 haben. Gleichzeitig wird sich K nicht ändern. Wir können Sharpe also nur ändern, indem wir STD ändern.
Initial STD=MathSqrt(X2/(n-1)), wobei:
Das ist Sharpe=MathSqrt(X2/(144-1)) = MathSqrt(X2/143)
Wir haben die Anzahl der Trades verdoppelt, so dass der neue Sharpe für eine doppelt so große Historie wie folgt berechnet wird
Dabei ist X2_neu=2*X2. Daher SharpeNew/Sharpe ratio = MathSqrt(X2/(144-1)) / MathSqrt(X2_new/(2*144-1)) =
Selbst wenn ich den Nenner mit dem Zähler verwechsle, liegt SharpeNew im Bereich 0,292919- 0,296025, d. h. die Differenz liegt irgendwo an der dritten Stelle.
Aber nicht um das 10-20fache. Prüfen Sie selbst, wo ich einen Fehler gemacht habe.
Was ist so lustig daran? "Man sollte sie töten, solange sie noch klein sind."
Sie missverstehen mich.
Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests
Wanzen, Wanzen, Fragen
fxsaber, 2018.11.06 13:23
Nach der vorgeschlagenen Formel wäre die Sharpe Ratio des zweiten TS dann sqrt(2) (Wurzel aus zwei) kleiner als die des ersten. Aber sie haben identisch gehandelt!
Ich meinte die zitierte Formel aus C++.
Und in der Formel, die in MT verwendet wird, würde natürlich eine nicht abgezogen werden. In dem vorgeschlagenen Beispiel würde Sharpe immer gleich sein, egal wie viele Intervalle von 144 beobachtet wurden.