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

 
Maxim Kuznetsov:

... les gens ici essaient d'aider les nouveaux arrivants pour une fois.

Bonne journée et bonne humeur à tous !

Merci à tous ceux qui essaient de m'aider ! Le résultat de votre aide est déjà là. Maintenant, je trouve consciemment les informations dont j'ai besoin (tutoriels, documentation du site Web, etc.), ce qui m'aide à poursuivre mon auto-apprentissage. Je tiens à souligner que je n'ai utilisé que la référence MQL5 pour écrire le code de ce script !

Aujourd'hui, je colle le code du script New7.mq5 qui est une version améliorée du script New6.mq5. Le nouveau script vous permet de définir des niveaux de Stop Loss (pour stopper les pertes) et de Take Profit (pour prendre des bénéfices). J'ai essayé de tout décrire dans ce script comme je l'ai promis plus tôt, sous une forme compréhensible pour un programmeur de première année.

Salutations, Vladimir.

//+------------------------------------------------------------------+
//|                                                         New7.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
//---
/* Продолжаем изучение языка программирования MQL5. В этот раз мы добавим в код скрипта, созданный
   нами ранее под именем New6.mq5, возможность устанавливать уровни Stop Loss (остановить убыток)
   и Take Profit (взять прибыль). Данные уровни позволят в ходе торговли автоматизировать процесс
   ограничения убытков и фиксации прибыли в то время, когда у нас отсутствует возможность находиться 
   перед торговым терминалом. Во входных параметрах скрипта создадим две переменные: SL (стоп лосс)
   и TP (тейк профит). Для них применим модификатор input и тип данных double. Чтобы постоянно не
   повторять комментарии, написанные в предыдущем скрипте New6.mq5, мы уберем всё лишнее и будем
   пояснять только те участки кода, которые добавим в данном скрипте. Итак, приступим. По нашей
   задумке нужно написать часть кода скрипта, который будет отвечать за Stop Loss и Take Profit.
   Снова обращаемся к Справочнику MQL5, в котором ищем раздел MqlTradeRequest. В нём мы находим
   информацию о том, что необходимо создать ещё два запроса: request.sl (для уровня Stop Loss ордера)
   и request.tp (для уровня Take Profit ордера). Дописываем в скрипт недостающие части кода.*/

/* Добавим в код скрипта необходимые переменные SL и TP.*/
input double SL=300;                 //Стоп лосс
input double TP=500;                 //Тейк профит
//---
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);
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);

/* Теперь создаем два запроса на торговый сервер: request.sl и request.tp, в котором указываем, где
   должны находиться уровни стоп лосс и тейк профит относительно цены отложенного ордера "BUY_STOP".
   Уровень SL должен быть ниже цены (поэтому пишем price-SL*point), а уровень TP должен быть выше цены
   (поэтому пишем price+TP*point). Для нормализации уровней SL и TP мы применим функцию преобразования
   данных NormalizeDouble, где обязательно умножим каждый из уровней на point (размер одного пункта)
   и укажем digits (количество знаков после запятой).*/
      request.sl=NormalizeDouble(price-SL*point,digits);      
      request.tp=NormalizeDouble(price+TP*point,digits);
//---
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
     {
      request.type=ORDER_TYPE_SELL_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
      
/* Точно также создадим ещё два новых запроса на торговый сервер: request.sl и request.tp, в котором укажем,
   где должны находиться уровни стоп лосс и тейк профит относительно цены отложенного ордера "SELL_STOP".
   Уровень SL теперь должен находиться выше цены (поэтому пишем price+SL*point), а уровень TP должен 
   находиться ниже цены (поэтому пишем price-TP*point). Снова для нормализации уровней SL и TP мы применим
   функцию преобразования данных NormalizeDouble, где обязательно умножим каждый из уровней на point (размер
   одного пункта) и укажем digits (количество знаков после запятой).*/
      request.sl=NormalizeDouble(price+SL*point,digits);      
      request.tp=NormalizeDouble(price-TP*point,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

/* Всё! Наш новый скрипт готов. Компилируем и запускаем скрипт. Как компилировать и запускать скрипт мы
   уже узнали, когда создавали скрипт New2.mq5.*/

//+------------------------------------------------------------------+
 
MrBrooklin:

Bonne journée et bonne humeur à tous !

Merci à tous ceux qui essaient de m'aider ! Il y a déjà un résultat de votre aide. Maintenant, je trouve consciemment les informations dont j'ai besoin (tutoriel, documentation du site web, etc.), avec l'aide desquelles je poursuis mon auto-apprentissage. Je tiens à souligner que je n'ai utilisé que la référence MQL5 pour écrire le code de ce script !

Aujourd'hui, je colle le code du script New7.mq5 qui est une version améliorée du script New6.mq5. Le nouveau script vous permet de définir des niveaux de Stop Loss (pour stopper les pertes) et de Take Profit (pour prendre des bénéfices). J'ai essayé de tout décrire dans ce script comme je l'ai promis plus tôt, sous une forme compréhensible pour un programmeur de première année.

Salutations, Vladimir.

Il y a une ligne dans votre code :

#define       orderType1 "BUY_STOP"   //Тип ордера UP

Cela signifie que lorsqu'il y a 'orderType1' dans le code, il sera remplacé par "BUY_STOP".

C'est-à-dire, au lieu de la ligne suivante :

if( orderType1 == "BUY_STOP" )

"BUY_STOP" sera remplacé par la chaîne suivante :

if( "BUY_STOP" == "BUY_STOP" )

C'est ce que tu veux vraiment ?

 
Koldun Zloy:

Il y a une ligne dans votre code :

Cela signifie que lorsque 'orderType1' est rencontré dans le code, il sera remplacé par 'BUY_STOP'.

Ainsi, au lieu de la ligne suivante :

Ce sera la chaîne :

Est-ce que c'est ce que tu veux vraiment ?

Je vais étudier à nouveau la documentation et vous répondre plus tard.

Sincèrement, Vladimir.

 

Koldun Zloy:

... Est-ce vraiment ce que vous voulez ?

Pour le moment, oui.

Respectueusement, Vladimir.

 
MrBrooklin:

Pour le moment, oui.

C'est parti...

 
Vasiliy Sokolov:

Nous y sommes...

Eh bien, qu'est-ce que je t'ai dit ?))) Il doit y avoir une base et une base encore. Vous devez d'abord lire/relire un manuel pendant 3-4 mois et ensuite écrire quelque chose. Au bout d'un an, vous pouvez commencer à travailler à l'extérieur.
 
MrBrooklin:

Pour l'instant, oui.

Respectueusement, Vladimir.

C'est le point sur lequel j'aurais dû écrire plus en détail. C'est certainement une option qui fonctionne, mais trop inattendue)))).

Il est préférable de commencer par donner une description de ce que fera le script, un algorithme schématisé. Il y aura moins de questions et des remarques plus spécifiques).

 
MrBrooklin:

Pour l'instant, oui.

Respectueusement, Vladimir.

En fait, la condition ci-dessus est toujours vraie, comme 2 = 2. C'est pourquoi if (l'opérateur de condition) ne fonctionne pas ici, et le compilateur générera un avertissement sur un tel code.
 
Реter Konow:
Eh bien, de quoi je vous ai parlé ?))) Il doit y avoir une base et une base encore. Lisez/révisez d'abord un manuel pendant 3-4 mois, puis écrivez quelque chose. Au bout d'un an, vous pouvez commencer à travailler à l'extérieur.

Il ne s'agit même pas de la base. L'esprit de l'homme est un désordre. Le navire a coulé, mais les voiles (take-profit, stop-loss, trailing dans le futur) sont soigneusement façonnées pour lui.

ReTeg Konow:
En fait, la condition ci-dessus est toujours vraie, comme 2 = 2. Donc si (opérateur de condition) ne fonctionne pas ici et le compilateur donnera un avertissement sur un tel code.

Et maintenant, l'auteur de la branche devrait suivre ton conseil Peter, et dire "Je le vois comme ça, je suis un artiste !".

 
Vasiliy Sokolov:

C'est parti...

Je dois avoir mal compris quelque chose, puisque j'ai eu une telle réaction.

J'ai écrit la condition suivante dans le script New6.mq5 : "Pour les ordres en attente Buy Stop et Sell Stop, appliquer la directive #define au lieu de l'entrée. Cela nous permettra de spécifier dans le code du script les types d'ordres en attente nécessaires, mais ils ne seront pas affichés dans les paramètres d'entrée du script lors de son exécution. Définissons les variables définissant les types d'ordres en attente orderType1 et orderType2. Nommons ces variables "BUY_STOP" et "SELL_STOP".

Veuillez me conseiller sur ce que j'ai fait de mal dans la mise en œuvre de cette condition.

Salutations, Vladimir.