Backtesting con dati in tick

 

Backtesting con dati in tick

Penso di aver trovato un buon modo di fare questo in metatrader - e ho fatto un buon percorso attraverso questo metodo, ma sono rimasto bloccato e cerco aiuto per la fase finale.

1) Ottenuto dati tick da una società (fonte commerciale) simbolo: CL (petrolio) fonti gratuite es. dukascopy ecc. non hanno questo simbolo.
2) Ho usato il software dell'azienda per rendere questi dati tick in un formato a barre (senza alcuna perdita di risoluzione). Il formato a barre:

data, ora, apertura, alto, basso, chiusura, volume

Ogni barra ha solo 1 tick! Quindi, per una data barra l'open, high, low, close sono tutti uguali perché solo 1 tick nella barra.

3) Ottengo questi dati in tick nel tester della strategia di metatrader andando nelle cartelle della cronologia di metatrader e cancellando tutti i file rilevanti presenti. Apro metatrader offline e uso il centro storico e la funzione di importazione per ottenere i dati. Naturalmente, anche se si tratta di dati in tick - con il loro formato a barre - vengono accettati bene da metatrader. Quando uso strategy tester (ancora offline ovviamente) posso accedere a questi dati.

4) MA il problema: Secondo metatrader, in questi dati ci sono più barre con la stessa data e ora (perché metatrader ignora i secondi; il minimo che considera sono i minuti). Penso che la soluzione sia quella di MODIFICARE i dati in modo che tutte le barre abbiano data e ora diverse (ad una risoluzione che possa essere rilevata da metatrader). Così, per esempio, se
una barra ha una marca temporale di 18:00:00 e la successiva ha una marca temporale di 18:00:08 - allora questa seconda barra dovrebbe essere cambiata per avere una marca temporale di 18:01:00. In modo che possa essere rilevata da Metatrader come prossima barra. Questo cambierebbe tutti i timbri di tempo (e i timbri di data a tempo debito), naturalmente, ma non credo che questo abbia molta importanza. La mia domanda è - COME POSSO CAMBIARE TUTTE LE DATE E GLI ORARI IN QUESTO MODO?

Naturalmente, i dati hanno troppe voci per Excel. Ho accesso a microsoft Access.

Forse qualche script che aggiunga 1 secondo in modo iterativo ad ogni entrata temporale potrebbe funzionare. Ma dovrebbe cambiare l'ora di conseguenza man mano che si sale e poi la data, naturalmente. Questo è quello che mi prende - mi rende bloccato. Non so come fare questo.


un esempio dei miei dati di tick basati su barre è tagliato e incollato qui sotto
(si tratta di dati CL - future sul greggio dolce)

data, ora, aperto, alto, basso, chiuso, volume
20100831,18:00:00,71.70,71.70,71.70,71.70,2
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:01,71.73,71.73,71.73,71.73,2
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.73,71.73,71.73,71.73,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.75,71.75,71.75,71.75,7
20100831,18:00:01,71.75,71.75,71.75,71.75,1
20100831,18:00:04,71.75,71.75,71.75,71.75,1
20100831,18:00:05,71.74,71.74,71.74,71.74,1
20100831,18:00:05,71.75,71.75,71.75,71.75,1
20100831,18:00:05,71.75,71.75,71.75,71.75,3
20100831,18:00:08,71.75,71.75,71.75,71.75,7
20100831,18:00:09,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.71,71.71,71.71,71.71,1
20100831,18:00:11,71.70,71.70,71.70,71.70,1
20100831,18:00:11,71.68,71.68,71.68,71.68,1
20100831,18:00:19,71.71,71.71,71.71,71.71,1
20100831,18:00:19,71.71,71.71,71.71,71.71,1
20100831,18:00:19,71.69,71.69,71.69,71.69,1
20100831,18:00:19,71.69,71.69,71.69,71.69,1
20100831,18:00:19,71.68,71.68,71.68,71.68,2
20100831,18:00:19,71.67,71.67,71.67,71.67,1
20100831,18:00:34,71.72,71.72,71.72,71.72,1
20100831,18:00:34,71.72,71.72,71.72,71.72,1
20100831,18:00:35,71.72,71.72,71.72,71.72,1
20100831,18:00:37,71.72,71.72,71.72,71.72,1
20100831,18:00:56,71.71,71.71,71.71,71.71,1
20100831,18:00:56,71.71,71.71,71.71,71.71,1
20100831,18:00:56,71.70,71.70,71.70,71.70,1
20100831,18:01:00,71.71,71.71,71.71,71.71,1
20100831,18:01:02,71.72,71.72,71.72,71.72,1
20100831,18:01:11,71.71,71.71,71.71,71.71,1
20100831,18:01:12,71.71,71.71,71.71,71.71,1
20100831,18:01:13,71.71,71.71,71.71,71.71,1
20100831,18:01:16,71.70,71.70,71.70,71.70,1
20100831,18:01:26,71.70,71.70,71.70,71.70,3
20100831,18:01:26,71.70,71.70,71.70,71.70,5
20100831,18:01:28,71.70,71.70,71.70,71.70,1
20100831,18:01:33,71.71,71.71,71.71,71.71,1
20100831,18:01:36,71.70,71.70,71.70,71.70,4
20100831,18:01:45,71.70,71.70,71.70,71.70,1
20100831,18:01:46,71.71,71.71,71.71,71.71,2
20100831,18:01:46,71.71,71.71,71.71,71.71,4
20100831,18:01:49,71.71,71.71,71.71,71.71,1
20100831,18:02:19,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:26,71.70,71.70,71.70,71.70,1
20100831,18:02:26,71.70,71.70,71.70,71.70,1
20100831,18:02:39,71.74,71.74,71.74,71.74,1
20100831,18:03:10,71.74,71.74,71.74,71.74,1
20100831,18:03:29,71.75,71.75,71.75,71.75,1
20100831,18:03:34,71.75,71.75,71.75,71.75,1
20100831,18:03:34,71.77,71.77,71.77,71.77,1
20100831,18:03:41,71.78,71.78,71.78,71.78,1
20100831,18:03:41,71.78,71.78,71.78,71.78,5
20100831,18:03:41,71.78,71.78,71.78,71.78,5
20100831,18:03:41,71.79,71.79,71.79,71.79,1
20100831,18:03:44,71.78,71.78,71.78,71.78,1
20100831,18:03:50,71.78,71.78,71.78,71.78,1
20100831,18:03:52,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.80,71.80,71.80,71.80,1
20100831,18:04:14,71.80,71.80,71.80,71.80,2

Nota che posso effettivamente rendere i dati senza secondi e solo in minuti che potrebbero aiutare con la soluzione.

20100831,18:00,71.70,71.70,71.70,71.70,2
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.73,71.73,71.73,71.73,2
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.73,71.73,71.73,71.73,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.75,71.75,71.75,71.75,7
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,3
20100831,18:00,71.75,71.75,71.75,71.75,7
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.68,71.68,71.68,71.68,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.69,71.69,71.69,71.69,1
20100831,18:00,71.69,71.69,71.69,71.69,1
20100831,18:00,71.68,71.68,71.68,71.68,2
20100831,18:00,71.67,71.67,71.67,71.67,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.72,71.72,71.72,71.72,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.70,71.70,71.70,71.70,3
20100831,18:01,71.70,71.70,71.70,71.70,5
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.70,71.70,71.70,71.70,4
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,2
20100831,18:01,71.71,71.71,71.71,71.71,4
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.74,71.74,71.74,71.74,1
20100831,18:03,71.74,71.74,71.74,71.74,1
20100831,18:03,71.75,71.75,71.75,71.75,1
20100831,18:03,71.75,71.75,71.75,71.75,1
20100831,18:03,71.77,71.77,71.77,71.77,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.78,71.78,71.78,71.78,5
20100831,18:03,71.78,71.78,71.78,71.78,5
20100831,18:03,71.79,71.79,71.79,71.79,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.79,71.79,71.79,71.79,1
20100831,18:04,71.79,71.79,71.79,71.79,1
20100831,18:04,71.79,71.79,71.79,71.79,1
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,2
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,3
20100831,18:04,71.80,71.80,71.80,71.80,17
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,4
20100831,18:04,71.79,71.79,71.79,71.79,1

 
Il tester usa i file FXT e anche questi hanno dei secondi. Purtroppo questi file FXT vengono sovrascritti ad ogni test successivo e quindi gli utenti non possono inserire i propri dati (nelle vecchie versioni di MT4 era possibile -> https://www.mql5.com/en/forum/103180/page6#321081). C'è un modo per superare questo ostacolo... Vedi qui per informazioni dettagliate -> http://eareview.net/tick-data.
 

Quel sito web sembra essere la risposta standard a qualsiasi cosa che riguardi le zecche.

Ma quello che sto cercando di fare è qualcosa di diverso (ho seguito un percorso diverso perché i miei dati di tick NON provengono dalla stessa fonte di quel sito web - hanno un punto di partenza diverso e quindi non sono un substrato adatto ai file/sistemi di conversione offerti).

Infatti con il mio metodo non c'è bisogno di usare una vecchia versione di Metatrader. Se ho ragione. Anche io ci sono quasi - ho solo bisogno di aiuto per l'ultima fase finale,

 

Cosa ne pensi?

1) Sono su un percorso valido?

Come ho detto - non posso usare il percorso di quel sito (Birt EA) perché non è valido per il mio punto di partenza.

2) Se è così - avete qualche idea per superare questo punto di stallo finale in cui mi trovo?

 
O non hai capito il metodo di Birt o io non ti capisco. Quello che segue non ha senso:


mikey:

[...]

4) MA il problema: secondo metatrader, in questi dati ci sono più barre con la stessa data e ora (perché metatrader ignora i secondi; il minimo che considera sono i minuti). Penso che la soluzione sia quella di MODIFICARE i dati in modo che tutte le barre abbiano data e ora diverse (ad una risoluzione che possa essere rilevata da metatrader). [...]

Questo non risolverà nulla poiché il Tester interpolerà sempre prima i Ticks su cui fare il backtest, indipendentemente da ciò che si fa nel centro storico. L'idea principale del metodo di Birt è quella di sostituire il file dei tick interpolati con un file contenente tick reali su cui il Tester possa fare il test. Anche se avete successo nel vostro attuale tentativo, il Tester continuerebbe a interpolare i tick su cui testare, quindi non ha senso.


Ti consiglio di leggere questo -> https://www.mql5.com/en/articles/1511 e ripassare il tutorial di Birt. Il vostro obiettivo dovrebbe essere quello di creare un file FXT corretto con tick reali per sostituire il file FXT generato dal Tester. Usando il metodo di Birt puoi disabilitare il "ricalcolo" e quindi far sì che il Tester usi il tuo file FXT (con i tuoi tick reali).

 

Tutto dipende da questo:

1) Metatrader interpola i tick solo all'interno delle barre? (Penso di sì)

2) E lo fa come guidato e vincolato dai valori dati della barra: open, high, low, close?

Se [1] e [2] sono veri penso che il mio metodo sia valido perché nel mio metodo ogni barra ha solo 1 tick. Quindi, l'open, l'high, il low e il close hanno tutti lo stesso valore. Quindi, quando metatrader li usa per interpolare i tick - tutti i tick interpolati hanno esattamente lo stesso valore/prezzo. Quindi, l'interpolazione dei nuovi tick da parte di metatrader non è un problema - non cambia nulla.

Penso di comprendere i problemi e penso che potrei essere sulla strada di quello che credo sia un modo migliore di fare le cose. Ma sono pronto a essere corretto. Forse sono ingenuo.

 
mikey:

1) Metatrader interpola i tick solo all'interno delle barre? (Penso di sì)

2) E lo fa come guidato e vincolato dai valori dati della barra: open, high, low, close?

Se [1] e [2] sono veri penso che il mio metodo sia valido perché nel mio metodo ogni barra ha solo 1 tick. Quindi, l'open, l'high, il low e il close hanno tutti lo stesso valore. Quindi, quando metatrader li usa per interpolare i tick - tutti i tick interpolati hanno esattamente lo stesso valore/prezzo. Quindi, l'interpolazione dei nuovi tick da parte di metatrader non è un problema - non cambia nulla. [...]

Capisco... Grazie per il chiarimento. Beh, se la barra ha O=C=H=L e volume=1 allora effettivamente si dovrebbe formare 1 solo tick. Ma questo significherebbe che state "allungando" la scala dei tempi del volume medio della barra. E lo stai allungando 'uniformemente' anche se barre diverse hanno volumi diversi. Questo dovrebbe avere gravi effetti sulla maggior parte degli esperti. Significherebbe anche che le date/tempi sui rapporti di prova sarebbero allungati e che lo swap sarebbe preso innumerevoli volte più del dovuto. Questo suona estremamente inaffidabile e penso che semplicemente non 'funzionerà' per la maggior parte degli esperti.


Comunque, per rispondere alla tua domanda su 'come farlo'. Crea semplicemente un file HST M1 con ogni barra che rappresenta un singolo tick. Questo può essere fatto tramite uno script. La struttura del file HST è documentata nel manuale (Aiuto del terminale) e si può riutilizzare del codice dallo script csv2fxt.


p.s. Se sei interessato a come viene fatta l'interpolazione nel Tester, c'è un buon articolo su come viene fatta nel Tester MT5... Dovrebbe essere molto simile (se non lo stesso) a quello che succede nel Tester MT4 -> https://www.mql5.com/en/articles/75.

 

Come ulteriore chiarimento al mio ultimo:

Ad ogni tick viene data la propria barra M1 (una barra con una data e un'ora uniche, con il tempo alla risoluzione di minuti interi).

Quindi, questo significa che il tempo viene spostato - la barra di un tick può avere un tempo molto diverso da quando quel tick è effettivamente avvenuto.

Ma questo NON è un problema per me. Non ho bisogno di conoscere il tempo con precisione. So quali dati metto nel backtest (da questa data a quella data) e saprò alla fine se alla fine di questo periodo è stato fatto un profitto o una perdita con questo metodo. (la data/ora esatta sul grafico di uscita non mi interessa)

Di nuovo - sono pronto ad essere corretto. È tutto questo suono o follia? Si prega di prendere il tempo per capire la revisione di ciò che ho detto piuttosto che solo mi riferisco a Birts. perché se posso correttamente ottenere questo attraverso e relè ed è suono - penso che potrebbe essere un modo migliore di fare le cose.

 

mikey:

[...] Ma questo NON è un problema per me. Non ho bisogno di conoscere il tempo con precisione. So quali dati inserisco nel backtest (da questa data a quella data) e saprò alla fine se è stato fatto un profitto o una perdita alla fine di questo periodo con questo metodo. (la data/ora esatta sul grafico di uscita non mi interessa) [...]

OK. Ma sei assolutamente sicuro che questo non influenzerà l'esperto? Per esempio - qualsiasi esperto che si basa sulla considerazione di timeframe o indi che sono basati su timeframe non funzionerà come dovrebbe. Dovrete anche azzerare lo swap, perché sicuramente non sarà calcolato correttamente. Ci potrebbero essere altri effetti collaterali a cui non sto pensando in questo momento... Mi sembra molto pericoloso.
 
BTW, dovrai scartare i dati del volume poiché sono irrilevanti per il modo in cui è calcolato in MT4 (volume = numero di tick ricevuti in una barra).
 

Sì, la tua risposta è arrivata proprio quando ho inviato la mia ultima.

RE: volume...- se il mio EA non "legge" il volume sono al sicuro su questo? Non devo preoccuparmi di questo? Non ho pensato al volume - ma come ho detto il mio EA non lo "legge" per niente. Quindi, solo per chiarire - posso ignorare il volume? O dovrei forse impostare il volume a 1 per tutte le barre?

Motivazione: