Backtesting dell'EA multi-valuta - pagina 3

 

Volevo pubblicarlo in quel momento, ma aveva un aspetto orribile in prima pagina:

Logiche di un EA di portafoglio

 

Ciao ragazzi e ragazze,

Anch'io mi sono imbattuto in questo problema qualche tempo fa e ne abbiamo discusso qui: https://www.mql5.com/en/forum/1642

Il mio EA ha una strategia solo a prezzi aperti e volevo attenermi a questo per risparmiare tempo durante il backtesting (ovviamente).

La soluzione che ho escogitato è la seguente

  1. usa la coppia più attiva durante il periodo di trading principale del tuo EA come 'driver' (il grafico che produce i tick).
  2. in ogni onTick() controllate se il vostro driver è entrato in una nuova barra
    1. se non c'è una nuova barra, aspetta un po' di più
    2. se c'è una nuova barra, distribuite il messaggio OnTick() ai vostri singoli trader (ogni trader è responsabile di una coppia di valute)
  3. nel trader controllate se l'ultimo tempo della coppia di valute del trader è uguale al "tempo della nuova barra" dal driver
    1. se sì, potete continuare normalmente
    2. se no, dovete considerare il prezzo di chiusura della barra attuale come il prezzo di apertura che state cercando e se state cercando informazioni dalle barre precedenti, tenete conto di questa situazione "fuori di una".

Taglierò e incollerò le sezioni importanti del codice del mio EA qui sotto. Spero che questo possa esservi d'aiuto!

Grazie!


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

Mi sono appena imbattuto in questo problema. Avete indovinato, sto cercando di fare il porting da JForex a MQL5! Sto cominciando a desiderare di non essermi preoccupato, anche se suppongo che l'estensione della scadenza aiuti :)

Sembra che MetaQuotes non abbia ancora risolto il problema.

MT5 forex non sembra supportare DOM.

isNewBar non mi aiuta.

Sembra uno stato di cose ridicolo.

Qualcuno sa se è cambiato qualcosa all'interno di MT5 riguardo a questo problema?

Qualcuno conosce una soluzione che funziona per una strategia multi-valuta che si aspetta di essere alimentata in tick?

Il tuo in frustrazione,

Jim

 
TradingGurus:

Mi sono appena imbattuto in questo problema. Avete indovinato, sto cercando di fare il porting da JForex a MQL5! Sto cominciando a desiderare di non essermi preoccupato, anche se suppongo che l'estensione della scadenza aiuti :)

Sembra che MetaQuotes non abbia ancora risolto il problema.

MT5 forex non sembra supportare DOM.

isNewBar non mi aiuta.

Sembra uno stato di cose ridicolo.

Qualcuno sa se è cambiato qualcosa all'interno di MT5 riguardo a questo problema?

Qualcuno conosce una soluzione che funziona per una strategia multi-valuta che si aspetta di essere alimentata in tick?

Il tuo in frustrazione,

Jim


Prova ad usare OnTimer() con timer da 1 secondo invece di OnTick().
 

Ciao enivid,

enivid:
Prova a usare OnTimer() con timer da 1 secondo invece di OnTick().

Grazie per il suggerimento. La tua soluzione funziona molto meglio di qualsiasi altra che ho provato, certamente per le nostre esigenze.

Tuttavia, l'esecuzione di backtest multivaluta su coppie diverse produce ancora risultati leggermente diversi.

Non ispira un'enorme quantità di fiducia!

Ora vado a bruciare molto più olio di mezzanotte!

Grazie,

Jim

 
enivid:
Prova a usare OnTimer() con timer da 1 secondo invece di OnTick().

TradingGurus:

Tuttavia l'esecuzione di backtest multivaluta contro coppie diverse produce ancora risultati leggermente diversi.

Jim, io uso la soluzione OnTimer con 1 secondo nel mio EA per il portafoglio del concorso. Se la tua strategia si basa su ogni tick, allora sì, otterrai risultati diversi quando usi OnTimer vs OnTick su una singola valuta poiché è possibile più di un tick al secondo. Ho scoperto che di solito fa più differenza quando il tick "mancante" ha creato una nuova barra alta o bassa. Puoi controllare la barra precedente alta/bassa e la barra corrente alta/bassa per qualsiasi cambiamento e inserirle come "tick mancante" quando si verificano, a meno che, naturalmente, il tick corrente non abbia creato la nuova barra alta/bassa.

Ricorda anche che MetaTrader Strategy Tester simula solo dati in tick. A seconda di quanto la vostra strategia sia sensibile al movimento dei tick, questa simulazione può avere un impatto significativo sul back-testing rispetto al forward testing.

- Patrick

 
Ciao Patrick,
Pix:

Se la tua strategia si basa su ogni tick, allora sì, otterrai risultati diversi quando usi OnTimer vs OnTick su una singola valuta poiché è possibile più di un tick al secondo.

- Patrick


Non è proprio quello che intendevo. Il nostro (ancora solo potenziale!) EA da concorso negozia tutte le 12 coppie. Usando solo OnTimer(), ottengo risultati di backtest diversi se seleziono GBP/USD in strategy tester piuttosto che EUR/USD per esempio.

Sono fin troppo familiare con le limitazioni di MT4 quando si fa il backtesting usando tick simulati. Purtroppo sembra che MT5 non sia molto meglio!

Jim

 

Eravamo estremamente ansiosi di far funzionare il tutto con le zecche per ragioni storiche, ma abbiamo rinunciato. Non riusciamo a rendere le cose coerenti.

Ci siamo arresi e ora stiamo lavorando con barre da 1 minuto con l'aiuto di OnTimer() e isNewBar().

Le cose hanno cominciato a sembrare vagamente sensate, finalmente, e per di più mancano ancora 4 ore alla scadenza del campionato :)

Jim
 

Alla fine abbiamo presentato il nostro EA a circa 5 minuti dalla scadenza.

Un backtest sotto la cintura e nessuna ottimizzazione.

Non avendolo mai fatto prima, qualcuno può dirmi se ha ancora una possibilità di essere approvato?

Se è così, ci sarà permesso di giocare con le impostazioni di input nel corso della prossima settimana, o no?

Jim

 
TradingGurus:

Alla fine abbiamo presentato il nostro EA a circa 5 minuti dalla scadenza.

Un backtest sotto la cintura e nessuna ottimizzazione.

Non avendolo mai fatto prima, qualcuno può dirmi se ha ancora una possibilità di essere approvato?

Se è così, ci sarà permesso di giocare con le impostazioni di input nel corso della prossima settimana, o no?

Jim

Buona fortuna Jim!

Se il tuo EA ha eseguito correttamente il backtest entro il 2010.01.01 fino al 2010.08.01 senza alcun errore(errori di trading, ecc.) e un profitto, allora è probabile che tu venga approvato, a patto che anche le tue informazioni personali siano corrette. Tuttavia, non sarai in grado di cambiare nulla da questo punto in avanti, comprese le impostazioni (parametri di input)

Spero di vedere il tuo bot in azione!

- Patrick