Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
TradeState - переключатель торгового режима эксперта в зависимости от времени - библиотека для MetaTrader 5
- Просмотров:
- 3245
- Рейтинг:
- Опубликован:
- 2015.12.02 10:18
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Случалось ли вам ограничивать работу своего торгового эксперта в зависимости от времени? Например, как сделать так, чтобы эксперт не совершал торговых действий во время ночной сессии? Или, если вы торгуете в срочной секции Московской биржи, случалось ли вам закрывать все позиции перед закрытием рынка или перед выходными? А как насчет более сложных конструкций? Например, как сделать так, чтобы до 7 часов вечера ваш эксперт мог открывать и закрывать позиции, а после 7 вечера новых сделок не совершал? На самом деле добиться подобного гибкого конфигурирования можно. Вам поможет в этом специальный модуль CTradeState.
Как работает CTradeState? Модуль возвращает одно из шести торговых состояний, описанное с помощью структуры ENUM_TRADE_STATE:
//+------------------------------------------------------------------+ //| Определяет торговое состояние эксперта | //+------------------------------------------------------------------+ enum ENUM_TRADE_STATE { TRADE_BUY_AND_SELL, // Разрешены покупки и продажи. TRADE_BUY_ONLY, // Разрешены только покупки. Продажи запрещены. TRADE_SELL_ONLY, // Разрешены только продажи. Покупки запрещены. TRADE_STOP, // Торговля запрещена. Немедленно закрыть все позиции. Новые сигналы на вход не принимать. TRADE_WAIT, // Контроль над открытыми позициями теряется. Новые сигналы игнорируются. Полезен в моменты выхода новостей. TRADE_NO_NEW_ENTRY // Сигналы на вход игнорируются. Однако уже открытые позиции сопровождаются согласно торговой логике. };
В своем эксперте вы должны совершить тот или иной набор действий в зависимости от того, какой именно модификатор из данной структуры вернет вам CTradeState (значение возвращается с помощью метода GetTradeState).
Прежде чем использовать торговые режимы, их необходимо установить, для чего необходимо вызвать метод SetTradeState. Прототип метода SetTradeState следующий:
//+------------------------------------------------------------------+ //| Устанавливает торговое состояние 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);
Например, чтобы модуль торгового состояния вернул модификатор TRADE_WAIT (контроль над открытыми позициями приостанавливается, новые позиции не открываются) в момент времени с 18:45 до 18:49 включительно, необходимо вызвать SetTradeState со следующими параметрами:
TradeState.SetTradeState(D'18:45', D'18:59', ALL_DAYS_OF_WEEK, TRADE_WAIT);
Вы можете указать не только время начала и окончания торгового режима, но и день недели, для которого этот режим действует. Если устанавливаемый режим требуется указать для всех дней недели, необходимо использовать модификатор ALL_DAYS_OF_WEEK. Если вы хотите установить торговый режим только для определенного дня недели, в переменной day_of_week укажите одно из значений системного перечисления ENUM_DAY_OF_WEEK.
Для того чтобы получить текущий торговый режим, используйте метод GetTradeState.
В качестве примера опишем комбинацию режимов, которая может быть полезной для торговли в срочной секции Московской биржи:
Время | Режим | Описание |
---|---|---|
10:00 - 10:01 | TRADE_WAIT | Время открытия рынка. Момент открытия характеризуется высокой волатильностью и резкими скачками цен. Торговые действия в эти моменты сопряжены с высоким риском, поэтому в первую минуту торгов лучше воздержаться от торговли, для чего перевести эксперт в этот момент времени в режим ожидания. |
14:00 - 14:03 | TRADE_WAIT | Время проведения промежуточного клиринга. В этот промежуток времени рынок не работает, поэтому торговый эксперт также необходимо установить в режим TRADE_WAIT. |
18:45 - 18:49 | TRADE_WAIT | Время проведения основного клиринга. В этот момент рынок также закрыт и торговля запрещена. Действует режим TRADE_WAIT. |
23:50 - 9:59 | TRADE_WAIT | Рынок закрыт, торговля запрещена. Режим советника TRADE_WAIT. |
Пятница, с 15:00 | TRADE_NO_NEW_ENTRY | Пятница — последний торговый день недели. Чтобы не оставлять открытые позиции на выходные дни, требуется закрыть их в последний день торгов. Поэтому открывать новые позиции в последний день торгов, чтобы через несколько часов их закрыть, не имеет смысла. Именно для этих целей используется режим NO_NEW_ENTRY. Каждую пятницу, начиная с 15:00, новые сигналы на вход игнорируются. Существующие позиции могут только закрываться. |
Пятница, 23:40-23:50 | TRADE_STOP | Время, предшествующее закрытию рынка. В это время все позиции должны быть закрыты. Торговый эксперт, перейдя в 23:40 в режим TRADE_STOP, закроет свою открытую позицию и перейдет в режим ожидания. |
Суббота, Воскресенье | TRADE_WAIT | В выходные дни торговля не ведется. Из-за переноса праздников некоторые субботние дни могут быть рабочими. В такие дни биржа работает. Это очень редкое явление, и таких "рабочих" дней необходимо избегать из-за низкой волатильности и статистической неопределенности. Торговля в эти дни должна быть запрещена независимо от того, рабочий это день или нет. |
Пример использования. Данная комбинация режимов задается с помощью следующей последовательности вызовов SetTradeState (пример в виде скрипта):
//+------------------------------------------------------------------+ //| TestTradeState.mq5 | //| Copyright 2015, Vasiliy Sokolov. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Vasiliy Sokolov." #property link "http://www.mql5.com" #property version "1.00" #include <Strategy\TradeState.mqh> CTradeState TradeState(TRADE_BUY_AND_SELL); // Устанавливаем режим по умолчанию Buy And Sell //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { TradeState.SetTradeState(D'15:00', D'23:39', FRIDAY, TRADE_NO_NEW_ENTRY); TradeState.SetTradeState(D'10:00', D'10:01', ALL_DAYS_OF_WEEK, TRADE_WAIT); TradeState.SetTradeState(D'14:00', D'14:03', ALL_DAYS_OF_WEEK, TRADE_WAIT); TradeState.SetTradeState(D'18:45', D'18:59', ALL_DAYS_OF_WEEK, TRADE_WAIT); TradeState.SetTradeState(D'23:50', D'23:59', ALL_DAYS_OF_WEEK, TRADE_STOP); TradeState.SetTradeState(D'0:00', D'9:59', ALL_DAYS_OF_WEEK, TRADE_WAIT); TradeState.SetTradeState(D'23:40', D'23:49', FRIDAY, TRADE_STOP); TradeState.SetTradeState(D'00:00', D'23:59', SATURDAY, TRADE_WAIT); TradeState.SetTradeState(D'00:00', D'23:59', SUNDAY, TRADE_WAIT); printf("10:00 - " + EnumToString(TradeState.GetTradeState(D'10:00'))); printf("14:01 - " + EnumToString(TradeState.GetTradeState(D'14:01'))); printf("18:50 - " + EnumToString(TradeState.GetTradeState(D'18:50'))); printf("23:50 - " + EnumToString(TradeState.GetTradeState(D'23:51'))); printf("Friday, > 15:00 - " + EnumToString(TradeState.GetTradeState(D'2015.11.27 15:00'))); printf("Saturday - " + EnumToString(TradeState.GetTradeState(D'2015.11.28'))); printf("Sunday - " + EnumToString(TradeState.GetTradeState(D'2015.11.29'))); printf("Default State - " + EnumToString(TradeState.GetTradeState(D'11:40'))); } //+------------------------------------------------------------------+
В качестве проверки в этом же скрипте делается распечатка режима, соответствующего тому или иному торговому времени.
Важно понимать, что предлагаемый модуль является лишь вспомогательным средством. Само решение о приостановке торговли (и закрытии всех позиций) должен принимать сам эксперт. Однако с помощью данного модуля достаточно легко создавать различные временные зоны и торговые режимы для того или иного эксперта.
Робот, торгующий на открытом интересе рынка.
Exp_PA_OscillatorТорговая система, построенная на сигналах индикатора PA_Oscillator.
Этот простой класс можно использовать для настройки, например, торговых диапазонов или для разрешения/запрета определенных действий по времени или дням недели.
ATR_3XMAТри разнопериодных сглаженных Average True Range в одном окне.