Autoapprendimento del linguaggio MQL5 da zero - pagina 21

 
Maxim Kuznetsov:

... le persone qui stanno cercando di aiutare i nuovi arrivati per una volta.

Buona giornata e buon umore a tutti!

Grazie a tutti quelli che cercano di aiutarmi! Il risultato del vostro aiuto è già lì. Ora sto trovando consapevolmente le informazioni di cui ho bisogno (tutorial, documentazione del sito web, ecc.), il che mi aiuta a continuare a studiare da solo. Vorrei sottolineare che ho usato solo MQL5 Reference per scrivere questo codice script!

Oggi, sto incollando il codice dello script New7.mq5 che è una versione migliorata dello script New6.mq5. Il nuovo script permette di impostare i livelli di Stop Loss (per fermare le perdite) e Take Profit (per prendere i profitti). Ho cercato di descrivere tutto in questo script come ho promesso prima, in una forma comprensibile per un programmatore di primo grado.

Saluti, 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:

Buona giornata e buon umore a tutti!

Grazie a tutti quelli che cercano di aiutarmi! C'è già un risultato del vostro aiuto. Ora trovo consapevolmente le informazioni di cui ho bisogno (tutorial, documentazione del sito web, ecc.), con l'aiuto delle quali continuo l'autoapprendimento. Vorrei sottolineare che ho usato solo MQL5 Reference per scrivere questo codice script!

Oggi, sto incollando il codice dello script New7.mq5 che è una versione migliorata dello script New6.mq5. Il nuovo script permette di impostare i livelli di Stop Loss (per fermare le perdite) e Take Profit (per prendere i profitti). Ho cercato di descrivere tutto in questo script come ho promesso prima, in una forma comprensibile per un programmatore di primo grado.

Saluti, Vladimir.

C'è una linea nel tuo codice:

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

Significa che quando c'è 'orderType1' nel codice, sarà sostituito con "BUY_STOP".

Cioè, invece della linea seguente:

if( orderType1 == "BUY_STOP" )

"BUY_STOP" sarà sostituito dalla seguente stringa:

if( "BUY_STOP" == "BUY_STOP" )

È questo che vuoi veramente?

 
Koldun Zloy:

C'è una linea nel tuo codice:

Significa che quando "orderType1" si incontra nel codice, sarà sostituito da "BUY_STOP".

Quindi, invece della seguente linea

Sarà la stringa:

È questo che vuoi veramente?

Studierò di nuovo la documentazione e vi risponderò più tardi.

Sinceramente, Vladimir.

 

Koldun Zloy:

... È davvero quello che vuoi?

Per il momento, sì.

Con rispetto, Vladimir.

 
MrBrooklin:

Per il momento, sì.

Ecco qui...

 
Vasiliy Sokolov:

Eccoci qui...

Beh, cosa ti avevo detto?))) Ci deve essere una base e un'altra base. Prima devi leggere un libro di testo per 3-4 mesi e poi scrivere qualcosa. Dopo un anno si può iniziare l'OOP.
 
MrBrooklin:

Per il momento, sì.

Con rispetto, Vladimir.

Questo è il punto che avrei dovuto scrivere più dettagliatamente. È certamente un'opzione funzionante, ma troppo inaspettata))))

È meglio iniziare a dare una descrizione di ciò che lo script farà, un algoritmo in modo schematico. Ci saranno meno domande e più osservazioni specifiche)

 
MrBrooklin:

Per il momento, sì.

Con rispetto, Vladimir.

Infatti, la condizione di cui sopra è sempre vera, come 2 = 2. Ecco perché if (l'operatore di condizione) non funziona qui, e il compilatore genererà un avvertimento su tale codice.
 
Реter Konow:
Beh, di cosa ti ho parlato?))) Ci deve essere una base e un'altra base. Prima leggete/rivedete un libro di testo per 3-4 mesi e poi scrivete qualcosa. Dopo un anno si può iniziare l'OOP.

Non si tratta nemmeno della base. La mente di quell'uomo è un casino. La nave è scesa, ma le vele (take-profit, stop-loss, trailing nel futuro) vengono accuratamente modellate su di essa.

ReTeg Konow:
Infatti, la condizione di cui sopra è sempre vera, come 2 = 2. Quindi se (operatore di condizione) non funziona qui e il compilatore darà un avvertimento su tale codice.

E ora l'autore del ramo dovrebbe seguire il tuo consiglio Peter, e dire "Io la vedo così, sono un artista!".

 
Vasiliy Sokolov:

Ecco qui...

Devo aver frainteso qualcosa, visto che ho avuto una tale reazione.

Ho scritto la seguente condizione nello script New6.mq5: "Per gli ordini pendenti Buy Stop e Sell Stop, applicare la direttiva #define al posto dell'input. Ci permetterà di specificare nel codice dello script i tipi necessari di ordini pendenti, ma non saranno visualizzati nei parametri di input dello script quando viene eseguito. Impostiamo le variabili che definiscono i tipi di ordini pendenti orderType1 e orderType2. Chiamiamo queste variabili "BUY_STOP" e "SELL_STOP".

Per favore, consigliatemi cosa ho fatto di sbagliato nell'implementazione di questa condizione.

Saluti, Vladimir.