Як правильно тестувати радників

Багато спорів ведеться про те, як правильно тестувати радників. Можливо, безліч хороших радників загублено через помилки при тестуванні. Багато хто, побачивши у звіті тестера рядок -Якість моделювання n/a, навіть не дивитися інші результати тестування. Таке ставлення є лише результатом незнання того, як відбувається тестування в MetaTrader 4. Багато хто, написавши на MQL4 радника, не замислюючись, запускає його на тестування і, отримавши негативні результати, грішить на тестер або намагається виправити код MQL4-програми. Але це не найстрашніше, найстрашніше – це помилково отримати позитивні результати і виставити експерта на реал. У цьому випадку результати торгівлі можуть бути вкрай плачевними. Цією статтею я хочу підштовхнути трейдерів до того, щоб вони задумалися над тим, що вони тестують, і як вони це роблять. Тестер – це лише інструмент, а інструмент у невмілих руках.

Для того, щоб правильно тестувати радників у MetaTrader 4, необхідно розібратися в тому, як він проводить тестування. Важливість розуміння цього проілюструю наступним прикладом: Протестуємо на днях EUR/USD D1 просту систему, яка відкриває довгу позицію на початку кожного дня. Вихід з позиції відбувається за стоплосом або тейкпрофітом, що дорівнює 20 пунктів кожен. Ось код цього експерта на MQL4:

За цей проміжок часу було здійснено одну угоду. На малюнку зліва відмічено бар, на якому відбувається вхід у ринок. Цей бар має такі характеристики:

Open=1.2139 High=1.2173 Low=1.2048 Close=1.2066

правильно

А ось результати тестування того ж експерта, на тому ж проміжку, за тих самих умов, але при використанні моделітики(в історичних даних були хвилинні котирування за період тестування):

Тобто. отримали прямо протилежний результат! Який результат правильний? Давайте розберемося, чому різні моделі тестування дають різні результати.

Для початку відкриваємо посібник користувача MetaTrader 4 (Довідка -> Виклик довідки), потім вибираємо закладку Зміст, там Автотрейдинг -> Тестування стратегій -> Налаштування та читаємо все, що стосується тестування радників та методів моделювання.

Тепер подивимося, як відбувається тестування радниказа цінами відкриттяна денному таймфреймі EUR/USD D1. Перед тестуванням відбувається генерація fxt-файлу, який складатиметься з денних котирувань. Саме цей файл і буде використаний тестером як джерело котирувань під час тестування. Докладніше про ці файли можна почитати у довідці MetaTrader 4.

правильно

Якщо тепер, всередині функції start() нашого експерта, запитати значення ціни High, Low або Close для поточного бару за допомогою зумовлених змінних High[0], Low[0] та Close[0], то всі вони дадуть неправильне значення 1.2139 тому що бар ще не сформований, а лише змодельований. Єдине значення ціни, яке відповідатиме дійсності це значення ціни відкриття - Open [0] = 1.2139. Значення інших змінних також будуть прив'язані до ціни відкриття, наприклад, поточна ціна Bid в тестері дорівнюватиме 1.2139, Ask = 1.2139 + SPREAD і т.д. Тому і називається даний метод моделювання - за цінами відкриття.

Отже, функцію start() нашого експерта запущено, при цьому виконуються всі умови для здійснення угоди, і позиція відкривається, при цьому виставляються значення StopLoss = 1.2121 та TakeProfit = 1.2161 (20 пунктів кожен). Тім, коли виконання функції start() закінчено, тестер добудовує поточний бар до повного розміру. І тепер, коли у тестера є повністю сформований бар, він може перевірити, чи були досягнуті StopLoss або TakeProfit на цьому барі, щоб у цьому випадку закрити угоду.

У нашому випадку, якщо уважно подивитися, на поточному барі могли бути досягнуті як стоплос, так і тейкпрофіт. Але тестер не знає, як змінювалася ціна всередині цього бару та не може визначити, що було досягнуто першим – StopLoss або TakeProfit. Ціна, можливо, всередині цього бару спочатку йшла вниз досягнувши рівня StopLoss, потім пішла вгору сформувавши верхню тінь свічки і, нарешті, знову пішла вниз намалювавши нижню тінь. А можливо ціна, перш за все, пішла вгору, намалювала верхню тінь, взявши TakeProfit, а потім пішла вниз. У таких спірних ситуаціях тестер завжди вважає, що першим був досягнутий StopLoss! Просто майте це на увазі, коли тестуватимете своїх радників. Тепер зрозуміло, чому при тестуванніза цінами відкриттянаш експерт здійснив збиткову угоду. Тестер просто вирішив, що на поточному барі було досягнуто StopLoss. Зверніть увагу, який час закриття цієї угоди стоїть у результатах тестування. Це також особливість тестера.

радників

Давайте розберемося з моделлю тестуваннявсі тики. З довідки МетаТрейдера:

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

Таким чином,модельвсі тикидозволяє нам наблизити тестування експерта до реальної торгівлі.

Під час запуску тестера він, насамперед, генерує файл з котируваннями, який містить у собі інформацію про всі тики за вибраний період тестування. Робить це тестер, використовуючи інформацію менших таймфреймів. Наприклад, якщо ми запускаємо тестер на денному таймфреймі D1, а в нас є хвилинні котирування за обраний період тестування, то буде згенерований файл, використовуючи і ці, хвилинні котирування. А потім тестер буде використовувати цей згенерований файл для тестування. Тепер функція start() нашого експерта буде викликатися на кожному тику всередині денного бару. Це дає велику перевагу порівняно з тестуванням методомза цінами відкриття. Тестер тепер знає, як поводиться ціна всередині денного бару та зможе правильно визначати моменти досягнення ціною значень StopLoss або TakeProfit.

радників

Ось чому в другому випадку, використовуючи модельвсі тики, ми отримали прибуток, на відміну від першого випадку.

Кожна модель, представлена ​​в тестері, призначена для своїх цілей. Почнемо з того, що найшвидший метод тестування -за цінами відкриття. Саме цей метод я використовую для оптимізації радників. Єдине, треба розуміти, що при цьому можливі випадки, коли при тестуванні радника замість тейкпрофіту спрацьовує стоплос. Це погіршує показники системи, що тестується, але краще вже показники будуть занижені, а в реальній торгівлі покажуть кращий результат, ніж навпаки. При цьому така ситуація насправді не так часто трапляється. Наприклад, якщо TakeProfit=200, а StopLoss=100, необхідно, щоб розмір свічки High – Low дорівнював 300 пунктів. Такі свічки зустрічаються, хіба що днями. Тому,Тестуючи радника з такими значеннями TakeProfit та StopLoss на годинникових даних H1, проблем не виникне. Подивіться, наприклад, на експерта "20/200 pips", який тестувався за цінами відкриття саме з цих міркувань. Результати ж тестування цього експерта, використовуючи модельвсі тики, лише дещо відрізняються від тестівза цінами відкриття.

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

Є, в MetaTrader 4 ще одна модель тестування - контрольні точки . Це більш грубий метод, ніж методвсі тики, який використовує дані найближчого меншого таймфрейму, щоб змоделювати зміну ціни всередині бару. Наприклад, якщо тестувати радника на денному періоді D1, нам необхідна наявність котирувань Н4 (чотиригодинки). Якщо тестуємо на періоді Н4, нам потрібна наявність котирувань H1 і т.д. Цей метод тестування значно швидше, ніж методвсі тики, і дає більш достовірні результати, ніж методза цінами відкриття. Особисто я ніколи не користуюся цим методом, з простої причини - я майже завжди, на стадії розробки, використовую методза цінами відкриття, а потім, коли радник написаний і готовий до роботи тестую йогопо всьомутикам.

Уникнути помилок при тестуванні радників можна лише одним способом – зрозуміти, як відбувається тестування у Метатрейдері. Тестуйте та набирайтеся досвіду.

Насамкінець кілька простих порад:

  • Завжди перевіряйте результати тестування вручну.
  • Для розрахунків індикаторів, що використовуються в раднику, використовуйте тільки сформовані бари. Не використовуйте у розрахунках поточний, нульовий бар.
  • Пишіть радників якнайпростіше і зрозуміліше, щоб було простіше шукати помилки.
  • Якщо Ваш радник може здійснювати угоди всередині, наприклад, денного бару, завжди використовуйте модельвсі тики, при тестуванні на денних барах.
  • Замість того, щоб тестувати, наприклад, на дневках використовуючи модельвсі тики, може краще тестувати на годинникових барах, використовуючи модельза цінами відкриття.
  • Намагайтеся писати радників так, щоб входи в ринок відбувалися в момент приходу нового бару за ціною його відкриття. У момент приходу нового бару, він стає поточним (нульовим), а всі попередні бари вже повністю сформовані, відповідно всі значення індикаторів, що використовуються, прораховані на сформованих барах, можуть бути використані для розрахунків.
  • Спробуйте зрозуміти, що робить тестер і чому саме такі результати він видає.
  • Завжди вручну перевіряйте результати тестування (це не друкарська помилка, я ще раз повторив цю пораду, тому що вона дуже важлива).