Trade Scheduler - ограничение работы советника. Бай лимит и сел лимит в нужное время Когда появляются условия для использования этих экспертов

Если ваша торговая система не базируется на новостных скачках, то бывает очень полезно для финансового и ментального здоровья останавливать работу советника перед выходом важных новостей. А после устаканивания волатильности, через нескольких часов, заново его включать. Хорошо, если у вас под рукой доступ к рабочему терминалу. А если нет? Вот тут и пригодится автоматизация такой деятельности.

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

Итак, составим расписание важных событий на следующей неделе в следующем формате:
Дата и время события;инструмент;описание события

2016.04.01 14:00;USD;Индекс деловой активности ISM в производственном секторе 2016.04.01 14:00;USD;Индекс постепенного разгона инфляции от ISM 2016.04.04 09:00;EUR;Индекс цен производителей (м/м) 2016.04.04 09:00;EUR;Индекс цен производителей (г/г) 2016.04.05 04:30;AUD;Решение Резервного Банка Австралии по процентной ставке 2016.04.05 04:30;AUD;Сопроводительное заявление Резервного Банка Австралии 2016.04.06 07:00;EUR;Заседание ЕЦБ 2016.04.06 18:00;USD;Протокол заседания Комитета по открытым рынкам ФРС США 2016.04.07 11:30;EUR;Сведения о заседании ЕЦБ по монетарной политике

Запишем его в файл ht-news.csv и разместим в нужной директории \MQL4\Files\ht-news.csv, откуда наш советник сможет его прочитать.

Вначале зададим внешние переменные для настройки, комментарии объясняют их назначение:

Extern string startNewsEvent="Ограничение работы по новостям"; input bool StopOnNewsEvent=true; //Включить ограничение input string NewsEventFileName="ht-news.csv"; //Файл с расписанием input uint LoadNewsEventTimerInDay=7;//Как часто в днях перезагружать файл input uint StopPriorEventHours=2; //Остановить за Х часов до события input uint StartAfterEventHours=3; //Запустить через Х часов после события extern string stopNewsEvent="----------------";

Следующая структура поможет нам получить доступ к описанию обрабатываемого события:

Struct NEWS_EVENT { datetime EventTime; //время наступления события string Instrument; //инструмент события string EventComment; //комментарий события };

Пользовательская функция чтения информации из файла

Bool LoadNews() { int handle; // Файловый описатель string instrument, // Название валюты события firstInstrument,secondInstrument, // 1я и 2я часть названия текущей пары eventComment, // Текст описания события stringDateTime; // Строковое выражение даты и времени события datetime eventDateTime; // Дата и время события в формате datetime handle=FileOpen(NewsEventFileName,FILE_CSV|FILE_READ,";");// Открытие файла if(handle<0) // Неудача при открытии файла { int lastError=GetLastError(); if(lastError==4103) // Если файла не существует, сообщим Alert("Нет файла с именем ",NewsEventFileName); else // При любой другой ошибке Alert("Ошибка при открытии файла ",NewsEventFileName," :",lastError); PlaySound("Bzrrr.wav"); // Громко ругнемся и вернем фалсе return false; } int cnt=0; while(FileIsEnding(handle)==false) { stringDateTime =FileReadString(handle);// Дата и время события instrument=FileReadString(handle); //Инструмент eventComment =FileReadString(handle);// Текст описания события, может не быть eventDateTime =StrToTime(stringDateTime); // Преобразование типа данных firstInstrument=StringSubstr(Symbol(),0,3);// Извлекаем первые 3 символа secondInstrument=StringSubstr(Symbol(),3,3);// Извлекаем вторые 3 символа if(StringCompare(instrument,firstInstrument,false)!=0 && StringCompare(instrument,secondInstrument,false)!=0) { continue; //не наши инструменты } cnt++; ArrayResize(NewsEvent,cnt,1000); //изменяем размер массива с запасом для ускорения ArrayResize(NewsEventTime,cnt,1000); NewsEvent.EventTime= eventDateTime; NewsEvent.Instrument=instrument; NewsEvent.EventComment=eventComment; NewsEventTime=eventDateTime; //удобнее искать в одномерном массиве } FileClose(handle); // Закрываем файл ArraySort(NewsEventTime,WHOLE_ARRAY,0,MODE_ASCEND); //сортируем массив для последующего поиска return true; }

Поиск нужного времени осуществляем в массиве NewsEventTime, и если время найдено, то получим его описание их массива структуры NewsEvent

String GetEventInfo(datetime date) { for(int i=0;i

Вспомогательная функция для определения, попадает ли текущее время в промежуток простоя

//проверим, не нужно ли отключить советник по новости True -работаем False - отдыхаем bool CheckEnableNewsWork() { if (ArraySize(NewsEventTime)==0) return true; //по какой-то причине массив с расписанием оказался пустой, значит работаем //теперь нужно найти ближайшую дату в NewsEventTime перед которой нужно остановить работу за StopPriorEventHours часов datetime timeCurrent =TimeCurrent(); datetime timeStopWork=timeCurrent+StopPriorEventHours*3600; //Если в NewsEventTime есть время, меньшее timeStopWork, то прекращаем работать int dateindex=ArrayBsearch(NewsEventTime,timeStopWork,WHOLE_ARRAY,0,MODE_ASCEND); datetime foundEventTime=NewsEventTime; timeStopWork=foundEventTime-StopPriorEventHours*3600; //посчитаем время остановки от найденного времени datetime timeStartWork=foundEventTime+StartAfterEventHours*3600; //это время окончания отдыха //теперь проверим, находимся ли мы сейчас timeCurrent между timeStopWork и timeStartWork. Если да, то не работаем if (timeCurrent>=timeStopWork && timeCurrent<=timeStartWork) { DrawLabel("EnableNewsWork","Не работаем, новость: "+GetEventInfo(foundEventTime)+"",5,80,Red); return false; } else { DrawLabel("EnableNewsWork","Нормальная работа, новостей нет",5,80,Green); return true; } }

Для периодического чтения из файла с расписанием нам нужен таймер, запускаемый к примеру раз в неделю, как настроено

//Проверяем наличие файла с новостями по таймеру void OnTimer() { if (StopOnNewsEvent) { LoadNews(); //читаем файл } }

При инициализации советника нужно запустить таймер и первый раз прочитать новости

OnInit() .... if (StopOnNewsEvent) //Если задано, загрузим файл с новостями { bool tm=EventSetTimer(LoadNewsEventTimerInDay*86400); //запустим таймер для загрузки файла с расписанием if (!tm) Alert("EventSetTimer error:",GetLastError()); OnTimer();//Первый запуск сразу }

В каждом тике проверяем, можем ли мы открывать позиции. На трейлинг кстати это влиять не должно.

OnTick() .... bool enableNewsWork=true; //можно работать по новостным событиям if (StopOnNewsEvent) { enableNewsWork=CheckEnableNewsWork(); //Если ограничение по новостям, проверим время } if (HaveMoney && enableNewsWork) Traiding(Pairs); //проверка условий и открытие торговли по паре

Вот и все. К сожалению, на реальном счете я этот код пока не тестировал, так как писал в выходные, тики эмулировал таймером и текущее время, которое останавливается в выходные, менял вручную. Но на следующей неделе посмотрю уже в реале, в новой версии «Forex Grail 1.11 » , куда я и встроил вышеприведенный код.

В дальнейшем, возможно, нужно сделать удобную утилиту для формирования файла ht-news.csv, например в той же

Данный советник идеально подходит для тех, кто торгует по уровням и любым стратегиям использующим отложенные лимитные ордера. Советник выставит ордера в нужное время на нужном расстоянии от текущей цены! В настройках робота Вы можете задать стоп лоссы, тейк профиты ордеров, а так же лот каждого ордера. Все задается для каждого ордера в отдельности. Можно выставлять только бай лимит, или селл лимит, либо оба ордера вместе!

Советник готов работать на любом торговом инструменте, в любом торговлм терминале Metatrader 4. Так же робот готов работать на нескольких валютных парах сразу. То есть, Вы можете открыть любое количество пар и установить на них советник, задав каждому свой магик номер и настройки времени. После чего, каждая пара будет работать строго индивидуально. Если Вы до сих пор работаете с лимитными ордерами вручную, этот робот для Вас!

  • BUY_limit - Выставить ли ордер бай лимит.
  • Lot_buy_limit - Лот ордера бай лимит.
  • R_buy_limit - Расстояние от текущей цены до ордера бай лимит в пунктах.
  • Stop_Loss_buy_limit - Стоп лосс ордера бай лимит.
  • Take_Profit_buy_limit - Тейк профит ордера бай лимит.
  • SELL_limit - Выставить ли ордер селл лимит.
  • Lot_sell_limit - Лот ордера селл лимит.
  • R_sell_limit - Расстояние от текущей цены до ордера селл лимит в пунктах.
  • Stop_Loss_sell_limit - Стоп лосс ордера селл лимит.
  • Take_Profit_sell_limit - Тейк профит ордера селл лимит.
  • Slippage - Максимальное проскальзывание в пунктах.
  • Close_Orders - Закрытие второго ордера при открытии первого.
  • Times - Время жизни ордера в минутах.
  • Time_Start - Выставить ордера по времени?
  • Time_Hour - Час открытия ордеров 0-23
  • Time_Minute - Минута открытия ордеров 0 - 59. Например час = 5, минута 40, значит в 5.40 будут выставлены ордера от цены в тот момент.
  • Expert_I - магик номер для определения своих ордеров и мультивалютной торговли.

Сегодня речь пойдёт о роботе Trade Scheduler, который имеет очень интересную функцию. При использовании в торговле на Форекс автоматических систем замечали ли вы, что в определённые дни недели или часы они чаще приносят убыток? Например, в первый день недели советник открывает очень мало сделок, и при этом основная часть из них ещё и убыточные. В таких случаях есть смысл отключить советник перед субботой и включить его во вторник. Осуществлять эту несложную операцию можно вручную, но также легко можно забыть отключить или включить советник в нужное время.

Решением этой проблемы (и ещё парочки других) может стать использование робота Trade Scheduler, который сам не торгует, но позволяет ограничить время работы других советников по расписанию, составляемое на основе анализа работы этих советников.

Прежде чем внести коррективы во временной режим работы , необходимо выяснить, в какие моменты он чаще торгует в минус. В этом случае в помощь будет сервис MyFXbook, где представлена подробная статистика торговли системы по дням недели и часам. Оптимальный торговый период для анализа работы системы - 3 месяца. Чтобы провести его, необходимо завести мониторинг на сервисе. Про установку робота на MyFXbook вы можете прочитать . В качестве примера рассмотрим результаты работы эксперта , с мониторингом работы которого можно ознакомиться, кликнув по картинке:

Рис. 1. Мониторинг работы советника Transient Zones 2.0 на сервисе MyFXbook.

Как вариант для тех, кто ещё не располагает достаточной историей торговли робота для анализа на реальном счёте, но при этом он может быть протестирован - то смело грузите на сервис отчёт, полученный из .

После загрузки и обработки мониторинга необходимо перейти в раздел расширенной статистики, вкладка Ежедневно. Здесь можно найти информацию по относительному количеству по дням недели. В нашем примере, наибольшее количество убыточных сделок приходится на четверг и пятницу, а это значит, что в эти дни будет разумно приостанавливать работу эксперта. Причина такого поведения может крыться в состоянии рынка, которое в эти дни не подходит для стратегии робота, и его расчёты менее точные:


Рис. 2. Отношение прибыльных и убыточных сделок советника Transient Zones 2.0 за неделю.

После анализа по дням можно провести анализ эффективно работы по часам. Для этого необходимо перейти во вкладку По часам и посмотреть, когда относительное количество убыточных сделок больше:


Рис. 3. Относительное количество убыточных и прибыльных сделок по часам.

Вывод: будет разумно останавливать торговый процесс в четверг, пятницу, а для остальных дней блокировать его работу в первые два часа нового дня, и в течение дня в те часы, когда убыточные сделки преобладают - в частности, в 12, 13, 14 часов дня. То есть, оставлять его работать ночью с 2 до 8 утра включительно, и с 13 до 21 днём. Результат работы советника должен значительно улучшится.

Установка и настройка эксперта.

Установка вспомогательного советника Trade Scheduler осуществляется по аналогии с любым другим советником, подробнее об этом написано в . По ссылке ниже вы можете скачать архив с экспертом:

Скачать trade-scheduler.rar (cкачиваний: 147)

Разархивируйте архив trade-scheduler.rar , файл эксперта TradeScheduler v2.3.ex4 скопируйте в папку каталог_данных\MQL4\Experts\ . Чтобы открыть каталог данных, необходимо в меню Файл выбрать пункт Открыть каталог данных. Затем терминал перезагружается и после этого советник можно найти в окне Навигатор - Советники.

При установке эксперта на график в окне настроек задаётся необходимое время работы по дням недели и часам. Время задаётся в зависимости от времени терминала, оно же - время . Для каждого дня предусмотрена 3 входных параметра. Первый параметр отвечает за включение/отключение робота в определённый день недели, второй параметр - за время начала торговли, третий - время остановки. Указывается время в формате часы: минуты:


Рис. 4. Входные параметры, заданные после анализа работы советника.

Также в настройках присутствует и дополнительный параметр CloseBeforeSwitchOFF . При значении CloseAll все сделки будут закрываться автоматически перед отключением робота. При CloseAllProfitable - будут закрываться только прибыльные ордера, при No - сделки не будут закрываться. За максимально допустимое проскальзывание отвечает параметр Slip .

Убедитесь, что в терминале разрешена автоторговля и импорт функций из DLL. Для одного терминала устанавливается одна версия советника.

Заключение.

Хотите улучшить показатели работы вашего советника? Попробуйте метод ограничения его работы и проанализируйте результаты. Если статистика показывает, что ваш эксперт "стабильно сливает" в определённое время дня, значит на рынке присутствует закономерность, обработка которой ему не под силу. Приостанавливайте торговлю в этот неблагоприятный период и повышайте её рентабельность!

 
Статьи по теме:
Методические рекомендации по определению инвестиционной стоимости земельных участков
Методики Методические рекомендации по определению инвестиционной стоимости земельных участков 1. Общие положения Настоящие методические рекомендации по определению инвестиционной стоимости земельных участков разработаны ЗАО «Квинто-Консалтинг» в рамках
Измерение валового регионального продукта
Как отмечалось выше, основным макроэкономическим показателем результатов функционирования экономики в статистике многих стран, а также международных организаций (ООН, ОЭСР, МВФ и др.), является ВВП. На микроуровне (предприятий и секторов) показателю ВВП с
Экономика грузии после распада ссср и ее развитие (кратко)
Особенности промышленности ГрузииПромышленность Грузии включает ряд отраслей обрабатывающей и добывающей промышленности.Замечание 1 На сегодняшний день большая часть грузинских промышленных предприятий или простаивают, или загружены лишь частично. В соо
Корректирующие коэффициенты енвд
К2 - корректирующий коэффициент. С его помощью корректируют различные факторы, которые влияют на базовую доходность от различных видов предпринимательской деятельности . Например, ассортимент товаров, сезонность, режим работы, величину доходов и т. п. Об