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

 
MrBrooklin:

Стандартный шаблон создал. В нём и начал писать код, а здесь стал выкладывать те фрагменты, которые уже написаны. По поводу каркаса алгоритма со своими функциями не додумался, спасибо, что подсказали! Также спасибо за подсказку про неттинг-счёт!


отвлечённо, есть такой приём от literacy-programming - позволяет очень быстро и внятно писать.

В общих чертах, в литературном стиле пишите в комментариях что будете делать (только основная прямая последовательность)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

в принципе всё. Дальше после каждого коментария пишется код 3-5(немного в общем)  строчек. У вас вся функция от начала до конца должна помещаться в экран который видите. Если получается больше, значит надо фрагменты выделять в отдельные функцию/методы. 

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

 
Maxim Kuznetsov:

отвлечённо, есть такой приём от literacy-programming - позволяет очень быстро и внятно писать.

В общих чертах, в литературном стиле пишите в комментариях что будете делать (только основная прямая последовательность)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

в принципе всё. Дальше после каждого коментария пишется код 3-5(немного в общем)  строчек. У вас вся функция от начала до конца должна помещаться в экран который видите. Если получается больше, значит надо фрагменты выделять в отдельные функцию/методы. 

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

Здравствуте, Максим! Вы очень выручили своей подсказкой! А то сижу и думаю, как наполнить стандартный шаблон советника.

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

 
MrBrooklin:

Уважаемые специалисты в программировании!

Объясните пожалуйста два вопроса:

  1. Первый вопрос про Magic Number - он создается во входных параметрах только для отложенных ордеров и открытых позиций (или только для открытых позиций?), или для самого советника его тоже можно создавать? И если ответ "можно", то с какой целью это нужно делать.  Просто у меня путаница в голове с этим вопросом, а толкового ответа пока не нашел.
  2. Второй вопрос про Magic Number - если на текущем графике несколько открытых позиций, то для определения каждой из позиций можно применить такой входной параметр:

Возможно, что у меня вообще не правильное понимание о применении Magic Number в программировании.

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

При принятии приказа на исполнение все его характеристики (символ, время выставления, тип ордера, тикет) присваиваются терминалом (пользователем запрашиваются, а присваиваются терминалом), а не пользователем, и тоже самое с позицией, позиция хранит информацию о своих приказах, но их может быть много. А магик номер это пользовательский идентификатор. Цитата:

При создании нового отложенного запроса, нам необходимо его как-то пометить — чтобы программа могла знать что именно этот ордер был выставлен НАМИ по именно этому отложенному запросу — то есть, нам необходимо однозначно идентифицировать и связать ордер или позицию с конкретным отложенным запросом. 

НАМИ пропущено по смыслу. И далее Артем в Магик номер вкладывает классификацию приказов. Почему нет, первые 2 цифры значат то то, тип ордера например, следующе 4 цифры то то, дату выставления приказа.

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

 
Maxim Kuznetsov:

отвлечённо, есть такой приём от literacy-programming - позволяет очень быстро и внятно писать.

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

... в принципе всё. Дальше после каждого коментария пишется код 3-5(немного в общем)  строчек. У вас вся функция от начала до конца должна помещаться в экран который видите. Если получается больше, значит надо фрагменты выделять в отдельные функцию/методы. 

Максим, посмотрите, пожалуйста, правильно уловил Вашу подсказку или ещё, что-то нужно добавить? Имеется ввиду тестовая часть, т.к. коды еще толком не писал.

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

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.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"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

Максим, посмотрите, пожалуйста, правильно уловил Вашу подсказку или ещё, что-то нужно добавить? Имеется ввиду тестовая часть, кроме кодов.

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

Начальные условия. Считаем на нашем символе есть позиция и мы ее видим на чарте.

Если для позиции, то она только одна либо бай либо селл. Поэтому вначале поиск позиций на нашем символе. Запрос / получение характеристик. Определение типа позиции бай или селл. И далее по тексту.

 
Valeriy Yastremskiy:

При принятии приказа на исполнение все его характеристики (символ, время выставления, тип ордера, тикет) присваиваются терминалом (пользователем запрашиваются, а присваиваются терминалом), а не пользователем, и тоже самое с позицией, позиция хранит информацию о своих приказах, но их может быть много. А магик номер это пользовательский идентификатор. Цитата:

При создании нового отложенного запроса, нам необходимо его как-то пометить — чтобы программа могла знать что именно этот ордер был выставлен НАМИ по именно этому отложенному запросу — то есть, нам необходимо однозначно идентифицировать и связать ордер или позицию с конкретным отложенным запросом. 

НАМИ пропущено по смыслу. И далее Артем в Магик номер вкладывает классификацию приказов. Почему нет, первые 2 цифры значат то то, тип ордера например, следующе 4 цифры то то, дату выставления приказа.

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

Спасибо, Валерий, за подробный ответ. Очень многое прояснилось. По поводу алгоритма у меня такая же позиция, но Василий уже объяснил почему в данном советнике не нужен Magic Number.

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

 
MrBrooklin:

Спасибо, Валерий, за подробный ответ. Очень многое прояснилось. По поводу алгоритма у меня такая же позиция, но Василий уже объяснил почему в данном советнике не нужен Magic Number.

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

Ну он действительно не нужен, при начальных условиях, мы открыли чарт и на символе чарта есть позиция, мы не знаем какая и мы хотим ее поставить в безубыток и потом тралить СЛ для уменьшения убытков в случае разворота цены.

 

С учетом поправок от Валерия, шаблон советника с комментариями принял новый вид.

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

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.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"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

Владимир, запрягать долго не надо. Давайте в бой. Для Вас я написал шаблон желаемого трейлинга:

//+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link      "http://www.mql5.com"
#property version   "1.00"
input double BreakevenValue = 100.0; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if(!PositionSelect(Symbol()))
      return;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

Все что Вам нужно, наполнить функции логикой, соответствующей их названиям. Как видите шаблон элементарный. И структурно похож на ТЗ.

Замечу, что данный код компилируется, т.е. с точки зрения компилятора он корректный. Стремитесь к этому состоянию всегда: т.е. в процессе разработки вносите небольшие изменения, так что бы после их внесения, код мог компилироваться. Также стремитесь к сообщению компилятора "0 error, o warnings". С ошибками понятное дело программу запустить не получится, но предупреждения компилятора нужно воспринимать как отче наш: если есть предупреждение, его нужно исправить. Данный шаблон сделан с  "0 error, o warnings" - сохраните этот его статус до конца разработки.

Раз с логикой мы разобрались, и с компилятором мы разобрались, то всего-то осталось снабдить функции нужной логикой. 

Второй параметр, величины трала пока перенесем на следующую версию. Для него понадобится доп. расчеты. Поэтому в этом шаблоне его нет. Трал будет подтягиваться каждый тик.

 
Vasiliy Sokolov:

Владимир, запрягать долго не надо. Давайте в бой. Для Вас я написал шаблон желаемого трейлинга:

Все что Вам нужно, наполнить функции логикой, соответствующей их названиям. Как видите шаблон элементарный. И структурно похож на ТЗ.

Замечу, что данный код компилируется, т.е. с точки зрения компилятора он корректный. Стремитесь к этому состоянию всегда: т.е. в процессе разработки вносите небольшие изменения, так что бы после их внесения, код мог компилироваться. Также стремитесь к сообщению компилятора "0 error, o warnings". С ошибками понятное дело программу запустить не получится, но предупреждения компилятора нужно воспринимать как отче наш: если есть предупреждение, его нужно исправить. Данный шаблон сделан с  "0 error, o warnings" - сохраните этот его статус до конца разработки.

Раз с логикой мы разобрались, и с компилятором мы разобрались, то всего-то осталось снабдить функции нужной логикой. 

Второй параметр, величины трала пока перенесем на следующую версию. Для него понадобится доп. расчеты. Поэтому в этом шаблоне его нет. Трал будет подтягиваться каждый тик.

Василий, конечно Вам огромное спасибо за то, что сделали за меня столько работы, но от этого ни сколько не приблизился к пониманию, откуда появились эти функции плюс операторы и, главное, почему они появились. Правильнее было бы, чтобы самостоятельно дошёл до написания того кода, который Вы мне подсказали. Правда, очень хотел сам до всего этого дойти и сейчас хочу дойти.

Понимаю, что Вы, как и многие уже устали от постоянного разжевывания мною всех строчек кода и топтания на месте, но проблема заключается как раз в том, что до сих пор у меня нет понимания принципа построения всего, начиная от алгоритма и заканчивая написанием кода. Сюда нужно ещё и прибавить отсутсвия знаний в английском языке, т.к. практически все сообщения компилятора об ошибках и предупреждениях, да и другие английские слова, мне приходится копировать и вставлять в Гугл Переводчик. Кстати, если кто-нибудь пробовал запускать те микро, даже нано-коды, которые выкладывал в этой теме, то они все прошли компиляцию с  "0 error, 0 warnings".

Теперь мне нужно некоторое время, что бы осознать, а точнее разобраться, почему появились эти функции и операторы. Короче - тихий ужас. Да и плохой из меня ученик, если не понимаю элементарных вещей.

Спасибо Вам и всем другим программистам, что Вы всё ещё терпите моё тугодумие. Хотя при этом, прекрасно понимаю, что Ваше терпение не безгранично.

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

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