Articles Populaires

Choix De L'Éditeur - 2019

MQL4: Nous écrivons un conseiller à la fois pour MT4 et MT5

Salutations les amis!

Beaucoup d'entre vous ont probablement déjà fait face à ce désagrément plus d'une fois: ils ont écrit un conseiller dans mql4, puis je voulais essayer de jouer avec MetaTrader 5. Réécrire tout le code est une tâche plutôt fastidieuse et longue, et vous devez également commencer par travailler sur le travail existant. . Rédiger deux experts différents séparément pour MT4 et pour MT5 prend également beaucoup de temps. Nous allons résoudre ce problème aujourd'hui dans un nouveau tutoriel vidéo.

Alors que faire? La réponse est simple: écrivez un conseiller pour deux terminaux à la fois. Après tout, pour la plupart, les langages mql4 et mql5 ne diffèrent pas tellement, de nombreuses méthodes et la structure de base des scripts dans ces langages sont similaires. S'il était possible d'écrire du code commun dans un script, et que les différentes sections pourraient simplement être réécrites dans les deux langues et obliger le compilateur à choisir les morceaux de code nécessaires, cela économiserait beaucoup de temps et de nerfs.

Heureusement, MetaEditor prend en charge les directives de compilation conditionnelle du préprocesseur. Et aujourd'hui, nous verrons comment cela se fait à l'aide d'un exemple très simple.

#ifdef identifiant // Le code ici est compilé si l'identifiant a déjà été défini pour le préprocesseur dans la commande #define. #endif

Dans le code pour MT5, nous allons remplacer les variables de MQL4 en utilisant la directive #define:

#ifdef __MQL5__ #define OrdersTotal PositionsTotal #endif

Dans l'en-tête du conseiller, nous plaçons les variables d'entrée:

entrée int Stop = 300; input int Take = 400; input int Slip = 100; entrée int MN = 123; entrée double LT = 0,1;

Maintenant, vous pouvez écrire des méthodes pour acheter et vendre:

bool Buy (double prix, double sl, double tp) {#ifdef __MQL4__ int ticket = OrderSend (Symbol (), 0, LT, prix, Slip, sl, tp, "", MN); if (ticket <0) {PrintFormat ("Erreur OrderSend% d", GetLastError ()); } #endif #ifdef __MQL5__ // --- déclaration et initialisation de la requête et du résultat MqlTradeRequest request = {0}; MqlTradeResult resultat = {0}; // --- paramètres de requête request.action = TRADE_ACTION_DEAL; // type d'opération d'échange request.symbol = Symbol (); // character request.volume = LT; // volume request.type = 0; // type de commande request.price = price; // prix d'ouverture request.sl = sl; // price StopLoss request.tp = tp; // price TakeProfit request.deviation = Slip; // écart autorisé par rapport au prix request.magic = MN; // commandes MagicNumber // --- envoi d'une demande si (! OrderSend (demande, résultat)) {// si la demande n'a pas pu être envoyée, affiche un code d'erreur PrintFormat ("erreur OrderSend% d", GetLastError ()); } // --- informations sur l'opération PrintFormat ("retcode =% u deal =% I64u ordre =% I64u", result.retcode, result.deal, result.order); #endif // --- return (false); }

La méthode de vente est similaire à la méthode buy (). Nous ne penserons pas particulièrement à la stratégie dans cet exemple, nous recevrons une condition d'ouverture aléatoire et mettrons ce code dans OnTick ():

int oper = (int) (GetTickCount ()% 2); // le reste de la division par deux est toujours 0 ou 1 si (oper == 0) {double price = Ask; double SL = NormalizeDouble (Bid - Stop * _Point, _Digits); double TP = NormalizeDouble (Bid + Take * _Point, _Digits); Acheter (Ask, SL, TP); } if (oper == 1) {double prix = enchère; double SL = NormalizeDouble (Ask + Stop * _Point, _Digits); double TP = NormalizeDouble (Ask - Take * _Point, _Digits); Vendre (Ask, SL, TP); }

Conclusion

C'est tout. Maintenant, vous pouvez compiler le code dans MetaEditor 4 et dans le terminal MetaTrader 4, cela fonctionnera. Vous pouvez compiler Expert Advisor dans MetaEditor 5 et celui-ci fonctionnera normalement dans le terminal MetaTrader 5. En outre, pour changer de terminal, vous n'avez pas besoin de réécrire une seule ligne de code - tout se compilera et fonctionnera correctement.

Laissez Vos Commentaires