Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть VIII): События модификации ордеров и позиций"

 

Опубликована статья Библиотека для простого и быстрого создания программ для MetaTrader (Часть VIII): События модификации ордеров и позиций:

В предыдущих статьях мы начали создавать большую кроссплатформенную библиотеку, целью которой является упростить написания программ для платформы MetaTrader 5 и MetaTrader 4. В седьмой части мы добавили отслеживание событий срабатывания StopLimit-ордеров и подготовили функционал для отслеживания остальных событий, происходящих с ордерами и позициями. В данной статье сделаем класс для отслеживания событий модификации рыночных ордеров и позиций.

Скомпилируем советник.
Зададим в его параметрах значения StopLoss in points и TaleProfit in points равными нулю — чтобы открывать позиции и устанавливать отложенные ордера изначально без стоп-уровней, зададим в параметрах StopLoss for modification (points) и TakeProfit for modification (points) значения 20 и 60 соответственно (значения по умолчанию) — эти уровни StopLoss и TakeProfit будут устанавливаться по нажатию кнопок.
Запустим советник в тестере и выставим отложенные ордера. Затем нажмём поочерёдно кнопки установки StopLoss и TakeProfit — уровни будут выставлены и в журнал будут выведены об этом записи. Затем включим трейлинг и понаблюдаем за ордерами — они перемещаются за ценой, и в журнал об этих событиях выводятся записи. У позиций, появившихся в результате срабатывания ордеров, будут тралиться уровни StopLoss, и об этих событиях в журнале будут появляться записи.

Неттинг:


Хедж:

Автор: Artyom Trishkin

 

Добрый вечер Артем. Век живи - век учись! И я учусь, используя в качестве методического материала Ваши наработки. спасибо за ваш немалый труд и опыт.

Конечно не обходится без непоняток, а если еще точнее - то чем больше узнаю, тем больше непонятно. 

В приложенном файле попытка модифицировать Ваш советник TestDoEasyPart08, добавив в него пользовательский индикатор, тоже Ваш iCrossAD.

Использовал функцию iCustom(asymbol.Name(), _Period, "iCrossAD");

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }

Потом попытался скопировать данные из индикатора в буферы советника и проверить насколько мне это удалось

void OnTick()
  {
//+------------------------------------------------------------------+//////////////////////////////
   int      buf_size = 30;
   double   Buf_Arrow_Sell[], Last_Arrow_Sell;
   double   Buf_Arrow_Buy[], Last_Arrow_Buy;
   
   ArraySetAsSeries(Buf_Arrow_Sell, true);
   ArraySetAsSeries(Buf_Arrow_Buy, true);
   
   if (CopyBuffer(CrossAD, 3, 0, buf_size, Buf_Arrow_Sell) != buf_size || ArraySize(Buf_Arrow_Sell) != buf_size)
   {  
      Print("Не удалось правильно скопировать данные из iCrossAD");
      return;
   }
      else Last_Arrow_Sell = Buf_Arrow_Sell[0];
   
   if (CopyBuffer(CrossAD, 2, 0, buf_size, Buf_Arrow_Buy) != buf_size || ArraySize(Buf_Arrow_Buy) != buf_size)
   {  
      Print("Не удалось правильно скопировать данные из iCrossAD");
      return;
   }
      else Last_Arrow_Buy = Buf_Arrow_Buy[0];
      
//+------------------------------------------------------------------+
Comment("Выводим данные фракталов", 
         "\n Last_Arrow_Buy     = ",Last_Arrow_Buy,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell    = ",Last_Arrow_Sell
         ); 
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+//////////////////////////////

Весь этот наворот работать не хочет, подскажите плиз где я делаю неправильно и как делать нужно на самом деле ???

Файлы:
 
Сама идея заключается в том, чтобы использовать Ваш TestDoEasyPart08, или его будующие, более мощные модификации в качестве основы, добавить к нему данные от различных индикаторов и, в зависимости от их сочетаний, управлять торговлей, программно/виртуально нажимая на кнопки, если ход торговли не нравится администратору терминала, он может вмешаться ручками, используя те-же кнопки и мышь.
 
Sergey Voytsekhovsky:

Добрый вечер Артем. Век живи - век учись! И я учусь, используя в качестве методического материала Ваши наработки. спасибо за ваш немалый труд и опыт.

Конечно не обходится без непоняток, а если еще точнее - то чем больше узнаю, тем больше непонятно. 

В приложенном файле попытка модифицировать Ваш советник TestDoEasyPart08, добавив в него пользовательский индикатор, тоже Ваш iCrossAD.

Использовал функцию iCustom(asymbol.Name(), _Period, "iCrossAD");

Потом попытался скопировать данные из индикатора в буферы советника и проверить насколько мне это удалось

Весь этот наворот работать не хочет, подскажите плиз где я делаю неправильно и как делать нужно на самом деле ???

"Работать не хочет" - что именно не работает?

Вот это я бы делал на глобальном уровне:

   int      buf_size = 30;
   double   Buf_Arrow_Sell[], Last_Arrow_Sell;
   double   Buf_Arrow_Buy[], Last_Arrow_Buy;

Вот это в OnInit():

   ArraySetAsSeries(Buf_Arrow_Sell, true);
   ArraySetAsSeries(Buf_Arrow_Buy, true);

И проверьте - а бывают ли вообще у индикатора когда-либо значения в буферах на нулевом баре - вы же проверяете их только на нулевом баре. Я не помню что он там выдаёт, и на каком баре.

 
  • "что именно не работает?..." - На данном этапе я пытаюсь увидеть в Коментах значения последних стрелок Вверх и Вниз из индикатора. Если я этого добьюсь, то смогу их сравнить по времени, а значит буду знать какой именно из них был последним, а значит "текущим". Это можно будет считать сигналом при смене значения или фильтром для других сигналов (можно/нельзя). Но вот беда, я не могу получить в Комменты эти значения и даже более того - я и Комменты сами не вижу, текст то должен быть виден?

  • "Вот это я бы делал на глобальном уровне: ..." - Перенёс, попытался осознать почему так, вроде дошло, спасибо за науку!!!

  • "Вот это в OnInit(): ..." - Перенёс, большое спасибо, запомню.

  • "И проверьте - а бывают ли вообще у индикатора когда-либо значения в буферах на нулевом баре - ..." - попробую организовать Коммент внутри индикатора и запущу индикатор чтобы видеть глазами само значение, а как они тогда будут отображаться на одном графике? Активировать индикатор на отдельном графике?

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

Пожалуйста помогите с Комментом, не могу понять почему он не отображается!!!

Файлы:
 
Sergey Voytsekhovsky:
  • "что именно не работает?..." - На данном этапе я пытаюсь увидеть в Коментах значения последних стрелок Вверх и Вниз из индикатора. Если я этого добьюсь, то смогу их сравнить по времени, а значит буду знать какой именно из них был последним, а значит "текущим". Это можно будет считать сигналом при смене значения или фильтром для других сигналов (можно/нельзя). Но вот беда, я не могу получить в Комменты эти значения и даже более того - я и Комменты сами не вижу, текст то должен быть виден?

  • "Вот это я бы делал на глобальном уровне:" - Перенёс, попытался осознать почему так, вроде дошло, спасибо за науку!!!

  • "Вот это в OnInit():" - Перенёс, большое спасибо, запомню.

  • "И проверьте - а бывают ли вообще у индикатора когда-либо значения в буферах на нулевом баре - ..." - попробую организовать Коммент внутри индикатора и запущу индикатор чтобы видеть глазами само значение, а как они тогда будут отображаться на одном графике? Активировать индикатор на отдельном графике?

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

Пожалуйста помогите с Комментом, не могу понять почему он не отображается!!!

Что в журнале "Эксперты" пишется? Создаются ли хендлы индикаторов?

 
Artyom Trishkin:

Что в журнале "Эксперты" пишется? Создаются ли хендлы индикаторов?

Добрый день. Да, хендл создается, равен 10. 

Добился небольшого прогресса (очень небольшого!). Появились записи Comment

Есть записи Print()


2019.05.19 17:31:13.127 2018.01.02 00:00:00 Хендл iCrossAD = 10

2019.05.19 17:31:13.580 2018.01.02 09:00:00 Скопированны данные из 2-го буфера индикатора iCrossAD

2019.05.19 17:31:13.580 2018.01.02 09:00:00 CrossAD = 10, period_find = 400, Last_Arrow_Buy = 1.797693134862316e+308

2019.05.19 17:31:13.580 2018.01.02 09:00:00 Скопированны данные из 3-го буфера индикатора iCrossAD

2019.05.19 17:31:13.580 2018.01.02 09:00:00 CrossAD = 10, period_find = 400, Last_Arrow_Sell = 1.797693134862316e+308

2019.05.19 17:31:13.580 2018.01.02 09:00:20 Скопированны данные из 2-го буфера индикатора iCrossAD

2019.05.19 17:31:13.581 2018.01.02 09:00:20 CrossAD = 10, period_find = 400, Last_Arrow_Buy = 1.797693134862316e+308

2019.05.19 17:31:13.581 2018.01.02 09:00:20 Скопированны данные из 3-го буфера индикатора iCrossAD

2019.05.19 17:31:13.581 2018.01.02 09:00:20 CrossAD = 10, period_find = 400, Last_Arrow_Sell = 1.797693134862316e+308


Два буфера в индикаторе, из которых копируются данные, содержат значения на которые установлены стрелки индикатора. Записываются они туда в момент установки стрелки. Соответственно делаю вывод что они должны быть заполнены double ценами, на момент формирования стрелки. А у меня почему-то выводиться космическая цифра, если я не ошибаюсь, это максимальное из возможных значений double в МТ5.

Правда пробовал и добивался я этого в тестере, котировок вчера и сегодня не было, сегодня воскресенье.

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

Файлы:
 
Sergey Voytsekhovsky:

Добрый день. Да, хендл создается, равен 10. 

Добился небольшого прогресса (очень небольшого!). Появились записи Comment

Есть записи Print()


2019.05.19 17:31:13.127 2018.01.02 00:00:00 Хендл iCrossAD = 10

2019.05.19 17:31:13.580 2018.01.02 09:00:00 Скопированны данные из 2-го буфера индикатора iCrossAD

2019.05.19 17:31:13.580 2018.01.02 09:00:00 CrossAD = 10, period_find = 400, Last_Arrow_Buy = 1.797693134862316e+308

2019.05.19 17:31:13.580 2018.01.02 09:00:00 Скопированны данные из 3-го буфера индикатора iCrossAD

2019.05.19 17:31:13.580 2018.01.02 09:00:00 CrossAD = 10, period_find = 400, Last_Arrow_Sell = 1.797693134862316e+308

2019.05.19 17:31:13.580 2018.01.02 09:00:20 Скопированны данные из 2-го буфера индикатора iCrossAD

2019.05.19 17:31:13.581 2018.01.02 09:00:20 CrossAD = 10, period_find = 400, Last_Arrow_Buy = 1.797693134862316e+308

2019.05.19 17:31:13.581 2018.01.02 09:00:20 Скопированны данные из 3-го буфера индикатора iCrossAD

2019.05.19 17:31:13.581 2018.01.02 09:00:20 CrossAD = 10, period_find = 400, Last_Arrow_Sell = 1.797693134862316e+308


Два буфера в индикаторе, из которых копируются данные, содержат значения на которые установлены стрелки индикатора. Записываются они туда в момент установки стрелки. Соответственно делаю вывод что они не должны быть заполнены double ценами. А у меня почему-то выводиться космическая цифра, если я не ошибаюсь, это максимальное из возможных значений double в МТ5.

Правда пробовал и добивался я этого в тестере, котировок вчера и сегодня небыло, сегодня воскресенье.

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

Ну здесь-то обсуждаются вопросы по библиотеке, а не банальное незнание о пустых значениях индикаторных буферов. EMPTY_VALUE == DBL_MAX    
 
Artyom Trishkin:
Ну здесь-то обсуждаются вопросы по библиотеке, а не банальное незнание о пустых значениях индикаторных буферов. EMPTY_VALUE == DBL_MAX    

Принял, услышал, спасибо. Про пустые значения кажется что-то знал, щас изучу вопрос.

Если здесь это не уместно, то можете ли вы порекомендовать какую-либо ветку, где я смогу получать ответы рт Вас или Ваших коллег на подобные ламерские вопросы?

Если такого места нет, то его наверное стоило бы создать.

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

К тому-же я и пытаюсь использовать Вашу библиотеку. Примитивно конечно, но уж как могу, извините.

 
Sergey Voytsekhovsky:

Принял, услышал, спасибо. Про пустые значения кажется что-то знал, щас изучу вопрос.

Если здесь это не уместно, то можете ли вы порекомендовать какую-либо ветку, где я смогу получать ответы рт Вас или Ваших коллег на подобные ламерские вопросы?

Если такого места нет, то его наверное стоило бы создать.

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

К тому-же я и пытаюсь использовать Вашу библиотеку. Примитивно конечно, но уж как могу, извините.

По вопросам, не связанным с библиотекой, пишите пожалуйста сюда:

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2016.11.09
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Artyom Trishkin:

По вопросам, не связанным с библиотекой, пишите пожалуйста сюда:

Спасибо большое, ходил, посмотрел, почитал. То что нужно, буду использовать.

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