Скачать MetaTrader 5

Пример торговой системы на основе индикатора Heiken-Ashi

20 мая 2010, 13:29
Dmitry Voronkov
3
15 904

Введение

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

Одна из таких методик изменяющая традиционный график свечей и облегчающая восприятие, техника Heikin Ashi.

«Nani Desu Ka?»*

Впервые публикации на данную тему появились 2004 г. в февральском номере журнала «Technical Analysis of  STOCKS & COMMODITIES», где Dan Valcu опубликовал статью под названием «Using The Heikin Ashi Technique» (Использование техники Хеикин Аши). Вот ссылка на оригинал статьи.

На своем сайте (http://www.educofin.com/) автор указывает, что летом 2003 г. он исследовал технику Ichimoku, и как это часто бывает, случайно обнаружил несколько диаграмм, на которых ясно была видна тенденция рынка. Это и оказались Heikin-Ashi диаграммы, или точнее сказать, измененные свечи.

Этот метод анализа был разработан японским трейдером,  который стал успешным и использует его до сих пор. К удивлению автора, он не нашел другой информации в книгах или Интернете, поэтому решил сделать ее доступной для всех трейдеров опубликовав в журнале.

Метод Heikin-Ashi (heikin по-японски означает "средину" или "баланс", а ashi значит "нога" или "полоса") представляет собой визуальный инструмент оценки тенденций, их направление и силу. Это не «Святой Грааль» торговли, но хороший и простой инструмент для визуализации тенденции.

Давайте рассмотрим, как происходит расчет изменения OHLC значений свечи.

Закрытие текущего бара:  haClose = (Open+High+Low+Close)/4;

Открытие текущего бара:  haOpen=(haOpen[пред.]+haClose[пред])/2

Максимум текущего бара: haHigh=Max(High, haOpen, haClose)

Минимум текущего бара: haLow=Min(Low, haOpen, haClose)

Значения "Open," "High," "Low" и "Close" относятся к текущему бару. Префикс ha- указывает на соответственные измененные значения по heikin-ashi.

Чтобы облегчить восприятие рыночной информации, техника Heikin-Ashi изменяет традиционный график свечей, создавая так называемые синтетические свечи, которые удаляют из нормального графика нерегулярность, предлагая лучшую картину трендов и консолидаций. Просто просматривая график свечей, созданный этим методом, вы получаете хорошее представление о состоянии рынка и его силе.

 

Рис.1 Слева обычный свечной график(a), с права(b) график построенный с использованием Heikin-Ashi

На Рис. 1 видно отличие традиционных японских свечей от свечей Heiken Ashi.  Отличительной особенностью этих графиков является то, что при восходящем тренде у большинства белых свечей отсутствует нижняя тень. При нисходящем тренде отсутствует верхняя тень у большинства чёрных свечей.  На графиках Heiken Ashi  отсутствуют разрывы, новая свеча открывается на уровне середины предыдущей. 

Свечи на графиках Heiken-Ashi  в большей степени, чем традиционные свечи указывают направление тренда.  Когда тренд слабеет, тела свечей уменьшаются, тени увеличиваются.  Смена цвета свечей является сигналом на покупку/продажу. Наиболее удобно по этим графикам визуально определять окончание коррекционных движений.

Этот индикатор входит в состав МetaТrader 5 и его можно найти в разделе «Пользовательские индикаторы\Examples\ Heiken_Ashi.mq5».  Перед установкой индикатора на график, я рекомендую сделать график линейным и в свойствах графика вкладка «Общие» снять галочку с пункта «График сверху».

Хотелось бы, еще раз акцентировать ваше внимание на том, что методика Heiken-Ashi не «Святой Грааль». Для доказательства этого, я попытаюсь создать простую торговую систему (ТС)  с использованием исключительно данной методики. Написать простого эксперта, используя язык программирования MQL5 и стандартную библиотеку классов, а затем протестировать его на исторических данных с использованием тестера стратегий MetaTrader 5 Strategy Tester.

Алгоритм торговой системы

Не мудрствуя лукаво для создания алгоритма, используем шесть основных правил использования методики Heiken-Ashi предложенных Dan Valcu на сайте http://www.educofin.com/.

  1. Тенденция на повышение - синяя свеча  haClose>haOpen
  2. Тенденция на понижение – красная свеча haClose<haOpen
  3. Сильная тенденция на повышение – синяя свеча, в которой нет Low  haOpen==haLow
  4. Сильная тенденция на понижение – красная свеча, в которой нет High haOpen==haHigh
  5. Консолидация – последовательность свечей с небольшим телом (любого цвета) и с длинными тенями
  6. Смена тренда – свеча с небольшим телом и длинными тенями противоположного цвета. Не всегда надежный сигнал, т.к. может быть частью консолидации (п.5).

Тенденция (1,2) все понятно, если мы находимся в сделке, просто удерживаем позицию, подвигая стоп на 1-2 пункта ниже/выше предыдущей свечи.

Сильная тенденция (3,4),  так же подтягиваем стоп.

Консолидация (5) и смена тренда (6) , однозначно закрываем позицию (если она не закрылась по стопу), а вот об открытии противоположной позиции нужно подумать. Для принятия решения нам необходимо каким-то образом определить, что у нас происходит консолидация или разворот и очевидна необходимость фильтра построенного на индикаторах, свечном анализе или графическом анализе.

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

Итак, наш алгоритм таков:

  1. По окончании формирования свечи противоположного цвета, мы закрываем предыдущую позицию, если она есть, и открываем позицию на открытии новой свечи, установив стоп на 2 пункта ниже/выше минимума/максимума предыдущей свечи.
  2. Тенденция – двигаем стоп на 2 пункта ниже/выше минимума/максимума предыдущей свечи.
  3. При сильной тенденции мы производим те же действия, что и при тенденции, т.е. двигаем стоп.

В общем, все просто и надеюсь понятно, теперь реализуем это на языке MQL5.

Программирование эксперта на MQL5

Для создания эксперта, нам понадобится только один входной параметр – размер лота,  две функции обработки событий OnInit(), OnTick() и  наша собственная функция CheckForOpenClose().

Для задания входных параметров в MQL5 предназначены Input-переменные.
//--- input parameters
input double Lot=0.1;    // Размер лота / Size lot

Функция OnInit() является обработчиком события Init. Событие Init генерируется сразу после загрузки эксперта.

В теле данной функции мы подключим к эксперту индикатор. Как я уже упоминал выше, в стандартную поставку MetaTrader 5 входит индикатор Heiken_Ashi.mq5.

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

haOpen=(haOpen[пред.]+haClose[пред])/2

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

Для этого в тело функции OnInit() добавим строку:

   hHeiken_Ashi=iCustom(NULL,PERIOD_CURRENT,"Examples\\Heiken_Ashi");

и получим в глобальную переменную hHeiken_Ashi  - хэндел индикатора Heiken_Ashi.mq5, который понадобится нам в дальнейшем.

Функция OnTick() является обработчиком события NewTick(), которое генерируется при поступлении нового тика.

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
      if(BarsCalculated(hHeiken_Ashi)>100)
        {
         CheckForOpenClose();
        }
//---
  }

Функция TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) проверяет, разрешена торговля или нет. С помощью функции BarsCalculated(hHeiken_Ashi) мы проверяем количество рассчитанных данных для запрашиваемого индикатора, в нашем случае Heiken_Ashi.mq5.

И если оба условия выполнены, происходит выполнение нашей функции CheckForOpenClose() в которой и происходит основная работа. Рассмотрим ее подробнее.

Так как по условиям нашей ТС установка ордеров производится при открытии новой свечи, то нам необходимо определить открылась новая свеча или нет, для этого есть много способов, но самый простой, проверка тикового  объема. Таким образом, если тиковый объем равен единице, это указывает на то, что открылся новый бар, и необходимо проверить условия ТС и выставить ордера.

Реализуем это таким образом:

//--- обрабатываем ордера только при поступлении первого тика новой свечи
//--- we process warrants only at receipt of the first tic of a new candle
   MqlRates rt[1];
   if(CopyRates(_Symbol,_Period,0,1,rt)!=1)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[0].tick_volume>1) return;

Создадим переменную массив типа MqlRates размером в один элемент. С помощью функции CopyRates() получим в нее значения последнего бара.

Затем, проверим тиковый объем и если он больше единицы, завершим работу функции, а если нет, то продолжим вычисления.

Далее с помощью директивы #define объявим несколько мнемонических констант:

//--- для проверки условий нам необходимы три последних бара
//--- three last bars are necessary for check of conditions for us
#define  BAR_COUNT   3
//--- номер буфера индикатора для хранения Open
//--- number of the buffer of the indicator for storage Open
#define  HA_OPEN     0
//--- номер буфера индикатора для хранения High
//--- number of the buffer of the indicator for storage High
#define  HA_HIGH     1
//--- номер буфера индикатора для хранения Low
//--- number of the buffer of the indicator for storage Low
#define  HA_LOW      2
//--- номер буфера индикатора для хранения Close
//--- number of the buffer of the indicator for storage Close
#define  HA_CLOSE    3

Затем объявляем массивы:

double   haOpen[BAR_COUNT],haHigh[BAR_COUNT],haLow[BAR_COUNT],haClose[BAR_COUNT];

и с помощью функции CopyBuffer() получаем значения индикатора в соответствующие массивы.

   if(CopyBuffer(hHeiken_Ashi,HA_OPEN,0,BAR_COUNT,haOpen)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_HIGH,0,BAR_COUNT,haHigh)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_LOW,0,BAR_COUNT,haLow)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_CLOSE,0,BAR_COUNT,haClose)!=BAR_COUNT)
     {
      Print("CopyBuffer from Heiken_Ashi failed, no data");
      return;
     }

Хочу акцентировать ваше внимание на то, как хранятся полученные данные в переменных массива.

Самый «старый» (исторически) бар хранится в самом первом элементе массива (нулевом).

Самый «молодой» (текущий) бар в последнем, BAR_COUNT-1 (Рис.2).

Рис. 2 Порядок расположения свечей и значений индексов массива

И так значения OHLC Heiken-Ashi  нами получены, остается проверить условия открыть и сопровождать позицию.

Рассмотрим подробно обработку сигнала на продажу.

Как я обращал ваше внимание раньше, мы получили значения трех Heiken-Ashi  свечей. В ячейках с номером [BAR_COUNT-1=2] находится текущее значение, оно нам без надобности. В ячейках [BAR_COUNT-2=1] предыдущие значения и в ячейках [BAR_COUNT-3=0] более ранний бар (см. рис. 2), а на основе этих двух баров мы и будем проверять условия заключения сделок.

Затем нам необходимо проверить наличие открытых позиций по инструменту, для этого воспользуемся классом CPositionInfo стандартной библиотеки классов. При помощи данного класса мы имеем возможность получения информации об открытых позициях. Используя метод Select(_Symbol) определяем наличие открытых позиций по нашему инструменту, и если они есть методом PositionType() уточняем тип открытой позиции.

Если у нас в данный момент открыта позиция на покупку, то нам необходимо ее закрыть.

Для этого мы воспользуемся методами класса CTrade стандартной библиотеки который предназначен для обработки ордеров.

При помощи метода PositionClose(const string symbol,ulong deviation) мы закроем покупку, где symbol – имя инструмента, а второй параметр deviation – допустимое отклонение цены закрытия.

После этого мы проверяем комбинации свечей согласно нашей ТС.  Так как направление только, что сформированной свечи (с индексом [BAR_COUNT-2]) мы уже проверили, осталось проверить свечу передней ней (с индексом [BAR_COUNT-3]) и выполнить необходимые действия для открытия позиции.

      //--- проверяем есть открытая позиция, если на покупку закрываем ее
      //--- we check there is an open position if on purchase it is closed it
      if(posinf.Select(_Symbol))
        {
         if(posinf.Type()==POSITION_TYPE_BUY)
           {
            trade.PositionClose(_Symbol,3);
           }
        }
      //--- проверяем и устанавливаем уровень стопа
      //--- we check and instal stop level
      double stop_loss=NormalizeDouble(haHigh[BAR_COUNT-2],_Digits)+_Point*2;
      double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point;
      if(stop_loss<stop_level) stop_loss=stop_level;
      //--- проверяем комбинацию: сформировалась свеча противоположного цвета
      //--- we check a combination: the candle of opposite colour was generated
      if(haOpen[BAR_COUNT-3]<haClose[BAR_COUNT-3])
        {
         if(!trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }
      else
      if(posinf.Select(_Symbol))
        {
         if(!trade.PositionModify(_Symbol,stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        } 

Тут следует обратить внимание на использование трех методов класса CTrade.

Метод  PositionOpen( symbol, order_type, volume, price, sl, tp, comment), используется для открытия позиции, где symbol – имя инструмента, order_type – тип ордера, volume – размер лота, price – цена покупки, sl – стоп, tp – профит, comment – комментарий.

Метод PositionModify( symbol, sl, tp), используется для изменения величины стопа и профита, где symbol – имя инструмента, sl – стоп, tp – профит. Хочу обратить ваше внимание на то, что перед использованием данного метода необходимо проверить наличие открытой позиции.

 Метод ResultRetcodeDescription(), используется для получения кода ошибки в текстовом виде.

При вычислении переменной stop_loss, значение haHigh[BAR_COUNT-2] является расчетным, полученным из индикатора, и для корректного использования требует нормализации с помощью функции NormalizeDouble(haHigh[BAR_COUNT-2], _Digits).

На этом обработка сигнала на продажу завершена.

Для покупки используем тот же принцип.

Вот полный текст эксперта

//+------------------------------------------------------------------+
//|                                           Heiken_Ashi_Expert.mq5 |
//|                                               Copyright VDV Soft |
//|                                                 vdv_2001@mail.ru |
//+------------------------------------------------------------------+
#property copyright "VDV Soft"
#property link      "vdv_2001@mail.ru"
#property version   "1.00"

#include <Trade\AccountInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>

//--- the list of global variables

//--- input parameters
input double Lot=0.1;    // Размер лота / Size lot
//--- indicator handles
int      hHeiken_Ashi;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   hHeiken_Ashi=iCustom(NULL,PERIOD_CURRENT,"Examples\\Heiken_Ashi");
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
      if(BarsCalculated(hHeiken_Ashi)>100)
        {
         CheckForOpenClose();
        }
//---
  }
//+------------------------------------------------------------------+
//| Проверка условий и открытие позиции                              |
//| Check of conditions and item opening                             |
//+------------------------------------------------------------------+
void CheckForOpenClose()
  {
//--- обрабатываем ордера только при поступлении первого тика новой свечи
//--- we process warrants only at receipt of the first tic of a new candle
   MqlRates rt[1];
   if(CopyRates(_Symbol,_Period,0,1,rt)!=1)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(rt[0].tick_volume>1) return;
//--- для проверки условий нам необходимы три последних бара
//--- three last bars are necessary for check of conditions for us
#define  BAR_COUNT   3
//--- номер буфера индикатора для хранения Open
//--- number of the buffer of the indicator for storage Open
#define  HA_OPEN     0
//--- номер буфера индикатора для хранения High
//--- number of the buffer of the indicator for storage High
#define  HA_HIGH     1
//--- номер буфера индикатора для хранения Low
//--- number of the buffer of the indicator for storage Low
#define  HA_LOW      2
//--- номер буфера индикатора для хранения Close
//--- number of the buffer of the indicator for storage Close
#define  HA_CLOSE    3

   double   haOpen[BAR_COUNT],haHigh[BAR_COUNT],haLow[BAR_COUNT],haClose[BAR_COUNT];

   if(CopyBuffer(hHeiken_Ashi,HA_OPEN,0,BAR_COUNT,haOpen)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_HIGH,0,BAR_COUNT,haHigh)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_LOW,0,BAR_COUNT,haLow)!=BAR_COUNT
      || CopyBuffer(hHeiken_Ashi,HA_CLOSE,0,BAR_COUNT,haClose)!=BAR_COUNT)
     {
      Print("CopyBuffer from Heiken_Ashi failed, no data");
      return;
     }
//---- проверяем сигналы для продажи
//---- we check signals for sale
   if(haOpen[BAR_COUNT-2]>haClose[BAR_COUNT-2])// свеча на понижение / candle on fall
     {
      CPositionInfo posinf;
      CTrade trade;
      double lot=Lot;
      //--- проверяем есть открытая позиция, если на покупку закрываем ее
      //--- we check there is an open position if on purchase it is closed it
      if(posinf.Select(_Symbol))
        {
         if(posinf.Type()==POSITION_TYPE_BUY)
           {
            trade.PositionClose(_Symbol,3);
           }
        }
      //--- проверяем и устанавливаем уровень стопа
      //--- we check and instal stop level
      double stop_loss=NormalizeDouble(haHigh[BAR_COUNT-2],_Digits)+_Point*2;
      double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_ASK)+SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point;
      if(stop_loss<stop_level) stop_loss=stop_level;
      //--- проверяем комбинацию: сформировалась свеча противоположного цвета
      //--- we check a combination: the candle of opposite colour was generated
      if(haOpen[BAR_COUNT-3]<haClose[BAR_COUNT-3])
        {
         if(!trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,lot,SymbolInfoDouble(_Symbol,SYMBOL_BID),stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }
      else
      if(posinf.Select(_Symbol))
        {
         if(!trade.PositionModify(_Symbol,stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }
     }
//---- проверяем сигналы для покупки
//---- We check signals for purchase
   if(haOpen[BAR_COUNT-2]<haClose[BAR_COUNT-2])// свеча на повышение / сandle on increase
     {
      CPositionInfo posinf;
      CTrade trade;
      double lot=Lot;
      //--- проверяем есть открытая позиция, если на продажу закрываем ее
      //--- we check there is an open position if on sale it is closed it
      if(posinf.Select(_Symbol))
        {
         if(posinf.Type()==POSITION_TYPE_SELL)
           {
            trade.PositionClose(_Symbol,3);
           }
        }
      //--- проверяем и устанавливаем уровень стопа
      //--- we check and instal stop level
      double stop_loss=NormalizeDouble(haLow[BAR_COUNT-2],_Digits)-_Point*2;
      double stop_level=SymbolInfoDouble(_Symbol,SYMBOL_BID)-SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)*_Point;
      if(stop_loss>stop_level) stop_loss=stop_level;
      //--- проверяем комбинацию: сформировалась свеча противоположного цвета
      //--- we check a combination: the candle of opposite colour was generated
      if(haOpen[BAR_COUNT-3]>haClose[BAR_COUNT-3])
        {
         if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,lot,SymbolInfoDouble(_Symbol,SYMBOL_ASK),stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }
      else
      if(posinf.Select(_Symbol))
        {
         if(!trade.PositionModify(_Symbol,stop_loss,0))
            Print(trade.ResultRetcodeDescription());
        }

     }
  }
//+------------------------------------------------------------------+ 

Также полный текст эксперта вы найдете в прикрепленном файле Heiken_Ashi_Expert.mq5.Скопируйте его в каталог ..\MQL5\Experts, после этого через меню «Сервис -> Редактор MetaQuotes Language» или клавишей «F4» запустите MetaEditor. Мосле этого в окне «Навигатор» откройте вкладку «Experts» и двойным нажатием загрузите файл Heiken_Ashi_Expert.mq5 в окно редактирования и, нажав клавишу «F7» откомпилируйте.

Если все операции произведены правильно в окне «Навигатор» терминала по вкладке «Советники» появится файл Heiken_Ashi_Expert.


Проверка жизнеспособности торговой системы


Для проверки жизнеспособности нашей торговой системы воспользуемся программой MetaTrader 5 Strategy Tester входящей в состав торговой платформы.

Запускается тестер стратегий через меню терминала «Вид -> Тестер стратегий» или комбинацией клавиш «Ctrl+R».

После запуска мы попадаем во вкладку тестера «Настройки» (рис 3). 

Рис.3 Окно Тестера стратегий «Настройки»

 

Настраиваем,  советник – выбираем из списка наш эксперт, интервал тестирования указываем с начала 2000 по конец 2009 года, размер начального депозита 10000 USD, оптимизацию отключаем (т.к. у нас один входной параметр и мы хотим просто проверить жизнеспособность ТС).

Тестирование будем производить по двум валютным парам. Мне захотелось выбрать такие валютные пары как EURUSD и GBPUSD.

Для тестирования я решил взять такие временные промежутки как H3, H6 и H12. Вы спросите почему? Отвечу, просто мне захотелось протестировать ТС на тех временных промежутках, которых не было в предыдущих версиях терминала MetaTrader.

И так приступим. Выбираем валюту тестирования EURUSD период H3 и нажимаем кнопку «Старт». По окончании тестирования в окне тестера появятся две новые вкладки «Результаты» (рис.4) и «График» (рис.5).

Рис.4 Окно Тестера стратегий «Результаты» EURUSD H3

Из результатов тестирования (рис.4) можно увидеть, что за период с начала 2000 по конец 2009 года при заданных нами параметрах, ТС принесла убыток в размере -2560,60 USD. На графике (рис.5) видно распределение прибылей и убытков во времени, что дает нам возможность анализировать результаты работы ТС в динамике. И сделать анализ ошибок системы. 

Рис.5 Окно Тестера стратегий «График» EURUSD H3

Чуть не забыл упомянуть о том, что вкладка «Результаты», по умолчанию создает простой отчет. Хотя помимо этого есть возможность просмотра сделок, ордеров и запись отчета в файл. Для этого достаточно поместить курсор мыши на вкладку, нажать правую клавишу мыши и выбрать соответствующий пункт меню.  

Рис.6 Окно Тестера стратегий «Результаты», нажатие правой клавиши мыши

Вот результат на шестичасовом периоде (H6)

Рис.7 Окно Тестера стратегий «Результаты» EURUSD H6

Для двенадцатичасового периода (H12).

Рис.8 Окно Тестера стратегий «Результаты» EURUSD H12

Очень похоже, что на такой валютной паре как EURUSD наша стратегия не эффективна. Но можно заметить, что выбор рабочего периода ощутимо влияет на результат.

Продолжим наш тест на валютной паре GBPUSD, что бы сделать окончательные выводы о работоспособности нашей ТС.

Рис.9 Окно Тестера стратегий «Результаты» GBPUSD H3

Рис.10 Окно Тестера стратегий «Результаты» GBPUSD H6

Рис.11 Окно Тестера стратегий «Результаты» GBPUSD H12 

Рис.12 Окно Тестера стратегий «График» графическое представление результата тестирования GBPUSD H12

Проанализировав результаты тестирования, мы увидим, что на такой валютной паре как GBPUSD наша система в двух случаях показала положительный результат. На двенадцати часовом периоде мы получили ощутимую прибыль 8682,70 USD, правда, за девять лет.

Кому интересно, можно протестировать другие пары. Мое предположение таково,  чем волатильнее пара, тем лучше должен быть результат и тем больший временной период нужно использовать.


Заключение

В заключение хочу, отметь, что данная Торговая Система не является «Святым Граалем» и не может быть использована в чистом виде.

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

__________________________________ 
* "Nani Desu Ka?"  - Что это? 

Прикрепленные файлы |
Vasily
Vasily | 20 май 2010 в 13:43

с блок схемами былоб прикольно.

почитаю

Dmitry Voronkov
Dmitry Voronkov | 22 май 2010 в 13:56

Поступили жалобы что эксперт не всегда работает.

 Большая просьба замените файл MQL5\Indicators\Examples\Heiken_Ashi.mq5 на файл находящийся в  Code Base по ссылке https://www.mql5.com/ru/code/33 и перекомпелируйте.

После этого все должно заработать.

И просьба к разработчикам, поправте этот файл в стандартной поставке. 

Rice
Rice | 16 окт 2015 в 19:23

Не понятна рекурсивная конструкция со ссылкой на самое себя: "haOpen=(haOpen[пред.]".

Построение мультивалютного индикатора с применением множества промежуточных индикаторных буферов Построение мультивалютного индикатора с применением множества промежуточных индикаторных буферов

В последнее время возрос интерес к кластерному анализу рынка FOREX. MQL5 открывает новые возможности исследования закономерностей движения валютных пар. Важным преимуществом MQL5, по сравнению с MQL4, является возможность использования неограниченного количества индикаторных буферов. В данной статье описан пример построения мультивалютного индикатора.

Virtual Order Manager для управления ордерами в позициях терминала MetaTrader 5 Virtual Order Manager для управления ордерами в позициях терминала MetaTrader 5

Эта библиотека классов может быть добавлена в советники, написанные для MetaTrader 5, чтобы они могли работать с ордерами в рамках подхода, реализованного в MetaTrader 4, а не в рамках позиционно-ориентированного подхода платформы MetaTrader 5. Это достигается путем отслеживания "виртуальных" ордеров в терминале MetaTrader 5, поддержки стопов, невидимых для брокера, и установкой дальних защитных реальных стопов на торговом сервере.

Алгоритм генерации тиков  в тестере стратегий терминала MetaTrader 5 Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5

MetaTrader 5 позволяет во встроенном тестере стратегий моделировать автоматическую торговлю с помощью экспертов на языке MQL5. Такое моделирование называется тестированием экспертов, и может проводиться с использованием многопоточной оптимизации и одновременно по множеству инструментов. Для проведения тщательного тестирования требуется генерировать тики на основе имеющейся минутной истории. В статье дается подробное описание алгоритма, по которому генерируются тики для исторического тестирования в клиентском терминале MetaTrader 5.

Генетические алгоритмы - это просто! Генетические алгоритмы - это просто!

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