Auto-apprentissage du langage MQL5 à partir de zéro - page 14

 
MrBrooklin:

A l'avenir, selon le plan d'autoformation, la tâche consiste à modifier le script étape par étape, à savoir :

  1. ajoutez Stop Loss et Take Profit ;
  2. ajouter la queue ;
  3. ajouter un risque maximal ;
  4. élargir la plage des ordres en attente.
Cordialement, Vladimir.
Bien sûr, c'est dommage que vous n'ayez pas suivi les conseils du tutoriel. Vous apprendrez à placer des lignes, des ordres, etc., mais vous ne serez de toute façon pas capable d'écrire une stratégie, car vous n'avez aucune base théorique. Toutes ces lignes et tous ces scripts ne vous aideront pas à comprendre les notions de base de la programmation, et vous ne pourrez pas aller loin sans cela. J'ai passé les 4 premiers mois à apprendre, sans même essayer d'écrire quoi que ce soit. Bien sûr, j'aurais pu effrontément, comme vous l'avez fait, mais la qualité de ces connaissances est faible - il y a de nombreuses lacunes dans les bases, qui devront être comblées à l'avenir...
 
Реter Konow:
Bien sûr, vous n'auriez pas dû suivre les conseils du tutoriel. Vous avez peut-être acquis les connaissances nécessaires pour définir des lignes, des ordres, etc., mais vous ne serez pas en mesure de développer la stratégie de toute façon, car vous n'avez pas de base théorique. Toutes ces lignes et tous ces scripts ne vous aideront pas à comprendre les notions de base de la programmation, et vous ne pourrez pas aller loin sans cela. J'ai passé les 4 premiers mois à apprendre, sans même essayer d'écrire quoi que ce soit. Bien sûr, j'aurais pu faire preuve d'effronterie, comme vous, mais la qualité de ces connaissances est médiocre. Il y a toujours des lacunes dans les bases, qui devront être comblées à l'avenir...

Bonjour, Peter ! J'étudie le manuel au besoin, c'est-à-dire lorsque je constate une lacune dans mes connaissances. Maintenant, je sens que je vais devoir faire une petite pause et étudier le manuel de plus près. Toutes les recommandations des participants au forum sont prises en compte et j'essaie de m'y tenir. Et maintenant, je suis étonné d'avoir réussi à écrire quelque chose en utilisant uniquement le livre de référence MQL5 pendant si peu de temps.

Salutations, Vladimir.

 
MrBrooklin:

Bonsoir à tous et bonne humeur !

Je colle un nouveau script New6.mq5 qui vous aide à placer un ordre en attente SellStop et un BuyStop avec une taille de lot fixe à une certaine distance du prix actuel sur le graphique actuel. Dans ce script, j'ai essayé de tout décrire comme je l'ai promis plus tôt, sous une forme claire et compréhensible pour un programmeur de 1ère année.

J'ai utilisé les informations tirées de la Référence MQL5 uniquement lors de l'écriture du script !

Meilleures salutations, Vladimir.

C'est un bon exemple. Je vous suggère de l'utiliser comme point de départ. Les bases.

MrBrooklin:

À l'avenir, conformément au plan d'auto-apprentissage, la tâche consistera à modifier le script étape par étape, à savoir

  1. ajoutez Stop Loss et Take Profit ;
  2. ajouter la queue ;
  3. ajouter un risque maximal ;
  4. élargir le choix des ordres en attente.
Cordialement, Vladimir.

Non, non. Ne connectez pas encore la nouvelle fonctionnalité. Améliorez maintenant la logique existante. Dans le même temps, éliminez les problèmes de mise en œuvre du script (ils sont déjà visibles). Si tu veux savoir ce qu'il faut réécrire, je vais te le dire.

 
Vasiliy Sokolov:

L'exemple est bon. Je vous suggère de l'utiliser comme point de départ. Ligne de base.

Non, non. Ne branchez pas encore de nouvelles fonctionnalités. Améliorez maintenant la logique existante. En même temps, il faut éliminer les problèmes de mise en œuvre des scripts (ils sont déjà visibles). Ce que tu dois réécrire exactement, si ça t'intéresse, je te le dirai.

Bonjour Vasily ! Bien sûr, dites-moi ce que vous devez réécrire, cela m'intéresserait !

Salutations, Vladimir.

 
MrBrooklin:

Bonjour Vasily ! Bien sûr, dites-moi ce que vous avez besoin de réécrire, je suis très intéressé !

Sincèrement, Vladimir.

Les programmeurs ont deux problèmes : les erreurs produites par le compilateur et les problèmes d'architecture. Lorsque vous êtes novice, vous vous concentrez sur la lutte avec le compilateur alors que votre objectif ultime est un programme qui fonctionne correctement. Cependant, le programme d'un débutant se transforme très vite en un code dit "spaghetti", que l'auteur lui-même n'arrive pas à comprendre assez vite. C'est pourquoi je vous suggère de vous concentrer non pas sur le compilateur et l'exactitude du script final, mais sur les questions d'architecture. C'est comme apprendre à jouer du piano : il faut d'abord apprendre à tenir les doigts correctement et à s'asseoir correctement devant l'instrument, personne n'exige d'un débutant qu'il joue du Bach.

//+------------------------------------------------------------------+
//|                                                         New6.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"   //Тип ордера UP
#define       orderType2 "SELL_STOP"  //Тип ордера DOWN
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                                                    
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(orderType1=="BUY_STOP")
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   if(orderType2=="SELL_STOP")
     {
      request.type=ORDER_TYPE_SELL_STOP; 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

Vous disposez de deux groupes de paramètres qui déterminent le comportement de votre script : le premier est défini de manière statique, sous forme de macro. Le second est défini par l'utilisateur lors du chargement du script sur le graphique. Maintenant, l'utilisateur ne pourra pas sélectionner le type de commande à passer sans recompiler ce script. Ce n'est pas bon. Par conséquent, il serait préférable d'abandonner ces macros au profit du paramètre supplémentaire :

enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1,                // Только BuyStop
    SellStop = 2,               // Только SellStop
    BuyStopAndSellStop = 4      // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

En conséquence, nous avons défini une nouvelle énumération, que nous avons implémentée comme paramètre de sélection pour l'utilisateur.

 
Vasiliy Sokolov:

Les programmeurs sont confrontés à deux problèmes : les erreurs de compilation et les problèmes d'architecture. Lorsque vous êtes débutant, vous vous concentrez sur la lutte contre le compilateur, et votre objectif ultime est un programme qui fonctionne correctement. Cependant, le programme d'un débutant se transforme très vite en un code dit "spaghetti", que l'auteur lui-même n'arrive pas à comprendre assez vite. C'est pourquoi je vous suggère de vous concentrer non pas sur le compilateur et l'exactitude du script final, mais sur les questions d'architecture. C'est comme apprendre à jouer du piano : il faut d'abord apprendre à tenir les doigts correctement et à s'asseoir correctement devant l'instrument, personne n'exige d'un débutant qu'il joue du Bach.

Vous disposez de deux groupes de paramètres qui déterminent le comportement de votre script : le premier est défini de manière statique, sous forme de macro. Le second est défini par l'utilisateur lors du chargement du script sur le graphique. Maintenant, l'utilisateur ne pourra pas sélectionner le type de commande à passer sans recompiler ce script. Ce n'est pas bon. Par conséquent, il serait préférable d'abandonner ces macros au profit du paramètre supplémentaire :

En conséquence, nous avons défini une nouvelle énumération, que nous avons implémentée comme paramètre de sélection pour l'utilisateur.

Super, en fait, vous m'avez incité à faire ce qui est écrit dans l'étape 4 de la modification pas à pas du script, à savoir élargir la sélection des ordres en attente.

Merci !

Salutations, Vladimir.

 

Le problème suivant avec votre code est qu'il s'étale en une longue feuille procédurale. Tous les débutants écrivent de cette façon. Et c'est un problème qui reste avec eux pendant des années. Apprenez à décomposer votre algorithme en plusieurs parties, en commençant par les bases, comme ce script. Il y a deux façons de le faire : par le biais de fonctions et de classes. Le concept de classes est trop difficile à appréhender au début, je vous suggère donc de vous concentrer sur le travail avec les fonctions. Réfléchissez à l'importance des fonctions :

  • Tout le code écrit en MQL (et il s'agit de tous les scripts, indicateurs et Expert Advisors dans CodeBase par exemple) est soit à l'intérieur de fonctions système, soit à l'intérieur de fonctions utilisateur.
  • Tout code MQL appelle des dizaines de fonctions MQL intégrées. Toutes les interactions avec MetaTrader et son environnement de trading s'effectuent par l'appel d'une fonction système.
  • Toute fonction qui ne dépend pas de paramètres externes renvoie toujours le même résultat. Une telle fonction peut être simplement copiée d'un script/indicateur/conseiller à un autre et elle fonctionnera correctement. En revanche, la copie d'un morceau arbitraire de code procédural a peu de chances de fonctionner.
  • Vous pouvez écrire n'importe quelle fonction personnalisée qui effectue un travail utile. Et ce faisant, il élargira la fonctionnalité standard de MQL de la manière dont vous en avez besoin. Par exemple, vous pensez : "Comme ce serait cool si MQL avait une telle fonction....". - Mais pourquoi ne pas l'écrire vous-même ?
 
Vasiliy Sokolov:

Le problème suivant avec votre code est qu'il s'étale en une longue feuille procédurale. Tous les débutants écrivent de cette façon. Et c'est un problème qui reste avec eux pendant des années. Apprenez à décomposer votre algorithme en plusieurs parties, en commençant par les bases, comme ce script. Il y a deux façons de le faire : par le biais de fonctions et de classes. Le concept de classes est trop difficile à appréhender au début, je vous suggère donc de vous concentrer sur le travail avec les fonctions. Réfléchissez à l'importance des fonctions :

  • Tout le code écrit en MQL (et il s'agit de tous les scripts, indicateurs et Expert Advisors dans CodeBase par exemple) se trouve soit à l'intérieur de fonctions système, soit à l'intérieur de fonctions utilisateur.
  • Tout code MQL appelle des dizaines de fonctions MQL intégrées. Toutes les interactions avec MetaTrader et son environnement de trading s'effectuent par l'appel d'une fonction système.
  • Toute fonction qui ne dépend pas de paramètres externes renvoie toujours le même résultat. Une telle fonction peut être simplement copiée d'un script/indicateur/conseiller à un autre et elle fonctionnera correctement. En revanche, la copie d'un morceau arbitraire de code procédural a peu de chances de fonctionner.
  • Vous pouvez écrire n'importe quelle fonction personnalisée qui effectue un travail utile. Et ce faisant, il élargira la fonctionnalité standard de MQL de la manière dont vous en avez besoin. Par exemple, vous pensez : "Comme ce serait cool si MQL avait une telle fonction....". - Mais pourquoi ne pas l'écrire vous-même ?

Merci, Vasily, pour ces conseils si complets. Je vais certainement en tenir compte et essayer de faire de mon mieux.

Salutations, Vladimir.

 
Vasiliy Sokolov:

Le problème suivant avec votre code est qu'il s'étale en une longue feuille procédurale. Tous les débutants écrivent de cette façon. Et c'est un problème qui reste avec eux pendant des années. Apprenez à décomposer votre algorithme en plusieurs parties, en commençant par les bases, comme ce script. Il y a deux façons de le faire : par le biais de fonctions et de classes. Le concept de classes est trop difficile à appréhender au début, je vous suggère donc de vous concentrer sur le travail avec les fonctions. Réfléchissez à l'importance des fonctions :

  • Tout le code écrit en MQL (et il s'agit de tous les scripts, indicateurs et Expert Advisors dans CodeBase par exemple) se trouve soit à l'intérieur de fonctions système, soit à l'intérieur de fonctions utilisateur.
  • Tout code MQL appelle des dizaines de fonctions MQL intégrées. Toutes les interactions avec MetaTrader et son environnement de trading s'effectuent par l'appel d'une fonction système.
  • Toute fonction qui ne dépend pas de paramètres externes renvoie toujours le même résultat. Une telle fonction peut être simplement copiée d'un script/indicateur/conseiller à un autre et elle fonctionnera correctement. En revanche, la copie d'un morceau arbitraire de code procédural a peu de chances de fonctionner.
  • Vous pouvez écrire n'importe quelle fonction personnalisée qui effectue un travail utile. Et ce faisant, il élargira la fonctionnalité standard de MQL de la manière dont vous en avez besoin. Par exemple, vous pensez : "Comme ce serait cool si MQL avait une telle fonction....". - Mais pourquoi ne pas l'écrire vous-même ?
Vasily, l'homme n'a même pas encore maîtrisé les tableaux. Il est trop tôt pour qu'il écoute de telles conférences).
 
Реter Konow:
Vasily, l'homme n'a même pas encore maîtrisé les tableaux. Il est trop tôt pour qu'il écoute de telles conférences).

Peter, tous les conseils constructifs sont importants pour moi, y compris les tiens !

Salutations, Vladimir.