Донецкий техникум промышленной автоматики

Торговий експерт по книзі Б. Вільямса "Нові виміри в біржової торгівлі"

  1. Вступ
  2. 1. Індикатори
  3. 2. Сигнали
  4. 5. Деякі тести на історії
  5. Висновок


Вступ

У даній статті я розповім про створення торгового експерта по книзі Б. Вільямса " Нові виміри в біржової торгівлі "Для платформи MetaTrader 5 на мові MQL5. Сама стратегія добре відома і до сих пір викликає суперечки серед трейдерів про її працездатності.

Вона привертає новачків готової опрацюванням сигналів, які "практично повністю" позбавлені суб'єктивної сторони, на відміну, наприклад, від трактування хвильової теорії Еліота. Але це лише на перший погляд, в деяких місцях все ж доведеться приймати рішення самому трейдеру. І про це по ходу розповіді буде згадано нижче.

Завдання статті:

  • З використанням принципів ООП (Об'єктно-орієнтованого програмування) розробити клас радника, який реалізує торгівлю по стратегії Б. Вільямса, назвемо його C_TS_BW;
  • У класі C_TS_BW по можливості використовувати готові коди з стандартної бібліотеки .
  • Написати радник, який використовує клас C_TS_BW;
  • Перевірити розробленого експерта в тестері стратегій на декількох інструментах Forex і CFD;
  • Як підсумок, підтвердити або спростувати профпридатність даної стратегії в поточних умовах ринку.

1. Індикатори

В основі торгової системи лежать сигнали від 4 індикаторів:

  1. Алігатор;
  2. фрактали;
  3. Дивовижний Осцилятори;
  4. Прискорення / Уповільнення.

1.1. Алігатор
технічний індикатор Alligator - це комбінація Ліній Балансу ( Ковзаючих Середніх, Moving Averages ), Що використовують фрактальную геометрію і нелінійну динаміку.

  • Синя лінія (Щелепа Алігатора) - це Лінія Балансу для тимчасового періоду, який використовувався для побудови графіка (13-періодне згладжені ковзне середнє, зрушене на 8 барів в майбутнє);
  • Червона лінія (Зуби Алігатора) - це Лінія Балансу для значущого тимчасового періоду на порядок нижче (8-періодне згладжені ковзне середнє, зрушене на 5 барів в майбутнє);
  • Зелена лінія (Губи Алігатора) - це Лінія Балансу для значущого тимчасового періоду, який нижче ще на один порядок (5-періодне згладжені ковзне середнє, зрушене на 3 бари в майбутнє).

Губи, Зуби і Щелепа Алігатора показують взаємодію різних часових періодів. Оскільки тренди на ринку можна виділити лише протягом 15-30 відсотків часу, то необхідно слідувати трендам і не працювати на ринках, що змінюються тільки в межах певних цінових періодів.

Коли Щелепа, Зуби і Губи закриті або переплетені, Алігатор збирається спати або вже спить. Коли він спить, його голод збільшується - чим довше він спить, тим більше голодним він буде, коли прокинеться. Коли він прокидається, перше, що він робить, - це відкриває свою пащу і починає позіхати. Потім він починає чути запах їжі: м'ясо бика або м'ясо ведмедя, і починає за ним полювати. Коли Алігатор грунтовно наїсться, він починає втрачати інтерес до їжі-ціною (Лінії Балансу сходяться) - це час для фіксування прибутку.

1.2. фрактали
Всі ринки характеризуються тим, що протягом більшої частини часу ціни на них сильно не змінюються і лише протягом невеликого часу (15-30 відсотків) спостерігаються трендові зміни. Найбільш сприятливі для отримання прибутку періоди, коли ціни на ринках змінюються відповідно до визначеного трендом.

фрактали ( Fractals ) - це один з 4 індикаторів торгової системи Білла Вільямса, що дозволяє виявляти дно або вершину. Технічне визначення фрактала вгору - це серія з мінімум п'яти послідовних барів, в якій перед найвищим максимумом і за ним знаходяться по два бари з більш низькими максимумами. Протилежна конфігурація (серія з п'яти барів, в якій перед самим низьким мінімумом і за ним знаходяться по два бари з більш високими мінімумами) відповідає фракталу вниз. На графіку фрактали мають значення High і Low і відзначені стрілками вгору або вниз.

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

1.3. AO (Awesome Oscillator)
Технічний індикатор Чудовий Осцилятор Білла Вільямса ( Awesome Oscillator, AO ) - це 34-періодне просте ковзне середнє, побудоване по середніх точок барів (H + L) / 2, яке відніме з 5-периодной простого ковзного середнього, побудованого центральними точкам барів (H + L) / 2. Він точно говорить нам, що відбувається в поточний момент часу з рушійною силою ринку.

1.4. AC (Accelerator Oscillator)
Ціна - це останній елемент, який змінюється. Перш ніж зміниться ціна, змінюється рушійна сила ринку, а перед тим, як рушійна сила змінює свій напрямок, прискорення рушійної сили має сповільнитися і дійти до нуля. Потім вона починає прискорюватися в протилежному напрямку до тих пір, поки ціна не почне змінювати свій напрям.

Технічний індикатор Прискорення / Уповільнення ( Accelerator / Decelerator Oscillator, AC ) Вимірює прискорення і уповільнення поточної рушійної сили. Цей індикатор буде змінювати напрямок перед зміною рушійної сили, а вона в свою чергу буде змінювати свій напрямок перед зміною ціни. Розуміння того, що АС є більш раннім попереджувальним сигналом, дає очевидні переваги.


2. Сигнали

У торговельній системі, описаної в книзі Б. Вільямса "Нові виміри в біржової торгівлі", використовуються сигнали від п'яти торгових вимірювань.

  • Перший вимір: подолання фрактала за межами пащі Алігатора;
  • Другий вимір: сигнали від індикатора AO (Awesome Oscillator);
  • Третій вимір: сигнали від індикатора AC (Accelerator Oscillator);
  • Четвертий вимір: торгівля в зонах;
  • П'ятий вимір: торгівля лінією балансу.

Детальніше про сигнали від кожного вимірювання.

2.1. Опис торгівлі сигналами першого виміру

Фрактал "А" на покупку не торгується, тому що пробиття його ціною відбувається нижче лінії зубів Алігатора. Фрактал "В" виповнюється і у нас є відкрита позиція на продаж. При виконанні фрактала "С" ми закриваємо коротку позицію і вже маємо чисту позицію на покупку. При пробитті фрактала "D" знову перевертаємо позицію з покупки на продаж. Подолання фрактала "E" на покупку ринок знову повідомляє, що необхідний переворот позиції з продажу на покупку. При виконанні сигналів від фракталів "G" і "J" ми додаємо до відкритої позиції на покупку ще по одному контракту.


Малюнок 1. Приклад торгівлі сигналами першого виміру

2.2. Опис торгівлі сигналами другого виміру

Від другого виміру реалізовано два типи сигналів. Це перетин нульової лінії індикатора AO (Awesome Oscillator) і сигнал "блюдце". Нумерацію барів приймемо як в MetaTrader 5, тобто від поточного (нульового) бару в історію . Перевірку сигналу будемо виробляти на нульовому барі.

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

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

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

За більш детальним описом сигналів рекомендую ознайомитися з першоджерелом

Малюнок 2. Приклад торгівлі сигналами другого виміру

2.3. Опис торгівлі сигналами третього виміру

Від третього виміру (індикатор AC, Accelerator Oscillator) є сигнали на покупку "вище нульової лінії" і "нижче нульової лінії". Для початку шукаємо патерн, вказаний на малюнку 3. Перевірку виробляємо на нульовому барі. Якщо перший стовпець вище нульової лінії, то нам необхідний варіант "А", який складається з двох зелених і одного червоного стовпців гістограми. Причому неважливо положення щодо нульової лінії другого і третього стовпців.

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

Малюнок 3. Приклад торгівлі сигналами третього виміру.


2.4. Опис торгівлі сигналами четвертого виміру ( "Зональна торгівля")

Зеленою зоною називається такий патерн, коли одному бару на двох індикаторах AO і АС відповідають зелені стовпчики. Для формування торгового сигналу необхідно дві поспіль зелених зони і щоб ціна закриття першого бару була вище ціни закриття другого. Виконання відразу при відкритті нового бару. В оригіналі виконання повинно бути ордером по закриттю бару, але такого в MetaTrader 5 не передбачено. Буває ситуація, коли останній тик закривається бару може змінити колір стовпчика на АТ або АС, і тоді виходить, що вхід на покупку по сигналу від зеленої зони був помилковим. З цих причин я використовую саме відкриття нового бару для покупки.

Також від четвертого виміру є сигнал перенесення стоп наказу на закриття для позиції Buy. Для цього необхідно п'ять поспіль зелених зон. Мінімальне значення ціни першою з зон буде використано в якості установки Stop Loss. Якщо на наступному барі стоп наказ не спрацює (після його закриття), то при відкритті нового переносимо Stop Loss на мінімальну ціну попереднього закритого бару (по ідеї повинна бути вище, ніж стоп наказ), причому не враховуємо якого кольору зона на попередньому барі.

Також використовується обмеження на долівку в відкриту позицію на покупку за кількістю поспіль зелених зон: Б. Вільямс рекомендує 6 або 8. Після чого необхідно почекати поява сірої (це коли кольору стовпців на АТ і АС різні) або червоною зон, які знову дозволяють виробляти доливання на покупку від зеленої зони.

Сигнал на продаж формує "червона зона" - дзеркальне відображення зеленої зони.

Колір зони також впливає на кількість барів, формують сигнал від п'ятого виміру: "Торгівля Лінією Балансу". За цю лінію Б. Вільямс прийняв "зуби" Алігатора. У цьому сигналі хочу особливо підкреслити, що опорні ціни (OHLC) нульового бару беруть участь для формування сигналу.

У цьому сигналі хочу особливо підкреслити, що опорні ціни (OHLC) нульового бару беруть участь для формування сигналу

Малюнок 4. Приклад торгівлі сигналами четвертого виміру


2.5. Опис торгівлі сигналами п'ятого виміру

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

Далі вже на кожному новому робимо перевірку на предмет перевищення поточною ціною знайдених цін для відкриття за сигналом "покупка вище лінії балансу" в умовах зеленої або інших (червоної і сірої) зон.

Малюнок 5. Приклад торгівлі сигналами п'ятого виміру


3. Клас C_TS_BW

3.1.завдання класу
  • По можливості використовувати класи і методи з стандартної бібліотеки ;
  • Великі обсяги власних "схожих даних" зберігати в структурах;
  • Приймати призначені для користувача настройки;
  • Отримувати для аналізу необхідну кількість розрахованих даних від індикаторів;
  • При відкритті нового бару провести пошук сигналів від п'яти торгових вимірювань;
  • При надходженні нового тика перевіряти можливість спрацьовування сигналу для відкриття позиції;
  • Проводити розрахунок лота; або фіксований, або "пірамідінг" (буде розказано про це алгоритмі в методі CalcLot даного класу);
  • Дозволяти змінювати лот з експерта безпосередньо на кожен тип сигналу. Таким способом реалізувати власні потреби в алгоритмах управління капіталом;
  • Виробляти супровід стоп наказу у відкритій позиції. При необхідності змінювати ціну Stop Loss, розрахованої користувачем з радника;
  • Контролювати відправку наказу відкриття угоди на сервер і при невдалій спробі виробляти повторний запит;
  • Заборонити дублювання торгових сигналів (по одному сигналу входити тільки один раз);
  • Мінімізувати кількість методів класу, доступних для звернення з радника;
3.2.Реалізація класу C_TS_BW

Для виконання цього завдання потрібно попередньо підключити необхідні заголовки з Стандартної бібліотеки. Реалізує це нижче наведений код.

#include <Trade \ Trade.mqh> #include <Trade \ SymbolInfo.mqh> #include <Trade \ PositionInfo.mqh> #include <Trade \ HistoryOrderInfo.mqh>

У закритій секції private класу оголошуємо об'єкти для організації торгових запитів , Отримання інформації за встановленим символу і відкритої позиції, а також доступ до історії ордерів.

CTrade exp_trade; CSymbolInfo s_info; CPositionInfo pos_info; CHistoryOrderInfo h_info;

В даному класі використовується чотири структури, дві з них в закритій секції private. це структури

struct l_signals struct l_trade

І дві структури у відкритій секції public.

struct s_input_parametrs struct s_actual_action

Об'єкти даних типів структур:

l_signals last_signals; l_trade last_trade; s_input_parametrs inp_param; s_input_parametrs inp_param_tmp; s_actual_action actual_action;

Детально про коді самих структур можна ознайомитися в доданому заголовки.

Дане завдання реалізується за допомогою методу Init з секції public. Параметри для виклику з експерта:

string Symbol_for_trade ENUM_TIMEFRAMES Period_for_trade s_input_parametrs & inp_param_tmp

У цьому методі також відбувається ініціалізація задіяних індикаторів і організація необхідних буферів для отримання даних від них.

Це під силу методу CopyIndValue з секції private, параметри

int type int countValue

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

Пошук сигналів будемо робити тільки один раз після відкриття нового бару. Для цього потрібно цей момент визначити. Виконує це метод NewBar, у нього немає входять параметрів і в разі ситуації, коли прийшов тик відкриває новий бар, повертає true, інакше повертає false.

На кожне з торгових вимірювань я завів окремий метод. Сигнали першого виміру шукає FindSignal_1_dimension.

Параметри виклику:

int type double & price_out [] datetime & time_out []

Аналіз другого виміру виконує метод FindSignal_2_dimension. Параметри виклику:

int type int sub_type double & price_out [] datetime & time_out []

Від третього виміру дані отримуємо за допомогою методу FindSignal_3_dimension з вхідними / вихідними параметрами:

int type int sub_type double & price_out [] datetime & time_out []

Обробку четвертого виміру доручено методу FindSignal_4_dimension з вхідними / вихідними параметрами:

int type int sub_type double & price_out [] datetime & time_out []

За п'ятим виміром спостерігає FindSignal_5_dimension. Параметри у цього методу:

int type int sub_type double & price_out [] datetime & time_out []

Весь пошук сигналів об'єднує метод CheckSignal, він не має вхідних параметрів і містить в собі:

  • Копіювання даних від індикаторів;
  • Перевірку на закриття позиції (якщо використовується) за будь-якої з ліній Алігатора;
  • Скидання актуальних сигналів попереднього бару;
  • Пошук активних фракталів в обох напрямках;
  • Залежно від наявності позиції шукає сигнали від другого по п'ятий вимір в напрямку відкритої позиції.

Даний метод оголошений в секції public, його необхідно викликати з радника.

  • ... під час вступу нового тика перевіряти на можливість спрацьовування сигналу для відкриття позиції;

У класі реалізований метод CheckForTradeSignal, який виконує пошук можливості входу в позицію за поточною ціною. Параметри виклику:

int dimension int type int sub_type double & price_out [] datetime & time_out []

Якщо дотримані всі умови для активації сигналу, то повертаємо true, інакше false.

Перевірку можливості відпрацювання всіх сигналів об'єднує метод CheckActionOnTick, оголошений в секції public, його необхідно викликати з радника. Параметри на виклик відсутні. Кожен успішний сигнал зберігається в об'єкті actual_action, згодом вони будуть оброблятися в методі TradeActualSignals.

Метод CalcLot оголошений в секції public і може викликатися з радника. Він призначений для розрахунку лота і подальшої модифікації змінної Lot, оголошеної в секції private даного класу. Параметри виклику:

bool external double ext_lot int type

Якщо з фіксованим лотом більш-менш зрозуміло, то про "пірамідінге" розповім більш докладно.

Нехай стартовий лот буде 0.1, тоді, например, відкріваємося стартовою лотом за сигналом від фрактала за межами пащі Алігатора, сумарна позиція 0.1 лота. После чого ПОЧИНАЄМО аналізуваті надходять сигналі від іншого по п'яте вимірювання. Як только спрацьовує сигнал, долівають у відкріту позицию 0.5 лотами (стартовий, помножений на 5), разом маємо Загальний ОБСЯГИ позіції 0.6 лота. При наступному сигналі в напрямку відкритої позиції доливають 0.4 лота, і сумарна позиція буде дорівнює 1.0 лоту.

Наступний сигнал в напрямку позиції додасть нам 0.3 лота, і її обсяг буде 1.3 лота. П'ята за рахунком долівка буде проводитися 0.2 лотами, і сумарний обсяг позиції стане 1.5 лота. Наступні доливання в напрямку позиції будуть відбуватися тільки 0.1 лотом.

Даний алгоритм управління капіталом (маніменеджмента, ММ) був описаний Б. Вільямсом в " торговому Хаосі ". Можливість встановлювати користувальницький лот дозволяє реалізувати практично будь-яке управління капіталом.

Для правильного визначення послідовності ордерів в угоді, я використовую різні Magic номера.

номер

опис ордера

999

Переворотних ордер.

1000

стартовий ордер

+1001

Долівочний ордер (стартовий Х 1)

1002

Долівочний ордер (стартовий Х 2)

1003

Долівочний ордер (стартовий Х 3)

1004

Долівочний ордер (стартовий Х 4)

1005

Долівочний ордер (стартовий Х 5)

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

При бажанні можна в експерта реалізувати опитування структури actual_action, в якій зберігаються торгові сигнали у вигляді bool змінних. Кожному типу і напрямку відповідає своя змінна. Якщо маємо значення true, то на цьому тику клас спробує зробити торгову операцію за вказаною торговому сигналу, після чого можна змінювати лот для цього сигналу. За один тик зміни ціни, клас відправляє тільки один ордер на відкриття позиції або долівку.

Установка користувальницького лота можлива в радника після виклику методу CheckActionOnTick і перед викликом TradeActualSignals. Так як на поточному тику може бути кілька сигналів, які очікують виконання, буде відпрацьований тільки один.

Порядок виконання сигналів:

  • Закриття позиції;
  • Виконання одного з сигналів від фрактала (відкриття, долівка, переворот позиції);
  • Сигнал "блюдце";
  • Сигнал "Перетин нульової лінії";
  • АC "два однаково - кольорових бару";
  • АC "три однаково - кольорових бару";
  • Торгівля в зонах;
  • Лінія балансу (2-х баровий сигнал);
  • Лінія балансу (3-х баровий сигнал);

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

  • ... Виробляти супровід стоп наказу у відкритій позиції. При необхідності змінювати ціну Stop Loss, розрахованої користувачем з радника.

В описуваному класі реалізовано супровід стоп ціни у позиції методом Trailing Stop, тобто підтягування Stop Loss тільки в напрямку збільшення прибутку у позиції при спрацьовуванні за цією ціною. Є п'ять моделей супроводу:

  • По лінії губ Алігатора;
  • По лінії зубів Алігатора;
  • По лінії щелеп Алігатора;
  • За п'ять поспіль зонам одного кольору (зелені зони для покупки, червоні для продажу);
  • Вибіркова інсталяція стоп ціни.

П'ятий варіант установки Stop Loss реалізує метод SetStopLoss з єдиним параметром double & stoploss. Виклик необхідно проводити з радника і перед виконуючим методом TrailingStop, який проводить перевірку ціни для модифікації позиції і відправляє запит на сервер. Після успішного виконання цієї процедури значення внутрішньої змінної StopLoss скидається в значення -1.

Відправку торгового наказу для відкриття, закриття або перевороту позиції використовується метод bool SendOrder. Параметри виклику:

ENUM_ORDER_TYPE type double & price_out [] datetime & time_out [] string comment

Об'єднує відпрацювання всіх торгових сигналів метод TradeActualSignals. У структурі actual_action зберігаються торгові накази. Після успішного відправлення на сервер наказу (SendOrder повертає true) скидаємо торговий сигнал в структурі actual_action. Торговий сигнал буде активний до тих пір, поки не отримаємо позитивну відповідь про відправку.

Є також в структурі actual_action функція init без параметрів, яка скидає всі актуальні сигнали. Дана процедура використовується, коли відкривається нова, або переворот вже наявної позиції.

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

Ось список методів класу, доступних з виклику з радника:

void C_TS_BW (); bool Init (string Symbol_for_trade, ENUM_TIMEFRAMES Period_for_trade, s_input_parametrs & inp_param_tmp); bool NewBar (); void CheckSignal (); void CheckActionOnTick (); void TrailingStop (); void TradeActualSignals (); void SetStopLoss (double & stoploss); void CalcLot (bool external, double ext_lot, int type);

Також доступні структури:

actual_action inp_param_tmp;


4. Реалізація радника з використанням класу C_TS_BW

Перше, що потрібно зробити, це підключити в радника заголовки h_TS_BW.mqh, в якому реалізований зазначений клас.

#include <h_TS_BW.mqh>

Після чого оголосити об'єкт класу C _ TS _ BW. Нехай буде це expert_TS_BW.

Також буде потрібно структура параметрів, що настроюються виду s_input_parametrs, наприклад, input_parametrs.

Ось опис параметрів, об'єднаних в цю структуру:

input_parametrs.alligator_jaw_period input_parametrs.alligator_jaw_shift input_parametrs.alligator_teeth_period input_parametrs.alligator_teeth_shift input_parametrs.alligator_lips_period input_parametrs.alligator_lips_shift input_parametrs.add_1_dimension input_parametrs.add_2_dimension_bludce input_parametrs.add_2_dimension_cross_zero input_parametrs.add_3_dimension_use_2_bars input_parametrs.add_3_dimension_use_3_bars input_parametrs.add_4_dimension_zone input_parametrs.add_5_dimension input_parametrs.max_4_dimension_zone input_parametrs.trall_4_dimension input_parametrs.agress_trade_mm input_parametrs. support_position input_parametrs.lot

У секції OnInit () радника необхідно:

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

expert_TS_BW.Init (Symbol (), PERIOD_CURRENT, input_parametrs)

В даному випадку радник буде працювати на поточному символі / періоді де встановлено.

Приклад секції радника OnTick ():

if (expert_TS_BW.NewBar ()) {expert_TS_BW.CheckSignal (); } Expert_TS_BW.CheckActionOnTick (); expert_TS_BW.TrailingStop (); expert_TS_BW.TradeActualSignals ();

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

5. Деякі тести на історії

Автор книги, по якій був написаний експерт, стверджує, що дана система орієнтована на акції і товарні ринки.

Для початку перевіримо експерт на CFD. Нехай як полігон для тестування буде частина історії IBM. Система орієнтована на трендові ділянки котирувань. Я взяв перший-ліпший відрізок, де на око видно упевнений тренд.

Я взяв перший-ліпший відрізок, де на око видно упевнений тренд

Малюнок 6. Графік IBM

Запустив на цій ділянці написаного експерта і ось що отримав у вигляді ордерів.

Малюнок 7. Торгові сигнали Білла Вільямса (IBM)

На вигляд багато відкриттів по тренду, що не може не радувати. А ось графік з вікна тестера. Торгівля велася лотом 0.1, без закриття по лініях Алігатора, без трала по п'яти поспіль зонам одного кольору, без агресивної торгівлі (пірамідінга).

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

Малюнок 8. Результати тестування

В цілому отримали прибуток.

Тепер візьмемо затяжний тренд не такої сильної нахилу.

Тепер візьмемо затяжний тренд не такої сильної нахилу

Малюнок 9. Графік котирувань IBM (фрагмент 2)

Нехай це буде той же інструмент і період 13 місяців (з 2008.12) по (2010.01)

Ось графік з тестера:

Ось графік з тестера:

Малюнок 10. Результати тестування системи на історії (фрагмент 2)

Скажімо так, "незадовільно" або "не виправдав надії".

Далі хотілося б перевірити роботу і на валютних парах.

Нехай буде всім відома пара EURUSD і період графіка Н1. Глибина історії 2010 рік.

Малюнок 11. Результати тестування системи на історії, EURUSD, H1 2010

Спробуємо на денних свічках EURUSD за той же 2010 рік.

Звіт тестера виглядає ось так:

Малюнок 12. Результати тестування системи на історії, EURUSD, D1 2010


Висновок

Метою даної статті було розгляд тестування працездатності однією із загальнодоступних стратегій Білла Вільямса не тільки на ринках акцій і товарно-сировинних біржах, але і на ринку Forex. Система "більш-менш" працює на денних графіках EURUSD за останній рік, але не приносить прибутку на менших таймфреймах без спроб оптимізації.

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

Повний код класу можна подивитися в прикріпленому файлі.