UTE/Strategy/TradeEnvironment.mqh
super.admin bd7e405a90 convert
2025-05-30 16:34:43 +02:00

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;
}
//+------------------------------------------------------------------+