Самообучение языку MQL5 с полного нуля - страница 21

 
Maxim Kuznetsov:

... тут люди в кои-то веки пытаются помочь новичкам.

Всем доброго дня и хорошего настроения!

Спасибо всем, кто пытается мне помочь!  Результат от Вашей помощи уже есть. Теперь осознано нахожу нужную мне информацию (учебник, документация сайта и т.п.), с помощью которой продолжаю самообучение. Обращаю особое внимание на то, что для написания кода данного скрипта ипользовал только Справочник MQL5!

Сегодня выкладываю код скрипта New7.mq5, который является доработанной версией скрипта New6.mq5. В новом скрипте реализована возможность устанавливать уровни Stop Loss (остановить убыток) и Take Profit (взять прибыль). В данном скрипте постарался всё расписать, как ранее и обещал, в доступном изложении для ученика 1-го класса школы программирования.

С уважением, Владимир.

//+------------------------------------------------------------------+
//|                                                         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:

Всем доброго дня и хорошего настроения!

Спасибо всем, кто пытается мне помочь!  Результат от Вашей помощи уже есть. Теперь осознано нахожу нужную мне информацию (учебник, документация сайта и т.п.), с помощью которой продолжаю самообучение. Обращаю особое внимание на то, что для написания кода данного скрипта ипользовал только Справочник MQL5!

Сегодня выкладываю код скрипта New7.mq5, который является доработанной версией скрипта New6.mq5. В новом скрипте реализована возможность устанавливать уровни Stop Loss (остановить убыток) и Take Profit (взять прибыль). В данном скрипте постарался всё расписать, как ранее и обещал, в доступном изложении для ученика 1-го класса школы программирования.

С уважением, Владимир.

В Вашем коде есть строка:

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

Она означает, что когда в коде встретится 'orderType1' оно будет заменено на "BUY_STOP".

То есть вместо строки:

if( orderType1 == "BUY_STOP" )

Будет строка:

if( "BUY_STOP" == "BUY_STOP" )

Вы действительно именно этого хотите?

 
Koldun Zloy:

В Вашем коде есть строка:

Она означает, что когда в коде встретится 'orderType1' оно будет заменено на "BUY_STOP".

То есть вместо строки:

Будет строка:

Вы действительно именно этого хотите?

Сейчас ещё раз внимательнее прочитаю документацию и потом отвечу.

С уважением, Владимир.

 

Koldun Zloy:

... Вы действительно именно этого хотите?

На данный момент "да".

С уважением, Владимир.

 
MrBrooklin:

На данный момент "да".

Вот и приплыли...

 
Vasiliy Sokolov:

Вот и приплыли...

Ну, а я о чем тебе говорил?))) База и еще раз база должна быть. Сначала читать/конспектировать учебник 3-4 месяца, а потом что то писать. Через год можно приступить к ООП.
 
MrBrooklin:

На данный момент "да".

С уважением, Владимир.

Вот этот момент подробней надо было расписать. Это конечно рабочий вариант, но слишком неожиданный)))) 

Лучше вначале дать описание, что будет делать скрипт, схематично алгоритм. Вопросов будет меньше, а замечания конкретней)

 
MrBrooklin:

На данный момент "да".

С уважением, Владимир.

По сути, условие выше всегда истина, как 2 = 2. Поэтому if (оператор условия) здесь не работает, а компилятор выдаст предупреждение на такой код.
 
Реter Konow:
Ну, а я о чем тебе говорил?))) База и еще раз база должна быть. Сначала читать/конспектировать учебник 3-4 месяца, а потом что то писать. Через год можно приступить к ООП.

Да тут не до базы даже. У человека мешанина в голове. Корабль пошел ко дну, но к нему старательно лепятся паруса (тейк-профит, стоп-лосс, трейлинг в будущем).

Реter Konow:
По сути, условие выше всегда истина, как 2 = 2. Поэтому if (оператор условия) здесь не работает, а компилятор выдаст предупреждение на такой код.

А теперь автор ветки должен последовать твоему совету Петр, и сказать "я так вижу, я художник!".

 
Vasiliy Sokolov:

Вот и приплыли...

Скорее всего чего-то недопонял, раз такая реакция.

В скрипте New6.mq5 мною было записано условие: "Для отложенных ордеров Buy Stop и Sell Stop вместо input применим новую для нас директиву #define. Она позволит нам задавать в коде скрипта нужные типы отложенных ордеров, но при этом они не будут отображаться во входных параметрах скрипта при запуске его в работу. Зададим переменные, определяющие типы отложенных ордеров orderType1 и orderType2. Для этих переменных запишем имена "BUY_STOP" и "SELL_STOP"".

Прошу подсказать, что неправильно сделал в плане реализации данного условия.

С уважением, Владимир.

Причина обращения: