Backtesting con datos de tick

 

Backtesting con datos de tick

Creo que he encontrado una buena manera de hacer esto en metatrader - y he conseguido un buen camino a través de este método, pero han conseguido STUCK y buscar un poco de ayuda con la etapa final.

1) Tengo datos de garrapatas de una empresa (fuente comercial) símbolo: CL (petróleo) fuentes libres, por ejemplo, dukascopy etc. no tienen este símbolo.
2) Utilicé el software de la empresa para convertir estos datos de ticks en un formato de barra (sin pérdida de resolución). El formato de barra:

fecha, hora, apertura, alta, baja, cierre, volumen

Cada barra tiene sólo 1 tick. Por lo tanto, para una barra determinada, la apertura, el máximo, el mínimo y el cierre son todos iguales porque sólo hay un tick en la barra.

3) Obtengo estos datos de ticks en el probador de estrategias de metatrader yendo a las carpetas del historial de metatrader y borrando cualquier archivo relevante presente allí. Abro metatrader offline y utilizo el centro del historial y la función de importación para obtener los datos allí. Por supuesto, aunque se trata de datos de ticks -con su formato de barra- son aceptados bien por metatrader. Cuando uso el probador de estrategias (aún sin conexión, por supuesto) puedo acceder a estos datos.

4) PERO el problema: Según metatrader, en estos datos hay múltiples barras con la misma fecha y hora (porque metatrader ignora los segundos; lo mínimo que considera son los minutos). Creo que la solución a esto es CAMBIAR los datos para que todas las barras tengan diferentes marcas de fecha y hora (a una resolución que pueda ser recogida por metatrader). Así, por ejemplo, si
una barra tiene una marca de tiempo de 18:00:00 y la siguiente tiene una marca de tiempo de 18:00:08 - entonces esta segunda debe ser cambiada para tener una marca de tiempo de 18:01:00. De esta manera, Metatrader puede tomarla como la siguiente barra. Esto cambiaría todos los sellos de tiempo (y los sellos de fecha a su debido tiempo) por supuesto, pero no creo que esto realmente importa. Mi pregunta es: ¿cómo puedo cambiar todas las marcas de fecha y hora de esta manera?

Por supuesto, los datos tienen demasiadas entradas para Excel. Tengo acceso a Microsoft Access.

Tal vez algún script que agregue 1 segundo iterativamente a cada entrada de tiempo funcionaría. Pero tendría que cambiar la hora en consecuencia como subimos y luego la fecha por supuesto. Esto es lo que me hace estar atascado. No sé cómo hacer esto.


una muestra de mi barra basada en los datos de garrapatas es cortar y pegar a continuación
(son datos de CL - futuro de crudo dulce)

fecha, hora, apertura, alta, baja, cierre, volumen
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

Tenga en cuenta que puedo hacer los datos sin segundos y sólo en minutos que podría ayudar con la solución.

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

 
El probador utiliza archivos FXT y estos también tienen segundos. Desgraciadamente, estos archivos FXT se sobreescriben en cada prueba sucesiva, por lo que los usuarios no pueden poner sus propios datos (en las versiones antiguas de MT4 era posible -> https://www.mql5.com/en/forum/103180/page6#321081). Hay una manera de superar este obstáculo... Vea aquí la información detallada -> http://eareview.net/tick-data.
 

ese sitio web parece ser la respuesta estándar a cualquier cosa garrapata.

pero lo que estoy tratando de hacer es algo diferente (he ido sobre una ruta diferente porque mis datos de la garrapata no es de la misma fuente como ese sitio web supone - que tiene un punto de partida diferente y por lo tanto no es sustrato adecuado para los archivos / sistemas de conversión que se ofrecen).

De hecho, con mi método NO hay necesidad de utilizar una versión antigua de Metatrader. Si estoy en lo cierto. Estoy casi allí también - sólo necesito ayuda con la última etapa final,

 

¿Qué opinas?

1) ¿Estoy en un camino válido?

Como digo, no puedo usar la ruta de ese sitio web (Birt EA) porque no es válida para mi punto de partida.

2) Si es así, ¿tienes alguna idea para superar este punto de bloqueo final en el que me encuentro?

 
O no entendiste el método de Birt o yo no te entiendo. Lo siguiente no tiene sentido:


mikey:

[...]

4) PERO el problema: Según metatrader, en estos datos hay múltiples barras con la misma fecha y hora (porque metatrader ignora los segundos; lo mínimo que considera son los minutos). Creo que la solución a esto es CAMBIAR los datos para que todas las barras tengan diferente fecha y hora (a una resolución que pueda ser recogida por metatrader). [...]

Eso no solucionará nada, ya que el Probador siempre interpolará primero los Ticks para hacer el backtest, independientemente de lo que hagas en el centro de historia. La idea principal detrás del método de Birt es reemplazar el archivo de ticks interpolados con un archivo que contenga ticks reales para que el Probador los pruebe. Incluso si usted tiene éxito en su intento actual, el probador todavía interpolar ticks para probar en, por lo que no tiene sentido.


Te recomiendo que leas esto -> https://www.mql5.com/en/articles/1511 y vuelvas a repasar el tutorial de Birt. Tu objetivo debe ser crear un archivo FXT adecuado con ticks reales para reemplazar el archivo FXT generado por el Tester. Usando el método de Birt puedes desactivar el "recálculo" y así hacer que el Tester use tu archivo FXT (con tus ticks reales).

 

Todo depende de esto:

1) ¿Metatrader interpola los ticks sólo DENTRO de las barras? (Creo que sí)

2) ¿Y lo hace guiado y limitado por los valores dados de la barra: apertura, alta, baja, cierre?

Si [1] y [2] son ciertos creo que mi método es válido porque en mi método cada barra sólo tiene 1 tick. Por lo tanto, la apertura, el máximo, el mínimo y el cierre tienen el mismo valor. Por lo tanto, cuando metatrader utiliza estos para interpolar los ticks - todos los ticks interpolados reciben exactamente el mismo valor/precio. Por lo tanto, la interpolación de metatrader de nuevos ticks no es un problema - no cambia nada.

Creo que entiendo los problemas y creo que podría estar en el camino de lo que creo que es una mejor manera de hacer las cosas. PERO puedo ser corregido. Tal vez estoy siendo ingenuo.

 
mikey:

1) ¿Metatrader interpola los ticks sólo DENTRO de las barras? (Creo que sí)

2) ¿Y lo hace guiado y limitado por los valores dados de la barra: apertura, alta, baja, cierre?

Si [1] y [2] son ciertos creo que mi método es válido porque en mi método cada barra sólo tiene 1 tick. Por lo tanto, la apertura, el máximo, el mínimo y el cierre tienen el mismo valor. Por lo tanto, cuando metatrader utiliza estos para interpolar los ticks - todos los ticks interpolados reciben exactamente el mismo valor/precio. Por lo tanto, la interpolación de metatrader de nuevos ticks no es un problema - no cambia nada. [...]

Ya veo... Gracias por aclararlo. Bueno, si la barra tiene O=C=H=L y volumen=1 entonces efectivamente sólo debería formarse 1 tick. Pero eso significaría que estás 'estirando' la escala de tiempo por el volumen medio de la barra. Y lo estás estirando 'uniformemente' aunque diferentes barras tengan diferentes volúmenes. Esto debería afectar gravemente a la mayoría de los expertos. También significaría que las fechas/horas en los informes de las pruebas se estirarían y que el intercambio se llevaría a cabo innumerables veces más de lo que debería. Esto suena extremadamente poco fiable y creo que simplemente no 'funcionará' para la mayoría de los expertos.


De todos modos, para responder a tu pregunta de 'cómo hacerlo'. Simplemente cree un archivo M1 HST con cada barra representando un solo tick. Esto se puede hacer a través de un script. La estructura del archivo HST está documentada en el manual (Ayuda del Terminal) y puede reutilizar algún código del script csv2fxt.


p.s. Si estás interesado en cómo se hace la interpolación en el Tester, hay un buen artículo sobre cómo se hace en el Tester de MT5... Debería ser muy similar (si no igual) a lo que se hace en el Tester de MT4 -> https://www.mql5.com/en/articles/75.

 

Como aclaración adicional a la anterior:

Cada tick tiene su propia barra M1 (una barra con una fecha y una hora únicas, con el tiempo en la resolución de minutos enteros).

Por lo tanto, esto significa que el tiempo se desplaza - la barra de un tick puede tener un tiempo muy diferente a cuando ese tick realmente ocurrió.

Pero esto NO es un problema para mí. No necesito saber la hora con exactitud. Sé los datos que pongo en el backtest (desde esta fecha hasta esta otra) y sabré al final si se ha obtenido un beneficio o una pérdida al final de este periodo con este método. (la fecha exacta/tiempo en el gráfico de salida no me concierne)

Una vez más, me gustaría que me corrigieran. ¿Es todo esto un sonido o una locura? Por favor, tómese el tiempo para entender lo que he dicho en lugar de sólo referirse a Birts. porque si puedo conseguir correctamente a través de este y transmitirlo y es el sonido - creo que podría ser una mejor manera de hacer las cosas.

 

mikey:

[...] Pero esto NO es un problema para mí. No necesito saber el tiempo con exactitud. Sé qué datos pongo en el backtest (de esta fecha a esta otra) y sabré al final si se ha obtenido un beneficio o una pérdida al final de este periodo con este método. (la fecha/tiempo exacto en el gráfico de salida no me preocupa) [...]

OK. ¿Pero está absolutamente seguro de que esto no afectará al experto? Por ejemplo, cualquier experto que dependa de la consideración de los plazos o de los índices que se basan en los plazos no funcionará como se supone. También tendrás que poner el swap a cero, porque seguro que no se calculará correctamente. Podría haber otros efectos secundarios que no estoy pensando en este momento ... Me parece muy peligroso.
 
Por cierto, vas a tener que descartar los datos de volumen ya que son irrelevantes para la forma en que se calcula en MT4 (volumen = número de ticks recibidos en una barra).
 

Sip. Tu respuesta acaba de llegar cuando envié la última.

RE: volumen ... - si mi EA doesnt "leer" el volumen soy seguro en esto? ¿No tengo que preocuparme por eso? No pensé en el volumen - pero entonces como digo mi EA no "lee" para nada. Así que, sólo para aclarar - puedo ignorar el volumen? ¿O tal vez debería establecer el volumen a 1 para todas las barras?