//+------------------------------------------------------------------+ //| TradeEnvironment.mqh | //| Copyright 2016, Vasiliy Sokolov, St-Petersburg, Russia | //| https://www.mql5.com/ru/users/c-4 | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, Vasiliy Sokolov." #property link "https://www.mql5.com/ru/users/c-4" #include "Dictionary.mqh" //+------------------------------------------------------------------+ //| Отложенный ордер. | //+------------------------------------------------------------------+ /*class CPendingOrder : public CObject { public: CPendingOrder(void) : Price(0.0){;} double Price; // Цена срабатывания };*/ //+------------------------------------------------------------------+ //| Модуль торгового окружения. Детектирует его изменение | //| (количество исторически/активных ордеров и сделок). Именно по | //| изменению торгового окружения CStrategy определяет статус своих | //| торговых операций. Данный класс позволяет избежать вызова | //| сомнительных OnTrade и OnTradeTransaction. | //+------------------------------------------------------------------+ class CTradeEnvironment { private: CDictionary m_pending_orders; int m_last_deals_count; // Последнее запомненное количество сделок int m_last_pending_orders; // Последнее запомненное количество отложенных ордеров int m_last_historders_count; // Последнее запомненное количество исторических ордеров bool m_changed; // Флаг указывающий, что произошло изменение в торговом окружении ulong m_last_change_time; // Время последнего изменения торгового окружения uint m_last_access; // Время последнего доступа к истории сделок. ulong m_last_microseconds; // Время последнего изменения истории в микросекундах с момента запуска программы. bool DetectPendingChanges(); datetime StartTimeTerminal(void); public: CTradeEnvironment(void); bool ChangeEnvironment(void); void RememberEnvironment(void); ulong LastMicrosecondsState(void); }; //+------------------------------------------------------------------+ //| Конструктор по-умолчанию. | //+------------------------------------------------------------------+ CTradeEnvironment::CTradeEnvironment(void) : m_changed(true) { } //+------------------------------------------------------------------+ //| Возвращает истину, если торговое окружение изменилось | //+------------------------------------------------------------------+ bool CTradeEnvironment::ChangeEnvironment(void) { if(m_changed)return true; datetime dt=D'2115.01.01'; HistorySelect(0,dt); if(HistoryDealsTotal()!=m_last_deals_count) { m_changed=true; } return m_changed; } //+------------------------------------------------------------------+ //| Сохраняет текущее торговое состояние | //+------------------------------------------------------------------+ void CTradeEnvironment::RememberEnvironment(void) { HistorySelect(0,D'2115.01.01'); m_last_deals_count=HistoryDealsTotal(); m_changed=false; m_last_microseconds=GetMicrosecondCount(); } //+------------------------------------------------------------------+ //| Возвращает время старта терминала. | //+------------------------------------------------------------------+ datetime CTradeEnvironment::StartTimeTerminal(void) { uint start_seconds=(uint)MathRound(GetMicrosecondCount()/1000000.0)+1; datetime time_begin=TimeCurrent()-start_seconds; return time_begin; } //+------------------------------------------------------------------+ //| Возвращает время последнего изменения торгового состояния | //| в микросекундах с начала работы программы. | //+------------------------------------------------------------------+ ulong CTradeEnvironment::LastMicrosecondsState(void) { return m_last_microseconds; } //+------------------------------------------------------------------+