Comment coder ? - page 306

 

Bonjour,

Je n'arrivais pas à faire quoi que ce soit avec les fonctions, je les ai vérifiées un nombre incalculable de fois sans résultat. J'ai donc décidé d'écrire beaucoup de messages Print() à chaque étape de mon code pour voir jusqu'où il allait avant de s'arrêter. En fait, il ne va pas aussi loin que la fonction GetLots et échoue lors de la vérification de mes critères d'achat et de vente. Bizarrement, je n'ai pas modifié cette partie du code, mais il y a quelque chose qui cloche - mais au moins, je sais maintenant sur quoi me concentrer !

 

Bonjour à tous,

J'ai testé mon code plus tôt aujourd'hui et il a fonctionné relativement bien. Sans changer le code ou les critères de backtest (comme les dates, etc.), j'ai fait un backtest une heure plus tard et les résultats sont complètement différents, c'est-à-dire aucun résultat. Je me demande donc pourquoi cela s'est produit ? Par exemple, la connectivité de MT4 ?

 

...

Si vous n'avez modifié aucun paramètre, vérifiez ce qui suit : lorsque vous exécutez le back-test, ouvrez l'onglet journal et vérifiez si des erreurs y sont inscrites. Des erreurs dans l'exécution des ordres peuvent être à l'origine de résultats erratiques. Vérifiez également si vos critères d'achat et de vente sont "solides" : c'est-à-dire qu'ils entreront sur un même point.

crsnape@btinternet.com:
Bonjour à tous, j'ai testé mon code plus tôt dans la journée et il a relativement bien fonctionné. J'ai testé mon code plus tôt aujourd'hui et il a fonctionné relativement bien. Sans changer le code ou les critères de backtest (comme les dates etc.) j'ai fait un backtest une heure plus tard et les résultats sont complètement différents, comme dans aucun résultat. Je me demande donc pourquoi cela s'est produit ? Par exemple, la connectivité de MT4 ?
 

Je ne reçois aucune erreur dans mon journal. La première entrée est la suivante :

2012.07.22 15:35:37 H4 Period EA EURUSD,H4 : chargé avec succès.

Suivie d'une énorme liste de celles-ci :

2012.07.22 15:47:07 TestGenerator : unmatched data error (volume limit 56304 at 2012.07.19 12:00 exceeded)

et enfin :

2012.07.22 15:47:07 Entrées H4 Period EA : MagicNumber=42 ; RiskRewardRatio=3 ; D1SlowMAPeriod=200 ; D1FastMAPeriod=50 ; FastMACDPeriod=12 ; SlowMACDPeriod=26 ; SignalPeriod=9 ; DNCPeriod=120 ; SL_Period=10 ;

Mais rien ensuite.

Mon test a été effectué du 04.01.2012 au 21.07.2012.

 

...

Alors vous avez un problème avec les conditions d'entrée (votre EA n'a jamais essayé d'ouvrir un ordre).

crsnape@btinternet.com:
Je ne reçois aucune erreur dans mon journal. La première entrée est la suivante :

2012.07.22 15:35:37 H4 Period EA EURUSD,H4 : chargé avec succès

Suivi d'une énorme liste de ceux-ci :

2012.07.22 15:47:07 TestGenerator : unmatched data error (volume limit 56304 at 2012.07.19 12:00 exceeded)

et enfin :

2012.07.22 15:47:07 Entrées H4 Period EA : MagicNumber=42 ; RiskRewardRatio=3 ; D1SlowMAPeriod=200 ; D1FastMAPeriod=50 ; FastMACDPeriod=12 ; SlowMACDPeriod=26 ; SignalPeriod=9 ; DNCPeriod=120 ; SL_Period=10 ;

Mais rien ensuite.

Mon test a été effectué du 04.01.2012 au 21.07.2012.
 

Oui, c'est étrange car avant, il entrait dans les positions. J'ai écrit des print() dans mon code du début à la fin et rien n'est écrit dans le journal pour enregistrer même le tout début de mon code. Pas même celui-là pour vérifier si une position précédente a déjà été ouverte sur la barre actuelle :

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false) ;

GlobalVariableSet(barsGV,Bars) ;

}

//--- Vérification de la possibilité d'une position longue (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST") ;

si (... conditions d'entrée...

 

...

Si votre EA a essayé à un moment donné d'ouvrir un ordre, cela aurait été écrit dans le journal (erreur ou pas, peu importe - s'il y avait eu une erreur, une erreur aurait été là, s'il a ouvert un ordre, cela aurait été écrit là).

Mais puisque rien n'y est écrit, cela signifie que votre EA n'est jamais arrivé au stade d'essayer d'ouvrir un ordre et cela ne peut arriver que si votre ensemble de conditions qui doivent être remplies dans l'EA n'arrive jamais au stade d'ouvrir un ordre. Vous devez donc clarifier vos conditions. Commencez par la condition la plus simple que vous connaissez et qui s'exécutera, puis ajoutez des conditions. De cette façon, vous serez en mesure d'identifier l'étape qui vous empêche d'ouvrir des ordres.

crsnape@btinternet.com:
Oui, c'est étrange car avant, il entrait dans les positions. J'ai écrit des print() dans mon code du début à la fin et rien n'est écrit dans le journal pour enregistrer même le tout début de mon code. Pas même celui qui vérifie si une position précédente a déjà été ouverte sur la barre actuelle :

si ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false) ;

GlobalVariableSet(barsGV,Bars) ;

}

//--- Vérification de la possibilité d'une position longue (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST") ;

si (... conditions d'entrée...)
 

J'ai mis un peu plus de Print()s après les commandes if et je pense qu'il échoue à ce stade, en particulier la ligne rouge car mon journal arrête de s'imprimer après ce point.

//--- VARIABLES GLOBALES

string HasOrderedGV = "has_ordered_GV" ;

string barsGV = "bars_GV" ;

//--- Déterminer si l'ordre a déjà été passé sur le bloc horaire H4

si ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false) ;

GlobalVariableSet(barsGV,Bars) ;

}

Print("Détermine si l'ordre a déjà été passé pour la barre actuelle ", HasOrderedGV) ;

//--- Vérifier la possibilité d'une position longue (BUY)

si (GlobalVariableGet (HasOrderedGV) == false)

{

J'ai trouvé ce bout de code en ligne et je l'ai utilisé dans le mien. Mais je me demande maintenant si cela va fonctionner. La variable globale barsGV est déclarée comme une chaîne de caractères, mais elle est référencée à 0 dans la première ligne. Est-ce correct ?

 

...

Ce code fonctionne correctement lorsqu'il est exécuté pour la première fois.

0 est testé pour la raison suivante :

double GlobalVariableGet([/TD] [TD]string name)

"Renvoie la valeur d'une variable globale existante ou 0 si une erreur se produit".

L'erreur lors de la récupération de la valeur de la variable globale serait lorsque la variable globale n'est pas encore créée. Mais, comme je l'ai dit, ce code est correct lorsqu'il est exécuté pour la première fois. Le problème est le suivant : imaginez que vous exécutez un test et que la valeur de barsGV est fixée à 5000 à la fin du test. Maintenant vous exécutez à nouveau l'EA et les barres seront toujours inférieures à la valeur barsGV (qui est toujours 5000). Il (le code) doit être écrit différemment. Utilisez quelque chose comme ceci

GlobalVariableSet(barsGV,0) ;

dans le init(), et cela devrait fonctionner correctement pour les tests consécutifs également. Mais cela va aussi, artificiellement, "prétendre" qu'il n'y a pas d'ordre ouvert sur la barre actuelle lorsque vous lancez l'EA, ce qui peut être une erreur. Il est préférable d'utiliser la fonction pour compter les ordres ouverts sur une barre courante plutôt que d'utiliser des variables globales à cette fin (pour de multiples raisons).

________________________________________________

PS : utiliser une ou plusieurs variables globales de cette manière vous empêche d'utiliser plusieurs instances d'un EA (chaque variable globale est visible depuis un autre code - n'importe quel code : EA,script, indicateur ..., donc si le nom n'est pas unique, vous risquez un mélange d'EAs lisant et paramétrant tous la même variable globale en même temps)

crsnape@btinternet.com:
J'ai mis un peu plus de Print()s après les commandes if et je pense qu'il échoue à ce stade, en particulier la ligne rouge car mon journal arrête de s'imprimer après ce point.

//--- VARIABLES GLOBALES

string HasOrderedGV = "has_ordered_GV" ;

string barsGV = "bars_GV" ;

//--- Déterminer si l'ordre a déjà été passé sur le bloc horaire H4

si ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false) ;

GlobalVariableSet(barsGV,Bars) ;

}

Print("Détermine si l'ordre a déjà été passé pour la barre actuelle ", HasOrderedGV) ;

//--- Vérifier la possibilité d'une position longue (BUY)

si (GlobalVariableGet (HasOrderedGV) == false)

{

J'ai trouvé ce bout de code en ligne et je l'ai utilisé dans le mien. Mais je me demande maintenant s'il va fonctionner. La variable globale barsGV est déclarée comme une chaîne de caractères, mais elle est référencée à 0 dans la première ligne. Est-ce correct ?
 

Ahh... Je vois. Parce que les variables globales enregistrent leurs valeurs en mémoire. Donc, comme vous le dites, lorsqu'il termine le backtesting et qu'il est à 5000, cela est sauvegardé en mémoire même si le backtesting est ré-exécuté, donc il ne retournera jamais faux parce que BarsGV n'est pas en dessous de 5000 ? C'est très profond.

Et aussi, s'il génère une erreur, il met HasOrderedGV à false pour pouvoir continuer avec le reste du code ?

Ai-je bien compris ?

BTW- est-ce autorisé ?

GlobalVariableSet(HasOrderedGV, false) ;

Parce que dans le MQL4 Book il est dit :

datetime GlobalVariableSet([/TD] [TD]string name, double value)

La deuxième valeur dans mon instance est bool et non double ?

Raison: