103 lines
9.6 KiB
MQL5
103 lines
9.6 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| TradeState.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"
|
|
#define ALL_DAYS_OF_WEEK 7
|
|
//+------------------------------------------------------------------+
|
|
//| Определяет торговое состояние эксперта. |
|
|
//+------------------------------------------------------------------+
|
|
enum ENUM_TRADE_STATE
|
|
{
|
|
TRADE_BUY_AND_SELL, // Buy And Sell
|
|
TRADE_BUY_ONLY, // Buy Only
|
|
TRADE_SELL_ONLY, // Sell Only
|
|
TRADE_STOP, // Stop
|
|
TRADE_WAIT, // Wait
|
|
TRADE_NO_NEW_ENTRY // No New Entry
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| Модуль торговых состояний TradeState |
|
|
//+------------------------------------------------------------------+
|
|
class CTradeState
|
|
{
|
|
private:
|
|
ENUM_TRADE_STATE m_state[60*24*7]; // Маска торговых состояний
|
|
public:
|
|
CTradeState(void);
|
|
CTradeState(ENUM_TRADE_STATE default_state);
|
|
ENUM_TRADE_STATE GetTradeState(void);
|
|
ENUM_TRADE_STATE GetTradeState(datetime time_current);
|
|
void SetTradeState(datetime time_begin,datetime time_end,int day_of_week,ENUM_TRADE_STATE state);
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| Режим по-умолчанию TRADE_BUY_AND_SELL |
|
|
//+------------------------------------------------------------------+
|
|
CTradeState::CTradeState(void)
|
|
{
|
|
ArrayInitialize(m_state,TRADE_BUY_AND_SELL);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Режим по-умолчанию задается значением default_state |
|
|
//+------------------------------------------------------------------+
|
|
CTradeState::CTradeState(ENUM_TRADE_STATE default_state)
|
|
{
|
|
ArrayInitialize(m_state,default_state);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Устанавливает торговое состояние TradeState |
|
|
//| INPUT: |
|
|
//| time_begin - Время, начиная с которого действует торговое |
|
|
//| состояние. |
|
|
//| time_end - Время, до которого действует торговое состояние |
|
|
//| day_of_week - День недели, на который распространяется установка |
|
|
//| торгового состояния. Соответствует модификаторам |
|
|
//| ENUM_DAY_OF_WEEK или модификатору ALL_DAYS_OF_WEEK |
|
|
//| state - Торговое состояние. |
|
|
//| Внимание, компонента даты в time_begin и time_end игнорируется. |
|
|
//+------------------------------------------------------------------+
|
|
void CTradeState::SetTradeState(datetime time_begin,datetime time_end,int day_of_week,ENUM_TRADE_STATE state)
|
|
{
|
|
if(time_begin>time_end)
|
|
{
|
|
string sb = TimeToString(time_begin, TIME_MINUTES);
|
|
string se = TimeToString(time_end, TIME_MINUTES);
|
|
printf("Time "+sb+" must be more time "+se);
|
|
return;
|
|
}
|
|
MqlDateTime btime,etime;
|
|
TimeToStruct(time_begin,btime);
|
|
TimeToStruct(time_end,etime);
|
|
for(int day=0; day<ALL_DAYS_OF_WEEK; day++)
|
|
{
|
|
if(day!=day_of_week && day_of_week!=ALL_DAYS_OF_WEEK)
|
|
continue;
|
|
int i_day=day*60*24;
|
|
int i_begin=i_day+(btime.hour*60)+btime.min;
|
|
int i_end = i_day + (etime.hour*60) + etime.min;
|
|
for(int i = i_begin; i <= i_end; i++)
|
|
m_state[i]=state;
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Возвращает ранее заданное для текущего времени торговое состояние|
|
|
//+------------------------------------------------------------------+
|
|
ENUM_TRADE_STATE CTradeState::GetTradeState(void)
|
|
{
|
|
return GetTradeState(TimeCurrent());
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Возвращает ранее заданное торговое состояние для переданного |
|
|
//| времени. |
|
|
//+------------------------------------------------------------------+
|
|
ENUM_TRADE_STATE CTradeState::GetTradeState(datetime time_current)
|
|
{
|
|
MqlDateTime dt;
|
|
TimeToStruct(time_current,dt);
|
|
int i_day = dt.day_of_week*60*24;
|
|
int index = i_day + (dt.hour*60) + dt.min;
|
|
return m_state[index];
|
|
}
|
|
//+------------------------------------------------------------------+
|