Die Sprache MQL5 von Grund auf selbst erlernen - Seite 21

 
Maxim Kuznetsov:

... Die Leute hier versuchen ausnahmsweise, Neuankömmlingen zu helfen.

Guten Tag und gute Laune an alle!

Vielen Dank an alle, die versuchen, mir zu helfen! Das Ergebnis Ihrer Hilfe ist bereits da. Jetzt suche ich bewusst nach den Informationen, die ich brauche (Tutorials, Website-Dokumentation usw.), was mir hilft, das Selbststudium fortzusetzen. Ich möchte betonen, dass ich nur MQL5 Reference verwendet habe, um diesen Skriptcode zu schreiben!

Heute füge ich den Code des Skripts New7.mq5 ein, das eine verbesserte Version des Skripts New6.mq5 ist. Das neue Skript bietet die Möglichkeit, Stop-Loss- und Take-Profit-Niveaus festzulegen. Ich habe versucht, alles in diesem Skript zu beschreiben, wie ich es vorhin versprochen habe, in einer verständlichen Form für einen Programmierer der ersten Klasse.

Mit freundlichen Grüßen, 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:

Guten Tag und gute Laune an alle!

Vielen Dank an alle, die versuchen, mir zu helfen! Es gibt bereits ein Ergebnis Ihrer Hilfe. Jetzt finde ich bewusst die Informationen, die ich brauche (Tutorial, Website-Dokumentation usw.), mit deren Hilfe ich das Selbststudium fortsetze. Ich möchte betonen, dass ich nur MQL5 Reference verwendet habe, um diesen Skriptcode zu schreiben!

Heute füge ich den Code des Skripts New7.mq5 ein, das eine verbesserte Version des Skripts New6.mq5 ist. Das neue Skript bietet die Möglichkeit, Stop-Loss- und Take-Profit-Niveaus festzulegen. Ich habe versucht, alles in diesem Skript zu beschreiben, wie ich es vorhin versprochen habe, und zwar in einer verständlichen Form für einen Programmierer der ersten Klasse.

Mit freundlichen Grüßen, Vladimir.

Es gibt eine Zeile in Ihrem Code:

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

Das bedeutet, dass "orderType1" im Code durch "BUY_STOP" ersetzt wird, wenn er vorhanden ist.

Das heißt, anstelle der folgenden Zeile:

if( orderType1 == "BUY_STOP" )

"BUY_STOP" wird durch die folgende Zeichenfolge ersetzt:

if( "BUY_STOP" == "BUY_STOP" )

Ist es das, was Sie wirklich wollen?

 
Koldun Zloy:

Es gibt eine Zeile in Ihrem Code:

Das bedeutet, dass "orderType1", wenn es im Code vorkommt, durch "BUY_STOP" ersetzt wird.

Also, statt der folgenden Zeile:

Es wird die Zeichenfolge sein:

Ist es das, was Sie wirklich wollen?

Ich werde die Dokumentation noch einmal studieren und Ihnen später antworten.

Mit freundlichen Grüßen, Vladimir.

 

Koldun Zloy:

... Ist es das, was Sie wirklich wollen?

Im Moment ja.

Hochachtungsvoll, Vladimir.

 
MrBrooklin:

Im Moment ja.

Jetzt geht's los...

 
Vasiliy Sokolov:

Da wären wir...

Na, was habe ich dir gesagt?))) Es muss eine Basis und wieder eine Basis geben. Zuerst muss man 3-4 Monate lang ein Lehrbuch lesen und dann etwas schreiben. Nach einem Jahr können Sie mit OOP beginnen.
 
MrBrooklin:

Vorläufig, ja.

Hochachtungsvoll, Vladimir.

Das ist der Punkt, den ich ausführlicher hätte schreiben sollen. Es ist sicherlich eine funktionierende Option, aber zu unerwartet))))

Es ist besser, mit einer Beschreibung dessen zu beginnen, was das Skript tun wird, mit einem schematischen Algorithmus. Es wird weniger Fragen und mehr spezifische Bemerkungen geben)

 
MrBrooklin:

Vorläufig, ja.

Hochachtungsvoll, Vladimir.

Die obige Bedingung ist in der Tat immer wahr, wie 2 = 2. Aus diesem Grund funktioniert if (der Bedingungsoperator) hier nicht, und der Compiler gibt bei solchem Code eine Warnung aus.
 
Реter Konow:
Na, was habe ich dir gesagt?))) Es muss eine Basis und wieder eine Basis geben. Lesen Sie zunächst 3-4 Monate lang ein Lehrbuch und schreiben Sie dann etwas. Nach einem Jahr können Sie mit OOP beginnen.

Es geht nicht einmal um die Basis. Der Verstand des Mannes ist ein einziges Chaos. Das Schiff ist untergegangen, aber die Segel (Take-Profit, Stop-Loss, Trailing in der Zukunft) werden sorgfältig darauf abgestimmt.

ReTeg Konow:
In der Tat ist die obige Bedingung immer wahr, wie 2 = 2. if (Bedingungsoperator) funktioniert hier also nicht, und der Compiler wird bei solchem Code eine Warnung ausgeben.

Jetzt sollte der Autor des Zweigs deinem Rat folgen, Peter, und sagen: "Ich sehe das so, ich bin ein Künstler!".

 
Vasiliy Sokolov:

Jetzt geht's los...

Ich muss etwas missverstanden haben, denn ich habe eine solche Reaktion erhalten.

Ich habe die folgende Bedingung in das Skript New6.mq5 geschrieben: "Für schwebende Aufträge Buy Stop und Sell Stop, wenden Sie die #define Direktive anstelle von input an. Sie ermöglicht es uns, im Skriptcode die erforderlichen Arten von schwebenden Aufträgen anzugeben, aber sie werden nicht in den Eingabeparametern des Skripts angezeigt, wenn es ausgeführt wird. Legen wir Variablen fest, die die Typen der schwebenden Aufträge orderType1 und orderType2 definieren. Nennen wir diese Variablen "BUY_STOP" und "SELL_STOP".

Bitte teilen Sie mir mit, was ich bei der Umsetzung dieser Bedingung falsch gemacht habe.

Mit freundlichen Grüßen, Vladimir.