Backtesting EA multi-devises - page 3

 

J'ai voulu le publier à l'époque, mais la page d'accueil était horrible :

Logique d'un EA de portefeuille

 

Salut les gars et les filles,

J'ai également rencontré ce problème il y a quelque temps et nous en avons discuté ici : https://www.mql5.com/en/forum/1642

Mon EA a une stratégie de prix ouverts uniquement et je voulais m'en tenir à cela pour gagner du temps pendant le backtesting (évidemment).

La solution que j'ai imaginée est la suivante :

  1. utilisez la paire la plus active pendant la période de trading principale de votre EA comme 'driver' (le graphique qui produit les ticks).
  2. Dans chaque onTick(), vérifiez si votre pilote a entré une nouvelle barre.
    1. s'il n'y a pas de nouvelle barre, attendez un peu plus longtemps
    2. S'il y a une nouvelle barre, distribuez le message OnTick() à vos traders individuels (chaque trader est responsable d'une paire de devises).
  3. dans le trader, vérifiez si le dernier temps de la paire de devises du trader est égal au "nouveau temps de barre" du driver
    1. si oui, vous pouvez continuer normalement
    2. si non, vous devez traiter le prix de clôture de la barre actuelle comme le prix d'ouverture que vous recherchez et si vous recherchez des informations sur les barres précédentes, tenez compte de cette situation "décalée d'une unité".

Je vais couper et coller les sections importantes du code de mon EA ci-dessous. J'espère que cela vous sera utile !

A la vôtre !


// 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.
 

Je viens moi-même de rencontrer ce problème. Vous l'avez deviné, j'essaie de passer de JForex à MQL5 ! Je commence à regretter de ne pas m'être donné la peine de le faire, même si je suppose que l'extension du délai aide :)

Il semble que MetaQuotes ne l'ait toujours pas corrigé.

MT5 forex ne semble pas supporter DOM.

isNewBar ne m'aide pas.

Cet état de fait semble ridicule.

Quelqu'un sait-il si quelque chose a changé dans MT5 concernant ce problème ?

Quelqu'un connaît-il une solution qui fonctionne pour une stratégie multidevises qui s'attend à recevoir des ticks ?

Je vous remercie de votre frustration,

Jim

 
TradingGurus:

Je viens moi-même de rencontrer ce problème. Vous l'avez deviné, j'essaie de passer de JForex à MQL5 ! Je commence à regretter de ne pas m'être donné la peine de le faire, même si je suppose que l'extension du délai aide :)

Il semble que MetaQuotes ne l'ait toujours pas corrigé.

MT5 forex ne semble pas supporter DOM.

isNewBar ne m'aide pas.

Cet état de fait semble ridicule.

Quelqu'un sait-il si quelque chose a changé dans MT5 concernant ce problème ?

Quelqu'un connaît-il une solution qui fonctionne pour une stratégie multidevises qui s'attend à recevoir des ticks ?

Je vous remercie de votre frustration,

Jim


Essayez d'utiliser OnTimer() avec un timer de 1 seconde au lieu de OnTick().
 

Salut enivid,

enivid:
Essayez d'utiliser OnTimer() avec une minuterie de 1 seconde au lieu de OnTick().

Merci pour la suggestion. Votre solution fonctionne bien mieux que toutes les autres que j'ai essayées, certainement pour nos besoins.

Cependant, l'exécution de backtests multidevises contre différentes paires produit toujours des résultats légèrement différents.

Cela n'inspire pas une grande confiance !

Je vais aller brûler beaucoup plus d'huile de minuit maintenant !

Merci,

Jim

 
enivid:
Essayez d'utiliser OnTimer() avec une minuterie de 1 seconde au lieu de OnTick().

TradingGurus:

Cependant, l'exécution de backtests multidevises contre différentes paires produit toujours des résultats légèrement différents.

Jim, j'utilise la solution OnTimer avec 1 seconde dans mon EA de portefeuille de concours. Si votre stratégie repose sur chaque tick, alors oui, vous obtiendrez des résultats différents en utilisant OnTimer par rapport à OnTick sur une seule devise puisque plus d'un tick par seconde est possible. J'ai constaté que la différence est généralement la plus importante lorsque le tick "manquant" crée un nouveau haut ou bas de barre. Vous pouvez vérifier le haut/bas de la barre précédente et le haut/bas de la barre actuelle pour tout changement et insérer ceux-ci en tant que "tick manquant" lorsqu'ils se produisent, à moins bien sûr que le tick actuel ait créé le nouveau haut/bas de la barre.

N'oubliez pas non plus que le testeur de stratégie MetaTrader ne simule que des données en tick. En fonction de la sensibilité de votre stratégie aux mouvements des tick, cette simulation peut avoir un impact significatif sur le back-testing par rapport au forward testing.

- Patrick

 
Bonjour Patrick,
Pix:

Si votre stratégie repose sur chaque tick, alors oui, vous obtiendrez des résultats différents en utilisant OnTimer et OnTick sur une seule devise puisque plus d'un tick par seconde est possible.

- Patrick


Ce n'est pas tout à fait ce que je voulais dire. Notre EA de concours (qui n'est encore qu'un potentiel !) négocie les 12 paires. En utilisant uniquement OnTimer(), j'obtiens des résultats de backtest différents si je sélectionne GBP/USD dans le testeur de stratégie plutôt que EUR/USD par exemple.

Je ne connais que trop bien les limites de MT4 lors des backtests utilisant des ticks simulés. Malheureusement, il semble que MT5 ne soit pas beaucoup mieux !

Jim

 

Nous étions extrêmement désireux de faire fonctionner tout cela avec des ticks pour des raisons historiques, mais nous avons abandonné. Nous n'arrivons pas à rendre les choses cohérentes.

Nous avons mordu à la balle et travaillons maintenant avec des barres d'une minute avec l'aide de OnTimer() et isNewBar().

Les choses commencent enfin à avoir un sens, et en plus, il reste encore 4 heures avant la date limite du championnat :)

Jim
 

Nous avons finalement soumis notre EA avec environ 5 minutes d'avance sur la date limite.

Un backtest à son actif, et aucune optimisation.

N'ayant jamais fait cela auparavant, quelqu'un peut-il me dire s'il a encore une chance d'être approuvé ?

Si oui, serons-nous autorisés à modifier les paramètres d'entrée au cours de la semaine prochaine, ou non ?

Jim

 
TradingGurus:

Nous avons finalement soumis notre EA avec environ 5 minutes d'avance sur la date limite.

Un backtest à son actif, et aucune optimisation.

N'ayant jamais fait cela auparavant, quelqu'un peut-il me dire s'il a encore une chance d'être approuvé ?

Si oui, serons-nous autorisés à modifier les paramètres d'entrée au cours de la semaine prochaine, ou non ?

Jim

Bonne chance Jim !

Si votre EA a été backtesté correctement dans la période 2010.01.01 jusqu'à 2010.08.01 sans aucune erreur(erreurs de transaction, etc.) et avec un profit, alors vous serez probablement approuvé, à condition que vos informations personnelles soient également correctes. Cependant, vous ne pourrez plus rien modifier à partir de ce moment, y compris les réglages (paramètres d'entrée).

J'espère voir votre robot en action !

- Patrick