Backtesting avec données en ticks

 

Backtesting avec des données en tick

Je pense avoir trouvé un bon moyen de faire cela dans Metatrader - et j'ai fait un bon bout de chemin avec cette méthode mais je suis resté bloqué et je cherche de l'aide pour la dernière étape.

1) J'ai obtenu des données en tick d'une société (source commerciale) symbole : CL (pétrole) Les sources gratuites, par exemple dukascopy, etc. n'ont pas ce symbole.
2) J'ai utilisé le logiciel de la société pour rendre ces données en ticks dans un format de barre (sans aucune perte de résolution). Le format barre :

Date, heure, ouverture, haut, bas, fermeture, volume.

Chaque barre ne comporte qu'un tick ! Donc, pour une barre donnée, l'ouverture, le haut, le bas, la fermeture sont tous les mêmes car il n'y a qu'un seul tick dans la barre.

3) Je récupère ces données tick dans le testeur de stratégie metatrader en allant dans les dossiers de l'historique metatrader et en supprimant tous les fichiers pertinents qui s'y trouvent. J'ouvre metatrader hors ligne et j'utilise le centre de l'historique et la fonction d'importation pour obtenir les données. Bien sûr, bien qu'il s'agisse de données tick - avec leur format de barre - elles sont acceptées sans problème par metatrader. Lorsque j'utilise strategy tester (toujours hors ligne bien sûr), je peux accéder à ces données.

4) MAIS le problème : Selon metatrader, dans ces données il y a plusieurs barres avec la même date et heure (parce que metatrader ignore les secondes ; le plus petit qu'il considère sont les minutes). Je pense que la solution à ce problème est de MODIFIER les données de sorte que toutes les barres aient des dates et des heures différentes (à une résolution qui peut être prise en compte par metatrader). Ainsi, par exemple, si
une barre a un horodatage de 18:00:00 et la suivante a un horodatage de 18:00:08 - alors cette deuxième barre doit être modifiée pour avoir un horodatage de 18:01:00. Ainsi, metatrader peut la considérer comme la barre suivante. Cela changerait tous les horodateurs (et les horodateurs en temps voulu) bien sûr, mais je ne pense pas que cela soit vraiment important. Ma question est la suivante : comment puis-je modifier tous les horodateurs de cette manière ?

Bien sûr, les données comportent trop d'entrées pour Excel. J'ai accès à Microsoft Access.

Peut-être qu'un script qui ajouterait 1 seconde itérativement à chaque entrée de temps pourrait fonctionner. Mais il faudrait changer l'heure en conséquence au fur et à mesure que l'on monte et ensuite la date bien sûr. C'est ce qui m'ennuie, ce qui me bloque. Je ne sais pas comment m'y prendre.


Un échantillon de mes données tick basées sur les barres est coupé et collé ci-dessous.
(il s'agit de données CL - sweet crude oil future)

date, heure, ouverture, haut, bas, fermeture, 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

Notez que je peux rendre les données sans les secondes et seulement en minutes, ce qui pourrait m'aider à trouver une solution.

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

 
Le testeur utilise des fichiers FXT et ceux-ci ont également des secondes. Malheureusement, ces fichiers FXT sont écrasés à chaque test successif et les utilisateurs ne peuvent donc pas y placer leurs propres données (dans les anciennes versions de MT4, c'était possible -> https://www.mql5.com/en/forum/103180/page6#321081). Il existe un moyen de surmonter cet obstacle... Voir ici pour des informations détaillées -> http://eareview.net/tick-data.
 

Ce site web semble être la réponse standard à tout ce qui concerne les tiques.

Mais ce que j'essaie de faire est quelque chose de différent (j'ai pris un chemin différent parce que mes données tick ne proviennent pas de la même source que ce site suppose - elles ont un point de départ différent et ne sont donc pas un substrat approprié pour les fichiers/systèmes de conversion proposés).

En effet, avec ma méthode, il n'est PAS nécessaire d'utiliser une ancienne version de Metatrader. Si je ne me trompe pas. J'y suis presque aussi - j'ai juste besoin d'aide pour la dernière étape finale,

 

Qu'en pensez-vous ?

1) Suis-je sur une voie valable ?

Comme je l'ai dit, je ne peux pas utiliser la trajectoire de ce site (Birt EA) car elle n'est pas valide pour mon point de départ.

2) Si c'est le cas - avez-vous une idée pour surmonter le dernier point d'achoppement sur lequel je suis ?

 
Soit vous n'avez pas compris la méthode de Birt, soit je ne vous comprends pas. Ce qui suit n'a aucun sens :


mikey:

[...]

4) MAIS le problème : Selon metatrader, dans ces données, il y a plusieurs barres avec la même date et la même heure (parce que metatrader ignore les secondes ; le plus petit qu'il considère sont les minutes). Je pense que la solution à ce problème est de CHANGER les données pour que toutes les barres aient des dates et des heures différentes (à une résolution qui peut être prise en compte par metatrader). [...]

Cela ne résoudra rien puisque le testeur interpolera toujours d'abord les ticks pour les backtester, indépendamment de ce que vous faites dans le centre d'historique. L'idée principale derrière la méthode de Birt est de remplacer le fichier de ticks interpolés par un fichier contenant des ticks réels pour que le Testeur puisse les tester. Même si vous réussissez dans votre tentative actuelle, le Testeur interpolera toujours les ticks pour les tester, donc cela n'a aucun sens.


Je vous recommande de lire ceci -> https://www.mql5.com/en/articles/1511 et de relire le tutoriel de Birt. Votre objectif devrait être de créer un fichier FXT correct avec de vrais ticks pour remplacer le fichier FXT généré par le Tester. En utilisant la méthode de Birt, vous pouvez désactiver le "recalcul" et faire en sorte que le Testeur utilise votre fichier FXT (avec vos vrais ticks).

 

Tout dépend de ceci :

1) Metatrader interpole-t-il les ticks uniquement DANS les barres ? (Je pense que oui)

2) Et il le fait en étant guidé et contraint par les valeurs données de la barre : open, high, low, close ?

Si [1] et [2] sont vrais, je pense que ma méthode est valide car dans ma méthode, chaque barre n'a qu'un tick. Ainsi, l'ouverture, le haut, le bas et la fermeture sont tous égaux en valeur. Ainsi, lorsque metatrader les utilise pour interpoler les ticks, tous les ticks interpolés ont exactement la même valeur/prix. Ainsi, l'interpolation des nouveaux ticks par metatrader ne pose pas de problème - elle ne change rien.

Je pense que je comprends les problèmes et je pense que je pourrais être sur la voie de ce que je crois être une meilleure façon de faire les choses. MAIS je suis prêt à être corrigé. Je suis peut-être naïf.

 
mikey:

1) Metatrader interpole-t-il les ticks DANS les barres uniquement ? (Je pense que oui)

2) Et il le fait en étant guidé et contraint par les valeurs données de la barre : ouverture, haut, bas, fermeture ?

Si [1] et [2] sont vrais, je pense que ma méthode est valide car dans ma méthode, chaque barre n'a qu'un tick. Ainsi, l'ouverture, le haut, le bas et la fermeture sont tous égaux en valeur. Ainsi, lorsque metatrader les utilise pour interpoler les ticks, tous les ticks interpolés ont exactement la même valeur/prix. Ainsi, l'interpolation des nouveaux ticks par metatrader n'est pas un problème - elle ne change rien. [...]

Je vois... Merci de clarifier cela. Eh bien, si la barre a O=C=H=L et volume=1 alors effectivement 1 tick seulement devrait être formé. Mais cela signifie que vous "étirez" l'échelle de temps par le volume moyen de la barre. Et vous l'étirez "uniformément" bien que des barres différentes aient des volumes différents. Cela devrait avoir de graves conséquences pour la plupart des experts. Cela signifierait également que les dates/heures sur les rapports d'essai seraient étirées et que l'échange serait pris d'innombrables fois plus qu'il ne le devrait. Cela semble extrêmement peu fiable et je pense que cela ne fonctionnera pas pour la plupart des experts.


Quoi qu'il en soit, pour répondre à votre question "comment faire". Créez simplement un fichier HST M1 avec chaque barre représentant un tick unique. Cela peut être fait via un script. La structure du fichier HST est documentée dans le manuel (aide du terminal) et vous pouvez réutiliser certains codes du script csv2fxt.


p.s. Si vous êtes intéressé par la façon dont l'interpolation est faite dans le Tester, il y a un bon article sur la façon dont elle est faite dans le MT5 Tester... Cela devrait être très similaire (sinon identique) à ce qui se passe dans le testeur MT4 -> https://www.mql5.com/en/articles/75.

 

Une précision supplémentaire à ma dernière question :

Chaque tick reçoit sa propre barre M1 (une barre avec une date et une heure uniques, avec une résolution en minutes entières).

Cela signifie donc que l'heure est décalée - la barre d'un tick peut avoir une heure très différente de celle à laquelle ce tick s'est réellement produit.

Mais ce n'est PAS un problème pour moi. Je n'ai pas besoin de connaître l'heure avec précision. Je sais quelles données je mets dans le backtest (de cette date à cette date) et je saurai à la fin si un profit ou une perte a été réalisé à la fin de cette période avec cette méthode. (les dates/heures exactes sur le graphique de sortie ne me concernent pas).

Encore une fois - je me permets d'être corrigé. Est-ce que tout cela est sain ou insensé ? S'il vous plaît, prenez le temps de comprendre et de revoir ce que j'ai dit plutôt que de me référer à Birts. Parce que si j'arrive à bien faire passer ce message et à le relayer et que c'est sain, je pense que cela pourrait être une meilleure façon de faire les choses.

 

mikey:

[...] Mais ce n'est PAS un problème pour moi. Je n'ai pas besoin de connaître l'heure avec précision. Je sais quelles données je mets dans le backtest (de telle date à telle date) et je saurai à la fin si un bénéfice ou une perte a été réalisé à la fin de cette période avec cette méthode. (les dates/heures exactes sur le graphique de sortie ne me concernent pas) [...]

OK. Mais êtes-vous absolument sûr que cela n'affectera pas l'expert ? Par exemple - tout expert qui s'appuie sur la prise en compte des délais ou des indicateurs qui sont basés sur les délais ne fonctionnera pas comme il le devrait. Vous devrez également remettre le swap à zéro, car il ne sera pas calculé correctement. Il pourrait y avoir d'autres effets secondaires auxquels je ne pense pas pour le moment... Cela me semble très dangereux.
 
BTW, vous allez devoir supprimer les données de volume car elles ne sont pas pertinentes pour la façon dont elles sont calculées dans MT4 (volume = nombre de ticks reçus dans une barre).
 

Oui, votre réponse est apparue au moment où j'ai envoyé ma dernière réponse.

RE : volume...- si mon EA ne "lit" pas le volume, suis-je en sécurité ? Je n'ai pas à m'en inquiéter ? Je n'ai pas pensé au volume - mais comme je l'ai dit, mon EA ne le "lit" pas. Donc, juste pour clarifier - je peux ignorer le volume ? Ou bien devrais-je mettre le volume à 1 pour toutes les barres ?

Raison: