Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть IV). Торговые события"
Artyom Trishkin, спасибо за работу, чувствуется мощная библиотека получается. Просьба если не сложно - можете кратко обозначить еще какой функционал планируете покрыть(уже покрыт и готовиться к публикации) кроме работы с ордерами/историей. Просто я сейчас начал писать подобную библиотеку тоже на основе стандартной, но начал со стороны такого функционала как инструменты технического анализа. Задумка прописать в библиотеку все средства анализа используемые в классическом ТА и РА и сделать их стыкующимися с индикаторными и др. CExpertSignal.
Возможно если Ваш функционал покрывает задуманный мною, то мне надо рассмотреть вариант продолжить-развить уже написанное вами.
Artyom Trishkin, спасибо за работу, чувствуется мощная библиотека получается. Просьба если не сложно - можете кратко обозначить еще какой функционал планируете покрыть(уже покрыт и готовиться к публикации) кроме работы с ордерами/историей. Просто я сейчас начал писать подобную библиотеку тоже на основе стандартной, но начал со стороны такого функционала как инструменты технического анализа. Задумка прописать в библиотеку все средства анализа используемые в классическом ТА и РА и сделать их стыкующимися с индикаторными и др. CExpertSignal.
Возможно если Ваш функционал покрывает задуманный мною, то мне надо рассмотреть вариант продолжить-развить уже написанное вами.
Всё, что сейчас описано в статьях - это лишь начало. Работа с ордерными системами терминалов будет весьма простой. Отдача в программу по требованию практически любых данных о любом ордере, сделке, позиции, произошедшем когда-либо событии, и т.д. Это то, что с ордерными системами. Пока не будет завершена работа и публикация статей о работе с ордерными системами обоих терминалов, другой функционал не будет публиковаться - всё по порядку.
Но в соответствии с заложенной структурой, будут подготовлены и опубликованы работа с ценовыми данными, работа с индикаторами, с графическими объектами, будет полноценная графическая оболочка на канвасе, интегрированная в структуру библиотеки в соответствии с заданной изначально парадигмой. Т.е., можно будет вполне полноценно использовать лишь одну библиотеку, без необходимости состыковывать её с другими. Как пример - получение данных по щелчку на значке открытой позиции, установленного ордера, получение данных по щелчку на ценовом баре, поиск неких данных в имеющихся коллекциях, их обработка и т.п.
Планирую организовать быстрый и удобный доступ так, чтобы пользователю можно было не задумываться о том, как же получить нужные данные, а лишь запросить и получить их одной из многочисленных функцией, которые будут подготовлены, составлен их полный список и опубликован в заключительных статьях данной серии.
Планов много, наработок тоже. Готовлю материал. В том числе и по пожеланиям (коих пока нет )
Всё, что сейчас описано в статьях - это лишь начало. Работа с ордерными системами терминалов будет весьма простой. Отдача в программу по требованию практически любых данных о любом ордере, сделке, позиции, произошедшем когда-либо событии, и т.д. Это то, что с ордерными системами. Пока не будет завершена работа и публикация статей о работе с ордерными системами обоих терминалов, другой функционал не будет публиковаться - всё по порядку.
Но в соответствии с заложенной структурой, будут подготовлены и опубликованы работа с ценовыми данными, работа с индикаторами, с графическими объектами, будет полноценная графическая оболочка на канвасе, интегрированная в структуру библиотеки в соответствии с заданной изначально парадигмой. Т.е., можно будет вполне полноценно использовать лишь одну библиотеку, без необходимости состыковывать её с другими. Как пример - получение данных по щелчку на значке открытой позиции, установленного ордера, получение данных по щелчку на ценовом баре, поиск неких данных в имеющихся коллекциях, их обработка и т.п.
Планирую организовать быстрый и удобный доступ так, чтобы пользователю можно было не задумываться о том, как же получить нужные данные, а лишь запросить и получить их одной из многочисленных функцией, которые будут подготовлены, составлен их полный список и опубликован в заключительных статьях данной серии.
Планов много, наработок тоже. Готовлю материал. В том числе и по пожеланиям (коих пока нет )
Очень интересно. Здесь я видел уже две подобных версии библиотеки. Универсальный эксперт и Кроссплатформенная библиотека. Первая не совсем кроссплатформенная. А во второй множество недостатков, в частности нехватка многих функций, которые были бы кроссплатформенными. Например, время открытия или цена открытия позиции/ордера. Надо самому использовать макросы версии MQL и самому писать отдельно код. Но там и множество интересных вещей, в частности, мне нравится наличие нескольких стопов, трейлинг очень мощный и кастомизируемый. ММ интересные опции. Это серия статей здесь от какого-то итальянца, я думаю, вы поняли о чем речь. В общем, интересно посмотреть, что получится у вас и было бы здорово, если бы вы использовали опыт предыдущих подобных разработок и взяли бы лучшее. Спасибо.
Очень интересно. Здесь я видел уже две подобных версии библиотеки. Универсальный эксперт и Кроссплатформенная библиотека. Первая не совсем кроссплатформенная. А во второй множество недостатков, в частности нехватка многих функций, которые были бы кроссплатформенными. Например, время открытия или цена открытия позиции/ордера. Надо самому использовать макросы версии MQL и самому писать отдельно код. Но там и множество интересных вещей, в частности, мне нравится наличие нескольких стопов, трейлинг очень мощный и кастомизируемый. ММ интересные опции. Это серия статей здесь от какого-то итальянца, я думаю, вы поняли о чем речь. В общем, интересно посмотреть, что получится у вас и было бы здорово, если бы вы использовали опыт предыдущих подобных разработок и взяли бы лучшее. Спасибо.
Спасибо за мнение. Но читать статьи и искать в них необходимое я не в состоянии по причине отсутствия на это времени, а вот принимать заявки на будущий функционал, его планирование и включение в список на реализацию - это всегда пожалуйста. Были бы предложения. Пока что делаю то, что изначально было запланировано к реализации.
Будет ли данная библиотека работать с биржевыми инструментами на Moex?
На мой взгляд не стоит перегружать библиотеку для работы с ордерами другим функционалом, не связанным с управлением деньгами, лучше делать отдельные библиотеки.
И да, детальное описание мануала по эксплуатации библиотеки не хватает.
Будет ли данная библиотека работать с биржевыми инструментами на 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. это нужно просто для понимания логики ООП!?
- www.mql5.com
Артем, в первую очередь хочу сказать большое спасибо за серию статей и библиотеку. Я, хоть понял читая ваши статьи все про ООП! Ваши статьи действительно обучают и помогают тем кому это нужно, мне точно помогли. Ваши применения разных алгоритмов в одних и тех же местах, где можно было просто повториться, тоже очень удачны.
А теперь если можно перейду к делу: ::GetListByTime - в этом методе вы отбираете по интервалу времени ордера для дальнейшего передачи списка программе вызывающей, в Части 3 вы пишите что:
...Спасибо за отзыв.
Метод Sort() обязательно нужно вызывать перед каждым поиском того, или иного свойства. Методы сортировки указаны в перечислениях возможных критериев сортировки объектов в Defines.mqh. И их нужно указывать при вызове метода Sort() в случае, если нужно отсоритровать по одному из нескольких типов сортировки. В конструкторе класса устанавливается просто умолчательный тип сортировки, но при поиске свойства, это свойство нужно указать в методе Sort(ВОТ_ТУТ_НУЖНО_ВВЕСТИ_ТИП_СОРТИРОВКИ) - чтобы список был отсортирован именно по указанному свойству.
PS. Код вставляется при помощи Alt+S в редакторе сообщений:
Спасибо за отзыв.
Метод Sort() обязательно нужно вызывать перед каждым поиском того, или иного свойства. Методы сортировки указаны в перечислениях возможных критериев сортировки объектов в Defines.mqh. И их нужно указывать при вызове метода Sort() в случае, если нужно отсоритровать по одному из нескольких типов сортировки. В конструкторе класса устанавливается просто умолчательный тип сортировки, но при поиске свойства, это свойство нужно указать в методе Sort(ВОТ_ТУТ_НУЖНО_ВВЕСТИ_ТИП_СОРТИРОВКИ) - чтобы список был отсортирован именно по указанному свойству.
PS. Код вставляется при помощи Alt+S в редакторе сообщений:
СПАСИБО.
Вы поняли, что я очень мучился при переносе кода.)))
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Библиотека для простого и быстрого создания программ для MetaTrader (Часть IV). Торговые события:
В предыдущих статьях мы начали создавать большую кроссплатформенную библиотеку, целью которой является облегчение написания программ для платформы MetaTrader 5 и MetaTrader 4. У нас уже есть коллекции исторических ордеров и сделок, рыночных ордеров и позиций, класс для удобного выбора и фильтрации ордеров. В данной части продолжим развитие базового объекта и научим библиотеку Engine отслеживать торговые события на счёте.
Запустим советник в тестере и пощёлкаем по кнопкам:
Всё отрабатывает верно, и в журнал выводятся сообщения о происходящих событиях.
Автор: Artyom Trishkin