Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

TradeState - переключатель торгового режима эксперта в зависимости от времени - библиотека для MetaTrader 5

Просмотров:
3189
Рейтинг:
(44)
Опубликован:
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')));
}
//+------------------------------------------------------------------+

В качестве проверки в этом же скрипте делается распечатка режима, соответствующего тому или иному торговому времени.

Важно понимать, что предлагаемый модуль является лишь вспомогательным средством. Само решение о приостановке торговли (и закрытии всех позиций) должен принимать сам эксперт. Однако с помощью данного модуля достаточно легко создавать различные временные зоны и торговые режимы для того или иного эксперта.

Интерес (sentiment) Интерес (sentiment)

Робот, торгующий на открытом интересе рынка.

Exp_PA_Oscillator Exp_PA_Oscillator

Торговая система, построенная на сигналах индикатора PA_Oscillator.

CIsSession - класс для установки временных интервалов (сессий) CIsSession - класс для установки временных интервалов (сессий)

Этот простой класс можно использовать для настройки, например, торговых диапазонов или для разрешения/запрета определенных действий по времени или дням недели.

ATR_3XMA ATR_3XMA

Три разнопериодных сглаженных Average True Range в одном окне.