Backtesting Multi-Währungs-EA - Seite 3

 

Ich wollte das damals veröffentlichen, aber es sah auf der Titelseite furchtbar aus:

Logik eines Portfolio EA

 

Hallo Jungs und Mädels,

Ich bin vor einiger Zeit auch auf dieses Problem gestoßen und wir haben es hier diskutiert: https://www.mql5.com/en/forum/1642

Mein EA hat eine Strategie, die nur offene Kurse berücksichtigt, und ich wollte mich daran halten, um beim Backtesting Zeit zu sparen (natürlich).

Die Lösung, die ich mir ausgedacht habe, lautet wie folgt:

  1. Verwenden Sie das aktivste Paar während der Haupthandelsperiode Ihres EA als "Treiber" (der Chart, der die Ticks erzeugt).
  2. Prüfen Sie in jedem onTick(), ob Ihr Treiber einen neuen Balken eingegeben hat
    1. wenn es keinen neuen Balken gibt, warten Sie ein wenig länger
    2. wenn es einen neuen Balken gibt, verteilen Sie die OnTick()-Nachricht an Ihre einzelnen Händler (jeder Händler ist für ein Währungspaar verantwortlich)
  3. Prüfen Sie im Trader, ob die letzte Zeit des Währungspaares des Traders gleich der "new bar time" des Treibers ist
    1. wenn ja, können Sie wie gewohnt fortfahren
    2. Wenn nein, müssen Sie den Schlusskurs des aktuellen Balkens als den gesuchten Eröffnungskurs behandeln, und wenn Sie nach Informationen aus früheren Balken suchen, müssen Sie diese "um eins verschobene" Situation in Betracht ziehen.

Ich werde die wichtigen Abschnitte des Codes aus meinem EA hier unten ausschneiden und einfügen. Ich hoffe, das hilft Ihnen weiter!

Prost!


// this is from the Trader base class

    // manage a new tick and predetermines whether a new bar hast started
    virtual void onTick() {
        MqlRates rates[1];
    
        // check the rates of the tick stream we're attached to (_Symbol!!!)
        if (CopyRates(_Symbol, _period, 0, 1, rates) != 1) {
            Print("CopyRates of ", _Symbol, " failed");
            return;
        }

        if (_newBar = (rates[0].time != _currBarTime)) {
            _prevBarTime = _currBarTime;  // remember the previous bar time
            _currBarTime = rates[0].time;  // remember the current bar time
        }

    }


// this is the actual trader for a specific currency pair

    // checks whether a new trade (closing or opening) is to be performed
    void checkForTrade(void) {    
    
        MqlRates rates[3];

        if (CopyRates(_symbol, _period, 0, 3, rates) != 3) {
            Print("CopyRates of ", _symbol, " failed");
            return;
        }

        bool inSameBar = (rates[2].time == _currBarTime);  // _currBarTime determined in OnTick()!


        double sBuf[3];  // signal buffer! 2: current bar, 1: previous bar, 0: current - 2 

        if (CopyBuffer(_ind, SIGNAL3, 0, 3, sBuf) != 3) {
            Print("copy signal from indicator failed, no data");
            return;
        }    
        
        
        // first close exiting orders
        double v0 = inSameBar ? sBuf[0] : sBuf[1];  // determine the actual 'previous' bar
        double v1 = inSameBar ? sBuf[1] : sBuf[2];  // determine the actual 'current' bar
        
        if (_volume > 0) {
            if (crossesZeroDownwards(v0, v1)) {  // cross down?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        } else if (_volume < 0) {
            if (crossesZeroUpwards(v0, v1)) {  // cross up?
                setReqVolume(0);  // close this order
                tradeCloses = true;
            }    
        }

        ...
Tick generation - Open bar only
  • www.mql5.com
The whole list printed shows also many discrepancies in times.
 

Ich bin gerade selbst auf dieses Problem gestoßen. Sie haben es erraten, ich versuche, von JForex auf MQL5 zu portieren! Langsam wünschte ich, ich hätte mich nicht darum gekümmert, obwohl ich annehme, dass die Fristverlängerung hilft :)

Es sieht so aus, als hätte MetaQuotes das Problem immer noch nicht behoben.

MT5 Forex scheint DOM nicht zu unterstützen.

isNewBar wird mir nicht helfen.

Das scheint ein lächerlicher Zustand zu sein.

Weiß jemand, ob sich in MT5 etwas in Bezug auf dieses Problem geändert hat?

Kennt jemand eine Lösung, die für eine Multiwährungsstrategie funktioniert, die mit Ticks gefüttert werden muss?

Ihre Frustration,

Jim

 
TradingGurus:

Ich bin gerade selbst auf dieses Problem gestoßen. Sie haben es erraten, ich versuche, von JForex auf MQL5 zu portieren! Langsam wünschte ich, ich hätte mich nicht darum gekümmert, obwohl ich annehme, dass die Fristverlängerung hilft :)

Es sieht so aus, als hätte MetaQuotes das Problem immer noch nicht behoben.

MT5 Forex scheint DOM nicht zu unterstützen.

isNewBar wird mir nicht helfen.

Das scheint ein lächerlicher Zustand zu sein.

Weiß jemand, ob sich in MT5 etwas in Bezug auf dieses Problem geändert hat?

Kennt jemand eine Lösung, die für eine Multiwährungsstrategie funktioniert, die mit Ticks gefüttert werden muss?

Ihre Frustration,

Jim


Versuchen Sie OnTimer() mit einem 1-Sekunden-Timer anstelle von OnTick() zu verwenden.
 

Hallo enivid,

enivid:
Versuchen Sie OnTimer() mit einem 1-Sekunden-Timer anstelle von OnTick() zu verwenden.

vielen Dank für den Vorschlag. Ihre Lösung funktioniert viel besser als alle anderen, die ich ausprobiert habe, jedenfalls für unsere Anforderungen.

Allerdings führt die Durchführung von Backtests mit mehreren Währungen und verschiedenen Paaren immer noch zu leicht unterschiedlichen Ergebnissen.

Das erweckt nicht gerade großes Vertrauen!

Ich mache mich jetzt auf den Weg, um noch viel mehr Mitternachtsöl zu verbrennen!

Zum Wohl,

Jim

 
enivid:
Versuchen Sie OnTimer() mit einem 1-Sekunden-Timer anstelle von OnTick() zu verwenden.

TradingGurus:

Die Durchführung von Backtests mit mehreren Währungen für verschiedene Paare führt jedoch immer noch zu leicht unterschiedlichen Ergebnissen.

Jim, ich verwende die OnTimer-Lösung mit 1 Sekunde in meinem Wettbewerbsportfolio EA. Wenn Ihre Strategie auf jeden Tick angewiesen ist, dann werden Sie unterschiedliche Ergebnisse erhalten, wenn Sie OnTimer im Vergleich zu OnTick für eine einzelne Währung verwenden, da mehr als ein Tick pro Sekunde möglich ist. Ich habe festgestellt, dass es in der Regel den größten Unterschied macht, wenn der "fehlende" Tick einen neuen Höchst- oder Tiefststand des Balkens erzeugt. Sie können den vorherigen Höchst-/Tiefstkurs und den aktuellen Höchst-/Tiefstkurs auf Änderungen überprüfen und diese als "fehlenden Tick" einfügen, wenn sie auftreten, es sei denn, der aktuelle Tick hat den neuen Höchst-/Tiefstkurs verursacht.

Bedenken Sie auch, dass der MetaTrader Strategy Tester nur Tick-Daten simuliert. Je nachdem, wie empfindlich Ihre Strategie auf Tick-Bewegungen reagiert, kann diese Simulation einen erheblichen Einfluss auf das Backtesting im Vergleich zum Forward-Testing haben.

- Patrick

 
Hallo Patrick,
Pix:

Wenn Ihre Strategie auf jeden Tick angewiesen ist, dann werden Sie bei der Verwendung von OnTimer im Vergleich zu OnTick für eine einzelne Währung unterschiedliche Ergebnisse erzielen, da mehr als ein Tick pro Sekunde möglich ist.

- Patrick


Das ist nicht ganz das, was ich meinte. Unser (noch immer nur potenzieller!) Wettbewerbs-EA handelt alle 12 Paare. Wenn ich nur OnTimer() verwende, erhalte ich unterschiedliche Backtest-Ergebnisse, wenn ich im Strategietester GBP/USD auswähle und nicht beispielsweise EUR/USD.

Ich bin mit den Einschränkungen von MT4 beim Backtesting mit simulierten Ticks nur allzu vertraut. Leider sieht es so aus, als ob MT5 nicht viel besser ist!

Jim

 

Wir wollten das alles aus historischen Gründen unbedingt mit Zecken machen, aber wir haben es aufgegeben. Wir können die Dinge einfach nicht konsistent machen.

Wir haben in den sauren Apfel gebissen und arbeiten jetzt mit 1-Minuten-Balken mit Hilfe von OnTimer() und isNewBar().

Die Dinge sehen nun endlich einigermaßen vernünftig aus, und außerdem sind es noch 4 Stunden bis zum Ende der Meisterschaft :)

Jim
 

Wir haben unseren EA schließlich 5 Minuten vor Ablauf der Frist eingereicht.

Ein Backtest unter dem Gürtel, und keine Optimierung.

Kann mir jemand sagen, ob der EA noch eine Chance hat, genehmigt zu werden, da ich so etwas noch nie gemacht habe?

Wenn ja, dürfen wir dann in der nächsten Woche an den Eingabeeinstellungen herumfummeln, oder nicht?

Jim

 
TradingGurus:

Wir haben unseren EA schließlich 5 Minuten vor Ablauf der Frist eingereicht.

Ein Backtest unter dem Gürtel, und keine Optimierung.

Kann mir jemand sagen, ob der EA noch eine Chance hat, genehmigt zu werden, da ich so etwas noch nie gemacht habe?

Wenn ja, dürfen wir dann in der nächsten Woche an den Eingabeeinstellungen herumfummeln, oder nicht?

Jim

Viel Glück, Jim!

Wenn Ihr EA in den Jahren 2010.01.01 bis 2010.08.01 korrekt und ohne Fehler(Handelsfehler etc.) backgetestet wurde und einen Gewinn erzielt hat, dann werden Sie wahrscheinlich zugelassen, sofern auch Ihre persönlichen Daten korrekt sind. Allerdings können Sie von diesem Zeitpunkt an nichts mehr ändern, auch nicht die Einstellungen (Eingabeparameter).

Ich hoffe, ich kann Ihren Bot in Aktion sehen!

- Patrick