92 lines
9 KiB
MQL5
92 lines
9 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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;
|
|
}
|
|
//+------------------------------------------------------------------+
|