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

 

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

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

Для проверки проведённых доработок, воспользуемя советником из прошлой статьи. Просто переименуем советник TestDoEasyPart06.mq5 из папки \MQL5\Experts\TestDoEasy\Part06 в TestDoEasyPart07.mq5 и сохраним его в новой подпапке \MQL5\Experts\TestDoEasy\ Part07.

Скомпилируем, запустим в тестере, выставим StopLimit-ордер и дождёмся его срабатывания:

Автор: Artyom Trishkin

 

Хотелось бы увидеть реализацию нескольких ТС с помощью этой библиотеки и альтернативных.

Ну и сравнительный анализ, конечно. В частности, быстродействие в Тестере/Оптимизаторе, размере кода и скорости его написания.

 
fxsaber:

Хотелось бы увидеть реализацию нескольких ТС с помощью этой библиотеки и альтернативных.

Ну и сравнительный анализ, конечно. В частности, быстродействие в Тестере/Оптимизаторе, размере кода и скорости его написания.

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

А реализация ТС - она будет возможна в частности после создания user-case-функций. Хотя, конечно, уже и сейчас можно кое-что делать, но не быстро и просто - так как требуется прямой доступ по указателям к спискам и объектам библиотеки, а это не "взял, и получил" - впрочем, такой доступ частично организован в примерах советников, приложенных к статьям.

 
Artyom Trishkin:

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

Вы будете писать графическую библиотеку на канвасе?
 
Реter Konow:
Вы будете писать графическую библиотеку на канвасе?

Да, конечно. Не только на нём. Будут доступны для создания некоторые "составные" объекты из набора стандартных графических объектов, плюс будут предложены формы для создания своего GUI с полным доступом ко всем данным, собираемым и контролируемым библиотекой - некий набор уже готовых объектов, плюс возможность собирать из них свой собственный GUI. Естественно, делается всё для того, чтобы у пользователя был полный доступ к любым потребностям из одной библиотеки - "из коробки" таксказать. Подключил одну библиотеку, и имеешь весь необходимый функционал для полноценного создания любых своих желаний - без поиска требуемых решений где-то кем-то написанных и опубликованных.

 
Artyom Trishkin:

Да, конечно. Не только на нём. Будут доступны для создания некоторые "составные" объекты из набора стандартных графических объектов, плюс будут предложены формы для создания своего GUI с полным доступом ко всем данным, собираемым и контролируемым библиотекой - некий набор уже готовых объектов, плюс возможность собирать из них свой собственный GUI. Естественно, делается всё для того, чтобы у пользователя был полный доступ к любым потребностям из одной библиотеки - "из коробки" таксказать. Подключил одну библиотеку, и имеешь весь необходимый функционал для полноценного создания любых своих желаний - без поиска требуемых решений где-то кем-то написанных и опубликованных.

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

Масштабная задумка. Интересно будет посмотреть реализацию последней части. Прежняя граф. Библиотека писалась полтора года, но поскольку уже имеется серьезная основа, возможно получится быстрее. 
 
Реter Konow:
То есть, вы создадите мультиплатформенную программную среду с полным набором возможностей для создания любых советников. Универсальная библиотека для обеих платформ с графикой на канвасе. 

Масштабная задумка. Интересно будет посмотреть реализацию последней части. Прежняя граф. Библиотека писалась полтора года, но поскольку уже имеется серьезная основа, возможно получится быстрее. 
Всё будет. Но постепенно - шаг за шагом. Ведь запланирована не просто такая библиотека, а обучающий материал. Всегда можно не просто пользоваться, но и читать и понимать как всё сделано.
 
Artyom Trishkin:

...без поиска требуемых решений где-то кем-то написанных и опубликованных.

Это значит, что библиотека станет штатной?
 
Реter Konow:
Это значит, что библиотека станет штатной?
Нет. Это означает, что одной библиотеки будет вполне достаточно.
 
Artyom Trishkin:
Нет. Это означает, что одной библиотеки будет вполне достаточно.
Удачи.
 

Артем, спасибо!

В методе:

//+------------------------------------------------------------------+
//| Обновляет список ордеров                                         |
//+------------------------------------------------------------------+
void CMarketCollection::Refresh(void)

Создается динамически "маркет-ордер"

#else 
//--- Позиции
   int total_positions=::PositionsTotal();
   for(int i=0; i<total_positions; i++)
     {
      ulong ticket=::PositionGetTicket(i);
      if(ticket==0) continue;
      CMarketPosition *position=new CMarketPosition(ticket);
      if(position==NULL) continue;
      //--- Добавляем объект-позицию в список рыночных ордеров и позиций
      if(!this.AddToListMarket(position))
         continue;
      //--- Получаем индекс контрольного ордера по тикету и идентификатору позиции
      int index=this.IndexControlOrder(ticket,position.PositionID());
      //--- Если ордера нет в списке контрольных ордеров - добавляем
      if(index==WRONG_VALUE)
        {
         if(!this.AddToListControl(position))
           {
            ::Print(DFUN_ERR_LINE,TextByLanguage("Не удалось добавить контрольую позицию ","Failed to add a control position "),position.TypeDescription()," #",position.Ticket());
           }
        }
      //--- Если ордер уже есть в списке контрольных ордеров - проверяем его на предмет изменения свойств
      else if(index>WRONG_VALUE)
        {
         this.OnChangeEvent(position,index);
        }
     }
//--- Ордера
   int total_orders=::OrdersTotal();
   for(int i=0; i<total_orders; i++)
     {
      ulong ticket=::OrderGetTicket(i);
      if(ticket==0) continue;
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)::OrderGetInteger(ORDER_TYPE);
      //--- Маркет-ордер
      if(type<ORDER_TYPE_BUY_LIMIT)
        {
         CMarketOrder *order=new CMarketOrder(ticket);
         if(order==NULL) continue;
         //--- Добавляем объект-маркет-ордер в список рыночных ордеров и позиций
         if(!this.AddToListMarket(order))
            continue;
        }
      //--- Отложенный ордер
      else
        {
         CMarketPending *order=new CMarketPending(ticket);
         if(order==NULL) continue;
         //--- Добавляем объект-отложенный ордер в список рыночных ордеров и позиций
         if(!this.AddToListMarket(order))
            continue;
         //--- Получаем индекс контрольного ордера по тикету и идентификатору позиции
         int index=this.IndexControlOrder(ticket,order.PositionID());
         //--- Если ордера нет в списке контрольных ордеров - добавляем
         if(index==WRONG_VALUE)
           {
            if(!this.AddToListControl(order))
              {
               ::Print(DFUN_ERR_LINE,TextByLanguage("Не удалось добавить контрольный ордер ","Failed to add a control order "),order.TypeDescription()," #",order.Ticket());
              }
           }
         //--- Если ордер уже есть в списке контрольных ордеров - проверяем его на предмет изменения свойств
         else if(index>WRONG_VALUE)
           {
            this.OnChangeEvent(order,index);
           }
        }
     }
#endif 

Потом по ссылке передается в метод :

         //--- Добавляем объект-маркет-ордер в список рыночных ордеров и позиций
         if(!this.AddToListMarket(order))
            continue;

В методе "AddToListMarket" маркет-ордер не учитывается в хеш_сумме "hash_sum" тогда зачем его заносить и контролировать?
Объясните пожалуйста зачем он нам, если мы всю информацию можем узнать у позиции или отложенного-ордера?