les aventures d'un débutant - page 10

 
niko:
Your wish is my command (j'allais dire "high flyer" mais j'ai vérifié le dictionnaire en ligne et apparemment c'est un commentaire grossier, laissez tomber)

Ok. Je n'ai jeté qu'un coup d'oeil rapide car vous êtes maintenant un peu trop aléatoire à mon goût.

Vous n'avez pas basé vos modifications sur la dernière version de mon code.

Par conséquent, je n'ai aucune idée si la dernière version de mon code a fait ce dont vous aviez besoin, avant que vous ne commenciez à ajouter d'autres choses à la version précédente.

Mais ce que j'ai remarqué, c'est que juste au début de la fonction start(), il manque l'accolade d'ouverture. Je croyais qu'on en avait déjà parlé.

Vous devez exercer un certain contrôle. Si vous devez changer quelque chose, assurez-vous d'ajouter votre changement à la dernière version. Et faites-nous savoir quelle est votre modification et pourquoi vous la faites.


CB.

 
niko wrote >>

Tim,

J'ai obtenu le code au point où il n'y a pas d'erreurs signalées lorsqu'il est compilé (il s'agissait juste de corriger quelques bogues que vous avez soulignés), même si dans le testeur de stratégie il ne fait pas encore de trades. Mais il y a quelque chose qui m'intrigue : ...

Bonjour Nick,

En regardant vos commentaires ici et certaines des modifications que vous avez apportées au code, je pense que votre "perplexité" peut provenir d'une confusion entre les variables et les paramètres de fonction. Ils ont l'air et agissent de manière assez similaire, mais en fait ce sont des bêtes très différentes.


Peut-être que l'exemple de code commenté ci-dessous rendra les choses un peu plus claires.


J'ai pris la liberté de mettre un peu plus d'ordre dans le code de développement et de changer un peu les noms de quelques paramètres de fonctions pour essayer de les différencier des autres variables. J'ai également déplacé toutes les notes superflues, les commentaires, etc. dans un "Appendice" à la fin du fichier pour que vous puissiez en faire ce que vous voulez.

Le code a l'air bon. Il y a encore quelques petites choses à faire que j'ai marquées dans le fichier en tant que TODO's, mais la tâche principale qui vous attend maintenant est le débogage et les tests.


Les tests sont une partie très importante du cycle de développement. Dans le cas des systèmes de trading, si les tests ne sont pas effectués correctement, cela peut entraîner des problèmes subtils qui peuvent perturber votre stratégie de trading et, en fin de compte, votre compte. La tâche principale des tests est de s'assurer que le code fait ce que vous attendez de lui. En fait, vous devez soit écrire, soit vous dire à vous-même : "Dans cette situation, j'attends ce résultat". Ensuite, vous concevez et exécutez votre test pour voir si c'est bien ce qui se passe. Si ce n'est pas le cas, vous devez rectifier le problème. Vous répétez ce processus pour toutes les situations probables que vous pouvez envisager et peut-être aussi pour certaines situations improbables. Bien entendu, vous recherchez également les erreurs d'exécution ou les bogues qui peuvent apparaître ou non dans les messages d'erreur du système MetaTrader.


Avec MT4, votre principal outil de test sera le testeur de stratégie et les fichiers journaux (sous l'onglet Journal) ainsi que les fonctions Résultats, Graphique et Rapport.


En ce qui concerne le fichier journal, je trouve souvent plus facile d'ouvrir l'ensemble du fichier dans le Bloc-notes de Microsoft plutôt que d'essayer d'en examiner une partie dans la visionneuse du journal. N'oubliez pas d'effacer le fichier journal/journal avant chaque exécution, sinon vous finirez par consulter un grand nombre d'informations anciennes, qui ne sont peut-être plus pertinentes. Après chaque exécution de test dans le testeur de stratégie, vous examinez le fichier journal à la recherche de messages de débogage et de messages système Metatrader. Vous pouvez utiliser votre documentation MetaTrader onine pour rechercher les codes d'erreur afin d'obtenir des informations supplémentaires. Utilisez également les fonctions Résultats, Graphiques et Rapport pour voir ce que fait le programme dans un ensemble particulier de conditions.


Conseil - Lorsque vous effectuez vos premiers tests, veillez à ce que la période de test soit courte, afin de minimiser la quantité de données dans le fichier journal.


Nous avons déjà intégré quelques fonctions de débogage dans le code, mais vous aurez probablement besoin de les développer. Désactivez les instructions de débogage individuelles selon les besoins pour que les informations du fichier journal soient condensées et pertinentes. Il y a un exemple dans le code qui montre comment faire cela sans supprimer ou commenter les déclarations de débogage, ce qui peut prendre beaucoup de temps. Je laisse mes principales déclarations de débogage dans le fichier du programme indéfiniment et je les désactive toutes avec le drapeau DEBUG_ON dans le programme une fois que j'ai fini de tester.


La gestion efficace des fichiers journaux et des instructions de débogage est, je crois, la clé d'un test et d'un débogage efficaces dans l'environnement MetaTrader. J'ai vu des personnes sur ce forum râler à propos du manque d'outils de débogage dans MetaTrader. Des millions de lignes de code commercial ont été déboguées et testées avec succès à l'aide d'outils pas plus sophistiqués que ceux que l'on trouve dans MetaTrader. Ces outils peuvent être basiques mais ils fonctionnent parfaitement, à condition que vous sachiez les utiliser correctement.


Un autre point à souligner est qu'essayer de déboguer un code désordonné ou mal organisé peut prendre beaucoup de temps et être frustrant. C'est à partir de ce moment que vous commencerez vraiment à récolter les bénéfices de votre code bien structuré et bien commenté. Si quelqu'un d'autre a besoin de travailler sur votre code, il vous sera très reconnaissant pour vos efforts à cet égard.


Nick, ce voyage a encore du chemin à parcourir. Pour moi, les tests, le débogage et l'optimisation - le fait de "tout faire fonctionner" - constituent la partie la plus intéressante du travail, et souvent la plus difficile. Je vous transmettrai le code pour que vous commenciez à le tester et j'attends que vous me fassiez part des questions et/ou des problèmes que vous rencontrez.


Salutations

Tim



Un exemple de code simple pour essayer de démontrer la différence entre une variable globale et un paramètre de fonction

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
stringMyGlobalVariable; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = "Nick"; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction(MyGlobalVariable); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment(MyFunctionParameter); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

Dossiers :
 
hey CB, c'est étrange car j'enregistre toujours le fichier mq4 comme nouveau, avec la date la plus récente pour séparer les autres fichiers. la confusion doit avoir glissé à travers. le crochet que je voulais inclure, mais j'ai pensé à un moment donné que vous m'avez demandé de l'enlever (c'était le dernier, mais sans le dernier, le start() serait déséquilibré. c'est pourquoi j'ai enlevé le premier aussi, mais je vais le remettre).
 
niko:
hey CB, c'est étrange car je sauvegarde toujours le fichier mq4 comme nouveau, avec la date la plus récente pour séparer les autres fichiers. la confusion a dû se glisser. la parenthèse que je voulais inclure, mais je pensais qu'à un moment donné tu m'avais demandé de l'enlever (c'était la dernière, mais sans la dernière, le start() serait déséquilibré. c'est pourquoi j'ai aussi enlevé la première, mais je la remettrai).

Ne commençons pas à ajouter et à supprimer des accolades bon gré mal gré. J'avais déjà signalé que vous aviez un ensemble complètement superflu, qui pouvait être supprimé.

Voici la dernière version. Veuillez faire ce qui suit :

- Compilez-la d'abord et corrigez les erreurs éventuelles - de cette façon, vous saurez que toute erreur ultérieure est due aux modifications que vous pourriez apporter.

- Faites-moi savoir si vous avez dû corriger des erreurs.

- Essayez-le et voyez s'il répond à vos besoins.

- Faites-moi savoir comment cela se passe - et faites-moi savoir quels changements vous pensez devoir faire.


CB

Dossiers :
 
Merci, CB. Je vais m'en occuper, désolé si je vous ai un peu frustré.
 

Merci, Tim,

J'apprécie vraiment le temps que tu consacres à m'expliquer ces choses, c'est très encourageant. J'ai l'impression d'avoir des "flashs" de compréhension, puis de ne pas comprendre du tout (concernant les fonctions et les appels), même si j'ai dû lire la documentation sur les fonctions vingt fois déjà. Je vais y consacrer plus de temps. En ce qui concerne les "tests et le débogage", je l'ai déjà fait dans un autre paquet (en passant en revue toutes les transactions effectuées, en m'assurant que tout allait bien ensemble) car je pense que c'est essentiel, même pour le trading manuel(test de stratégie). Je vais poursuivre avec votre code et je vous tiendrai au courant.

 
niko:
Merci CB. Je vais m'en occuper, désolé si je vous ai un peu frustré.

Ne vous inquiétez pas, mon ami. J'essaie juste de prendre les choses étape par étape.


CB

 

Salut CB,


J'ai corrigé quelques bugs dans le code, il manquait principalement des parenthèses, c'est mis en évidence dans le code. Plus d'erreurs de syntaxe.

J'ai exécuté le code sur le testeur de stratégie, mais il ne fait que des transactions d'ACHAT. Pas d'opérations à découvert. J'ai regardé dans les logs, il produit l'erreur 130 (à faire avec les stops) donc cela ne nous éclaire pas sur notre problème.

J'ai essayé de voir si je pouvais trouver où se trouve l'erreur (je suppose que c'est dans fnSHouldWeTrade ou fnOrderDuplicate).

La dernière version du code est jointe, j'ai ajouté des valeurs à TopFilter et BotFilter pour permettre à la stratégie de faire des transactions.

ps : j'ai compris pourquoi j'ai collé l'ancien code pour vous avant, j'ai réinstallé mt4 dans un dossier différent (pas d'erreurs de connexion) et le code était un ancien duplicata de l'ancien dossier.

 
niko:

Salut CB,


J'ai corrigé quelques bugs dans le code, il manquait principalement des parenthèses, c'est mis en évidence dans le code. Plus d'erreurs de syntaxe.

J'ai exécuté le code sur le testeur de stratégie, mais il ne fait que des transactions d'ACHAT. Pas d'opérations à découvert. J'ai regardé dans les logs, il produit l'erreur 130 (à faire avec les stops) donc cela ne nous éclaire pas sur notre problème.

J'ai essayé de voir si je pouvais trouver où se trouve l'erreur (je suppose que c'est dans fnSHouldWeTrade ou fnOrderDuplicate).

Dernière version du code ci-joint, j'ai ajouté des valeurs à TopFilter et BotFilter pour permettre à la stratégie de faire des transactions.

ps : j'ai compris pourquoi j'ai collé l'ancien code pour vous avant, j'ai réinstallé mt4 dans un dossier différent (pas d'erreurs de connexion) et le code était un ancien duplicata de l'ancien dossier.


Changer :

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point, "Nikos First EA",0,0,Red) ;

à :

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point, "Nikos First EA",0,0,Red) ;


CB

 
merci CB, j'aurais dû le remarquer, donc l'erreur était juste à la fin (130).