Self-learning the MQL5 language from scratch - page 21

 
Maxim Kuznetsov:

... people here are trying to help newcomers for once.

Good day and good mood everyone!

Thanks to everyone who is trying to help me! The result of your help is already there. Now I am consciously finding the information I need (tutorials, website documentation, etc.), which helps me to continue self-study. I would like to emphasize that I used only MQL5 Reference to write this script code!

Today, I am pasting the code of the New7.mq5 script which is an improved version of the New6.mq5 script. The new script has the ability to set Stop Loss (stop loss) and Take Profit (take profit) levels. I tried to describe everything in this script as I promised earlier, in an understandable form for a first grade programmer.

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

Good day and good mood everyone!

Thank you to everyone who is trying to help me! There is already a result from your help. Now consciously find the information I need (tutorial, website documentation, etc.), with the help of which I continue self-study. I would like to emphasize that I used only MQL5 Reference to write this script code!

Today, I am pasting the code of the New7.mq5 script which is an improved version of the New6.mq5 script. The new script has the ability to set Stop Loss (stop loss) and Take Profit (take profit) levels. I tried to describe everything in this script as I promised earlier, in an understandable form for a first grade programmer.

Regards, Vladimir.

There is a line in your code:

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

It means that when there is 'orderType1' in the code, it will be replaced with "BUY_STOP".

That is, instead of the following line:

if( orderType1 == "BUY_STOP" )

"BUY_STOP" will be replaced with the following string:

if( "BUY_STOP" == "BUY_STOP" )

Is that what you really want?

 
Koldun Zloy:

There is a line in your code:

It means that when 'orderType1' is encountered in the code, it will be replaced by 'BUY_STOP'.

So, instead of the following line:

It will be the string:

Is this what you really want?

I'll study the documentation once again and answer you later.

Sincerely, Vladimir.

 

Koldun Zloy:

... Is that really what you want?

For the moment, yes.

Respectfully, Vladimir.

 
MrBrooklin:

For the moment, yes.

Here we go...

 
Vasiliy Sokolov:

Here we are...

Well, what did I tell you?))) There has to be a base and a base again. First you have to read/read a textbook for 3-4 months and then write something. After a year you can start OOP.
 
MrBrooklin:

For the time being, yes.

Respectfully, Vladimir.

This is the point I should have written in more detail. It's certainly a working option, but too unexpected))))

It is better to start by giving a description of what the script will do, an algorithm schematically. There will be fewer questions and more specific remarks)

 
MrBrooklin:

For the time being, yes.

Respectfully, Vladimir.

In fact, the condition above is always true, like 2 = 2. That's why if (the condition operator) doesn't work here, and the compiler will generate a warning on such code.
 
Реter Konow:
Well, what did I tell you about?))) There must be a base and a base again. First read/review a textbook for 3-4 months and then write something. After a year you can start OOP.

It's not even about the base. The man's mind is a mess. The ship has gone down, but the sails (take-profit, stop-loss, trailing in the future) are being carefully shaped to it.

ReTeg Konow:
In fact, the condition above is always true, like 2 = 2. So if (condition operator) doesn't work here, and the compiler will give a warning on such code.

Now the author of the branch should follow your advice Peter, and say "I see it that way, I'm an artist!".

 
Vasiliy Sokolov:

Here we go...

I must have misunderstood something, since I got such a reaction.

I wrote the following condition in the script New6.mq5: "For pending orders Buy Stop and Sell Stop, apply the #define directive instead of input. It will allow us to specify in the script code the necessary types of pending orders, but they will not be displayed in the input parameters of the script when it runs. Let's set variables defining the types of pending orders orderType1 and orderType2. Let's name these variables "BUY_STOP" and "SELL_STOP".

Please advise me what I have done wrong in the implementation of this condition.

Regards, Vladimir.