Ви, напевно, помічали, що угоди у певні дні або навіть години завдають збитків. Наприклад - це можуть бути угоди в п'ятницю ввечері, результат яких при переносі через вихідні часто непередбачуваний. Як бути? Вручну включати та відключати радник? Це не дуже зручно, та й усі ми люди – можна просто забути це зробити.

Вирішення проблеми – допоміжний радник Trade Scheduler, що дозволяє обмежити час роботи інших експертів за встановленим трейдером розкладом Наприклад, можна обмежити торгівлю роботів з 7 до 11 години понеділка. Дана розробка - від наших друзів з ArgoLab і сьогодні ми докладно познайомимося з нею.

Аналіз статистики

Перед тим, як обмежувати роботу радника, потрібно спершу визначити, коли стратегія дає слабину. Для цього можна скористатися одним із сервісів моніторингу, таким як myfxbook, що дає детальну статистику торгівлі за часом. Щоб аналіз був достовірним, бажано мати статистику торгів хоч би за три місяці.

Отже, для початку потрібно буде завести моніторинг на myfxbook. Про те, як це зробити, на нашому сайті є . За приклад візьмемо моніторинг радника Forex Hunter.

Також на сайт можна завантажити звіт із тестера стратегій. Це в першу чергу потрібно тим, хто ще не має достатньої кількості напрацьованої історії на реальному рахунку, але є робот, який можна протестувати в тестері. Як це зробити, знову ж таки, читайте вокремій статті .

Далі, після того як моніторинг був завантажений і оброблений, переходимо до розділу розширеної статистики, у вкладку “Щодня”. Тут відображається кількість прибуткових та збиткових угод по днях тижня. Як бачимо, у четвер та п'ятницю найбільша відносна кількість збиткових угод - 73% та 74%, відповідно. Це означає, що стан ринку в ці дні не підходить для цієї стратегії, прогнози менш точні і радник втрачає гроші. Для покращення ефективності автоматичної стратегії розумно забрати ці дні з торгівлі.

Потім дивимося статистику щогодини. Стрілками на скріншоті відзначений годинник із найбільшою кількістю збиткових угод. Крім того, що в нічний період (переважно азіатська сесія) угод не лише набагато менше, ніж у середині дня, а й якість входів також бажає найкращого.

Отже, якщо ми блокуватимемо роботу радника у четвер та п'ятницю, залишивши працювати в решту днів з 11 до 19 години, результат гарантовано покращиться.

Налаштування радника для змін у вказаному прикладі виглядатимуть так:


Встановлення та налаштування

Установка радника відбувається стандартним чином. Відкриваємо каталог даних терміналу через Файл - Відкрити каталог даних і переходимо в каталог MQL4 - Experts. Сюди копіюємо завантажений файл радника з розширенням “.ex4”. Щоб радник з'явився у вікні навігатора, перезавантажте термінал.

У налаштуваннях потрібно вказати час роботи відповідно до днів тижня. На кожен із днів передбачено три вхідні параметри. Перший відповідає за включення/вимкнення торгівлі у визначений день, другий – за час старту торгівлі, третій – час завершення торгівлі. Час можна вказати з точністю до хвилини. Час початку може бути більше часу закінчення, наприклад, 19:00 та 9:00. У такому разі торгівля буде дозволена з 00:00 до 9:00 та з 19:00 до 24:00.

Додатковий параметр CloseBeforeSwitchOFF відповідає за закриття всіх позицій одразу перед вимкненням автоторгівлі. Усього параметр може приймати три значення: No – позиції не закриваються; CloseAllProfitable - закриваються лише прибуткові; CloseAll - вихід із всіх відкритих позицій. Параметр slip відповідає за максимальне прослизання.


Не забудьте дозволити автоторгівлю та імпорт функцій із DLL бібліотек.

Час потрібно вказувати, орієнтуючись на термінал, який відображається в заголовку вікна огляду ринку. Воно ж є час вашого брокера.

Також не намагайтеся встановити кілька екземплярів радника на одному рахунку – достатньо лише одного екземпляра. В іншому випадку жоден з них не правильно працюватиме.

Висновок

Обмеження роботи за часом – це найпростіший та найефективніший спосіб покращити показники вашої торгівлі. Наприклад, якщо радник стабільно зливає з 4-х до 8-ми, значить на ринку є інша закономірність, обробити яку робот не в силі. Просто не торгуючи в цей період – ви збільшуєте загальну рентабельність та розвантажте депозит від зайвих угод.

Тема на форумі

З повагою, Олексій Вергунов
TradeLikeaPro.ru

Джерело http://tradelikeapro.ru/sovetnik-tradescheduler/

Сьогодні йтиметься про роботу 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 (завантажень: 139)

Розархівуйте архів trade-scheduler.rar, файл експерта TradeScheduler v2.3.ex4 скопіюйте в папку каталог_даних\MQL4\Experts\. Щоб відкрити каталог даних, у меню Файл виберіть пункт Відкрити каталог даних. Потім термінал перезавантажується і потім радник можна знайти у вікні Навігатор - Радники.

При установці експерта на графік у вікні налаштувань задається необхідний час роботи по днях тижня та годині. Час визначається залежно від часу терміналу, воно ж - час . Для кожного дня передбачено 3 вхідні параметри. Перший параметр відповідає за включення/відключення робота у певний день тижня, другий параметр – за час початку торгівлі, третій – час зупинки. Вказується час у форматі: години: хвилини:


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

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

Переконайтеся, що в терміналі дозволено автоторгівлю та імпорт функцій з DLL. Для одного терміналу встановлюється одна версія радника.

Висновок.

Бажаєте покращити показники роботивашого радника? Спробуйте метод обмеження його роботи та проаналізуйте результати. Якщо статистика показує, що ваш експерт "стабільно зливає" у певний час дня, значить на ринку є закономірність, обробка якої йому не під силу. Зупиняйте торгівлю у цей несприятливий період та підвищуйте її рентабельність!

Цей радник ідеально підходить для тих, хто торгує за рівнями та будь-якими стратегіями, що використовують відкладені лімітні ордери. Радник виставить ордери у потрібний час на потрібній відстані від поточної ціни! У налаштуваннях робота Ви можете задати стоп лоси, тейк профіти ордерів, а також лот кожного ордеру. Все визначається для кожного ордера окремо. Можна виставляти тільки бай ліміт, або сел ліміт, або обидва ордери разом!

Радник готовий працювати на будь-якому торговому інструменті, в будь-якому торговому терміналі 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- магік номер для визначення своїх ордерів та мультивалютної торгівлі.

Якщо ваша торгова система не базується на скачках новин, то буває дуже корисно для фінансового та ментального здоров'я зупиняти роботу радника перед виходом важливих новин. А після устаканивания волатильності, за кілька годин, наново його включати. Добре, якщо у вас є під рукою доступ до робочого терміналу. А якщо немає? Отут і знадобиться автоматизація такої діяльності.

Одним із варіантів вирішення нашого завдання є складання файлу з розкладом важливих подій. Читання цього файлу нашим експертом, та визначення коли можна працювати, а коли ні. У підручнику MQL4 наводиться приклад роботи з текстовим файлом csv, його ми і візьмемо за основу, попутно позбавившись пари помилок, які автори припустилися ненавмисно або з метою перевірки нашої уважності (про що вони самі попереджають - не слід сліпо вірити нікому, помилки бувають завжди).

Отже, складемо розклад важливих подій наступного тижня у наступному форматі:
Дата та час події; інструмент; опис події

2016.04.01 14:00; USD; Індекс ділової активності ISM у виробничому секторі 2016.04.01 14:00; USD; Індекс поступового розгону інфляції від ISM 2016.04.04 09:00; EUR; Індекс цін 0 04 09:00; EUR; Індекс цін виробників (р/р) 2016.04.05 04:30; AUD; Рішення Резервного Банку Австралії за процентною ставкою 2016.04.05 04:30; AUD; 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 //тепер потрібно знайти найближчу дату в NewsEventTime перед якою потрібно зупинити роботу за StopPriorEventHours годин datetime timeCurrent =TimeCurrent(); datetime timeStopWork=timeCurrent+StopPriorEventHours*3600; ArrayBsearch(NewsEventTime,timeStopWork,WHOLE_ARRAY,0,MODE_ASCEND); datetime foundEventTime=NewsEventTime; timeStopWork=foundEventTime-StopPriorEventHours*3600; //Порахуємо час зупинки від знайденого часу datetime /тепер перевіримо, чи ми зараз timeCurrent між timeStopWork і timeStartWork Якщо так, то не працюємо if (timeCurrent>=timeS topWork && 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 :",GetLastError()); OnTimer();//Перший запуск відразу )

У кожному тику перевіряємо, чи можемо ми відкривати позиції. На трейлінг, до речі, це впливати не повинно.

OnTick() .... bool enableNewsWork=true; //можна працювати за подіями новин if (StopOnNewsEvent) ( enableNewsWork=CheckEnableNewsWork(); //Якщо обмеження за новинами, перевіримо час ) if (HaveMoney && enableNewsWork) Traiding(Pairs); //перевірка умов та відкриття торгівлі по парі

От і все. На жаль, на реальному рахунку я цей код поки не тестував, тому що писав у вихідні, тики емулював таймером і час, який зупиняється у вихідні, змінював вручну. Але наступного тижня подивлюся вже в реалі, в новій версії Forex Grail 1.11, куди я і вбудував вищенаведений код.

Надалі, можливо, потрібно зробити зручну утиліту для формування файлу ht-news.csv, наприклад, у тій же