Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть IV). Торговые события"

 

Опубликована статья Библиотека для простого и быстрого создания программ для MetaTrader (Часть IV). Торговые события:

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

Запустим советник в тестере и пощёлкаем по кнопкам:

Всё отрабатывает верно, и в журнал выводятся сообщения о происходящих событиях.

Сейчас все сообщения о событиях в журнал тестера выводятся в методе CEngine::WorkWithHedgeCollections() базового объекта библиотеки, а нам необходимо, чтобы пользовательская программа знала коды событий, и уже она понимала что произошло на счёте — для составления логики реакции программы на то или иное событие. Для этого на данном этапе, и лишь в качестве проверки, создадим метод в базовом объекте библиотеки, хранящий код последнего события, и метод, расшифровывающий этот код, состоящий из набора флагов события.

Автор: Artyom Trishkin

 

Artyom Trishkin, спасибо за работу, чувствуется мощная библиотека получается. Просьба если не сложно - можете кратко обозначить еще какой функционал планируете покрыть(уже покрыт и готовиться к публикации) кроме работы с ордерами/историей. Просто я сейчас начал писать подобную библиотеку тоже на основе стандартной, но начал со стороны такого функционала как инструменты технического анализа. Задумка прописать в библиотеку все средства анализа используемые в классическом ТА и РА и сделать их стыкующимися с индикаторными и др. CExpertSignal.

Возможно если Ваш функционал покрывает задуманный мною, то мне надо рассмотреть вариант продолжить-развить уже написанное вами.

 
alex_all:

Artyom Trishkin, спасибо за работу, чувствуется мощная библиотека получается. Просьба если не сложно - можете кратко обозначить еще какой функционал планируете покрыть(уже покрыт и готовиться к публикации) кроме работы с ордерами/историей. Просто я сейчас начал писать подобную библиотеку тоже на основе стандартной, но начал со стороны такого функционала как инструменты технического анализа. Задумка прописать в библиотеку все средства анализа используемые в классическом ТА и РА и сделать их стыкующимися с индикаторными и др. CExpertSignal.

Возможно если Ваш функционал покрывает задуманный мною, то мне надо рассмотреть вариант продолжить-развить уже написанное вами.

Всё, что сейчас описано в статьях - это лишь начало. Работа с ордерными системами терминалов будет весьма простой. Отдача в программу по требованию практически любых данных о любом ордере, сделке, позиции, произошедшем когда-либо событии, и т.д. Это то, что с ордерными системами. Пока не будет завершена работа и публикация статей о работе с ордерными системами обоих терминалов, другой функционал не будет публиковаться - всё по порядку.
Но в соответствии с заложенной структурой, будут подготовлены и опубликованы работа с ценовыми данными, работа с индикаторами, с графическими объектами, будет полноценная графическая оболочка на канвасе, интегрированная в структуру библиотеки в соответствии с заданной изначально парадигмой. Т.е., можно будет вполне полноценно использовать лишь одну библиотеку, без необходимости состыковывать её с другими. Как пример - получение данных по щелчку на значке открытой позиции, установленного ордера, получение данных по щелчку на ценовом баре, поиск неких данных в имеющихся коллекциях, их обработка и т.п.

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

Планов много, наработок тоже. Готовлю материал. В том числе и по пожеланиям (коих пока нет )

 
Artyom Trishkin:

Всё, что сейчас описано в статьях - это лишь начало. Работа с ордерными системами терминалов будет весьма простой. Отдача в программу по требованию практически любых данных о любом ордере, сделке, позиции, произошедшем когда-либо событии, и т.д. Это то, что с ордерными системами. Пока не будет завершена работа и публикация статей о работе с ордерными системами обоих терминалов, другой функционал не будет публиковаться - всё по порядку.
Но в соответствии с заложенной структурой, будут подготовлены и опубликованы работа с ценовыми данными, работа с индикаторами, с графическими объектами, будет полноценная графическая оболочка на канвасе, интегрированная в структуру библиотеки в соответствии с заданной изначально парадигмой. Т.е., можно будет вполне полноценно использовать лишь одну библиотеку, без необходимости состыковывать её с другими. Как пример - получение данных по щелчку на значке открытой позиции, установленного ордера, получение данных по щелчку на ценовом баре, поиск неких данных в имеющихся коллекциях, их обработка и т.п.

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

Планов много, наработок тоже. Готовлю материал. В том числе и по пожеланиям (коих пока нет )

Очень интересно. Здесь я видел уже две подобных версии библиотеки. Универсальный эксперт и Кроссплатформенная библиотека. Первая не совсем кроссплатформенная. А во второй множество недостатков, в частности нехватка многих функций, которые были бы кроссплатформенными. Например, время открытия или цена открытия позиции/ордера. Надо самому использовать макросы версии MQL и самому писать отдельно код. Но там и множество интересных вещей, в частности, мне нравится наличие нескольких стопов, трейлинг очень мощный и кастомизируемый. ММ интересные опции. Это серия статей здесь от какого-то итальянца, я думаю, вы поняли о чем речь. В общем, интересно посмотреть, что получится у вас и было бы здорово, если бы вы использовали опыт предыдущих подобных разработок и взяли бы лучшее. Спасибо.

 
leonerd:

Очень интересно. Здесь я видел уже две подобных версии библиотеки. Универсальный эксперт и Кроссплатформенная библиотека. Первая не совсем кроссплатформенная. А во второй множество недостатков, в частности нехватка многих функций, которые были бы кроссплатформенными. Например, время открытия или цена открытия позиции/ордера. Надо самому использовать макросы версии MQL и самому писать отдельно код. Но там и множество интересных вещей, в частности, мне нравится наличие нескольких стопов, трейлинг очень мощный и кастомизируемый. ММ интересные опции. Это серия статей здесь от какого-то итальянца, я думаю, вы поняли о чем речь. В общем, интересно посмотреть, что получится у вас и было бы здорово, если бы вы использовали опыт предыдущих подобных разработок и взяли бы лучшее. Спасибо.

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

 

Будет ли данная библиотека работать с биржевыми инструментами на Moex?

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

И да, детальное описание мануала по эксплуатации библиотеки не хватает.

 
Aleksey Vyazmikin:

Будет ли данная библиотека работать с биржевыми инструментами на Moex?

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

И да, детальное описание мануала по эксплуатации библиотеки не хватает.

Тесты покажут. Что будет замечено - будет исправлено. Документация на библиотеку будет. Не сразу.

 

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

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

А так чтобы кто-то что-то конкретное пожелал, при этом не зная пока всех задумок проекта, это мне кажется будет мимо, т.к. знаете же как обычно - даже уже готовую и документированную библиотеку каждый читает по своему и берёт из неё что-то своё что для него актуально в данный момент. 

Поэтому пожелать хочу одного - успехов и целеустремленности вам в вашем начинании! :)

 

Артем, в первую очередь хочу сказать большое спасибо за серию статей и библиотеку. Я, хоть понял читая ваши статьи все про ООП! Ваши статьи действительно обучают и помогают тем кому это нужно, мне точно помогли. Ваши применения разных алгоритмов в одних и тех же местах, где можно было просто повториться, тоже очень удачны.

А теперь если можно перейду к делу:  ::GetListByTime - в этом методе вы отбираете по интервалу времени ордера для дальнейшего передачи списка программе вызывающей, в Части 3 вы пишите что:

 "Задаётся нужное свойство для поиска и сравнения в свойствах ордеров в зависимости от того, по какому времени отсортирован список: если по времени открытия, то и свойство для поиска будет временем открытия, если время закрытия, то и сравниваться будут в ордерах их время закрытия, и т.д." 

 Но как же? - в самом методе нет возможности поменять сортировку списка ордеров с которым мы работаем.

Как я понимаю, но могу ошибаться, что какие мы бы не передали интервалы времени (закрывания допустим), то искать методы SearchGreatOrEqual() и  SearchLessOrEqual() будут в сортированном списке по времени открытия МТ5 и времени закрытия МТ4? Так Как по умолчанию инициализация списка ордеров в конструкторе класса коллекций  COrder в основном указанна по времени открытия или тикету ордера.

//+------------------------------------------------------------------+
//| Конструктор                                                      |
//+------------------------------------------------------------------+
CHistoryCollection::CHistoryCollection(void) : m_index_deal(0),m_delta_deal(0),m_index_order(0),m_delta_order(0),m_is_trade_event(false)
  {
   this.m_list_all_orders.Sort(#ifdef __MQL5__ SORT_BY_ORDER_TIME_OPEN #else SORT_BY_ORDER_TIME_CLOSE #endif );
   this.m_list_all_orders.Clear();
   this.m_list_all_orders.Type(COLLECTION_HISTORY_ID);
  }
//+------------------------------------------------------------------+
//| Конструктор                                                      |
//+------------------------------------------------------------------+
CMarketCollection::CMarketCollection(void) : m_is_trade_event(false),m_is_change_volume(false),m_change_volume_value(0)
  {
   this.m_list_all_orders.Sort(SORT_BY_ORDER_TIME_OPEN);
   this.m_list_all_orders.Clear();
   this.m_list_all_orders.Type(COLLECTION_MARKET_ID);
   ::ZeroMemory(this.m_struct_prev_market);
   this.m_struct_prev_market.hash_sum=WRONG_VALUE;
   this.m_list_control.Clear();
   this.m_list_control.Sort();
   this.m_list_changed.Clear();
   this.m_list_changed.Sort();
   this.m_k_pow=(ulong)pow(10,6);
  }

Значит выше указанный метод (::GetListByTime) будет работать так, всегда искать по времени окрытия МТ5 или по времени закрытия МТ4.

//--- Сравнивает объекты COrder между собой по всем возможным свойствам (для сортировки списков по указанному свойству объекта-ордера
        virtual int       Compare(const CObject *node,const int mode=0) const;

у вас написан очень узко (узко - не значит что не правильно) и в него будет передоватся, из стандартной библиотеки MQL при поиске ордеров по шаблону, режим сортировки выбранный в конструкторе класса коллекций ордеров. Значит: (в Части 3

//+------------------------------------------------------------------+
//| Выбирает ордера из коллекции со временем                         |
//| в диапазоне от begin_time, до end_time                           |
//+------------------------------------------------------------------+
CArrayObj *CHistoryCollection::GetListByTime(const datetime begin_time=0,const datetime end_time=0,
                                             const ENUM_SELECT_BY_TIME select_time_mode=SELECT_BY_TIME_CLOSE)
  {
   ENUM_ORDER_PROP_INTEGER property=(select_time_mode==SELECT_BY_TIME_CLOSE ? ORDER_PROP_TIME_CLOSE : ORDER_PROP_TIME_OPEN);

   CArrayObj *list=new CArrayObj();
   if(list==NULL)
     {
      ::Print(DFUN+TextByLanguage("Ошибка создания временного списка","Error creating temporary list"));
      return NULL;
     }
   datetime begin=begin_time,end=(end_time==0 ? END_TIME : end_time);
   if(begin_time>end_time) begin=0;
   list.FreeMode(false);
   ListStorage.Add(list);
   //---
   this.m_order_instance.SetProperty(property,begin);
   int index_begin=this.m_list_all_orders.SearchGreatOrEqual(&m_order_instance);
   if(index_begin==WRONG_VALUE)
      return list;
   this.m_order_instance.SetProperty(property,end);
   int index_end=this.m_list_all_orders.SearchLessOrEqual(&m_order_instance);
   if(index_end==WRONG_VALUE)
      return list;
   for(int i=index_begin; i<=index_end; i++)
      list.Add(this.m_list_all_orders.At(i));
   return list;
  }

не нужны, так как стандартная библиотека (методы SearchGreatOrEqual() и  SearchLessOrEqual()) все равно будет искать по коду сортировки переданному в конструкторе.
Можно просто удалить эти строчки выделенные красным и добавить строчки условной компиляции для задания свойства для объекта: 

   COrder            m_order_instance;       // Объект-ордер для поиска по свойству

все равно список может быть отсортирован только в двух вариантах или открытие МТ5 или закрытие МТ4?
ПРАВИЛЬНО? 

P.S. это нужно просто для понимания логики ООП!?

Библиотека для простого и быстрого создания программ для MetaTrader (Часть III): Коллекция рыночных ордеров и позиций, поиск и фильтрация
Библиотека для простого и быстрого создания программ для MetaTrader (Часть III): Коллекция рыночных ордеров и позиций, поиск и фильтрация
  • www.mql5.com
В первой части данного цикла статей мы начали создавать большую кроссплатформенную библиотеку, целью которой является облегчение создания программ для платформы MetaTrader 5 и MetaTrader 4. Во второй части продолжили развитие библиотеки и сделали коллекцию исторических ордеров и сделок. В данной части повествования создадим класс для удобного...
 
BmC:

Артем, в первую очередь хочу сказать большое спасибо за серию статей и библиотеку. Я, хоть понял читая ваши статьи все про ООП! Ваши статьи действительно обучают и помогают тем кому это нужно, мне точно помогли. Ваши применения разных алгоритмов в одних и тех же местах, где можно было просто повториться, тоже очень удачны.

А теперь если можно перейду к делу:  ::GetListByTime - в этом методе вы отбираете по интервалу времени ордера для дальнейшего передачи списка программе вызывающей, в Части 3 вы пишите что:

...

Спасибо за отзыв.

Метод Sort() обязательно нужно вызывать перед каждым поиском того, или иного свойства. Методы сортировки указаны в перечислениях возможных критериев сортировки объектов в Defines.mqh. И их нужно указывать при вызове метода Sort() в случае, если нужно отсоритровать по одному из нескольких типов сортировки. В конструкторе класса устанавливается просто умолчательный тип сортировки, но при поиске свойства, это свойство нужно указать в методе Sort(ВОТ_ТУТ_НУЖНО_ВВЕСТИ_ТИП_СОРТИРОВКИ) - чтобы список был отсортирован именно по указанному свойству.

PS. Код вставляется при помощи Alt+S в редакторе сообщений:


 
Artyom Trishkin:

Спасибо за отзыв.

Метод Sort() обязательно нужно вызывать перед каждым поиском того, или иного свойства. Методы сортировки указаны в перечислениях возможных критериев сортировки объектов в Defines.mqh. И их нужно указывать при вызове метода Sort() в случае, если нужно отсоритровать по одному из нескольких типов сортировки. В конструкторе класса устанавливается просто умолчательный тип сортировки, но при поиске свойства, это свойство нужно указать в методе Sort(ВОТ_ТУТ_НУЖНО_ВВЕСТИ_ТИП_СОРТИРОВКИ) - чтобы список был отсортирован именно по указанному свойству.

PS. Код вставляется при помощи Alt+S в редакторе сообщений:


СПАСИБО. 

Вы поняли, что я очень мучился при переносе кода.)))

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