English 中文 Español Deutsch 日本語 Português
Исследование методов свечного анализа (Часть I): Проверка существующих паттернов

Исследование методов свечного анализа (Часть I): Проверка существующих паттернов

MetaTrader 5Тестер | 5 февраля 2019, 14:20
8 238 5
Alexander Fedosov
Alexander Fedosov

Содержание

Введение

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

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

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

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


Постановка задачи

Для того чтобы оценить эффективность работы паттерна, разработаем универсальный алгоритм оценки его работы. На рис.1 представлена общая схема действий, давайте ее разберем поподробнее.


Рис.1 Алгоритм оценки работы паттерна

Шаг 1. Выбираем известную свечную модель на предмет соответствия ее трактовке и реальному результату. Для наглядности в алгоритме приведен пример в виде свечной модели Крест Харами(бычья модель) то есть ожидается восходящий тренд. 

Шаг 2. Определяемся с диапазоном исследования и таймфреймом. Тем самым можно будет определить эффективность и подтверждение исследуемого паттерна более широко. Возможно выявить какую-то закономерность от глубины исследуемой истории или найти таймфреймы где текущий паттерн будет эффективен или же будет совершенно не работать.

Шаг 3. Ищем какое количество раз встречается выбранная свечная модель на исследуемом диапазоне выборки. Это значение необходимо для совокупной оценки, о чем будет сказано чуть ниже.

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

Шаг 5. Но как же определить качество трендового движения? Ведь после определения паттерна трендовое движения может достичь заданных ранее 50 пунктов, но за какое время? За одну свечу исследуемого таймфрейма или может за 10. Поэтому тренд должен быть достаточно эффективен, потому как идентификация паттерна, а потом долгое ожидание прибыли от входа по его сигналу совершенно неоптимально и рискованно. Для этого было решено ввести оценки эффективности тренда по категориям.

  • Категория А. Тренд на заданную величину достигается за одну свечу, после обнаруженного паттерна. 
  • Категория В. Тренд на заданную величину достигается за две свечи, после обнаруженного паттерна. 
  • Категория С. Тренд на заданную величину достигается за три свечи, после обнаруженного паттерна. 

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

Шаг 6. Здесь мы подсчитываем следующие показатели:

  • Какое количество раз после обнаружения паттерна цена пошла вверх и это движение оцениваем по категориям.
  • Какое количество раз после обнаружения паттерна цена пошла вниз и это движение оцениваем по категориям.

На рис.2 представлен пример нахождения, подсчета и категоризации восходящего и нисходящего трендов из общей выборки найденных свечных моделей.

Рис.2 Алгоритм и пример нахождения трендов и их категоризация.

Итак, в данном примере из заданной выборки в 2000 свечей на часовом таймфрейме( рис.1) было найдено 50 совпадений заданного нами паттерна. После которого цена пошла вверх 20 раз, вниз 10 по оговоренному в шаге 4 критерию в 50 пунктов. Далее из 20 случаев восходящего тренда цена достигла 50 пунктов за одну свечу 5 раз, за 2 свечи 7 раз и 8 раз цене понадобилось три свечи для достижения роста в 50 пунктов.

Аналогично с нисходящим трендом. По рис.2 наглядно видно, что шанс и скорость восходящего тренда при текущем паттерне более предпочтительна. Однако не всё всегда можно определить на глазок. Можно обмануться. Тем более при исследовании какого-либо паттерна на разных выборках и таймфреймах в этой размытой оценке легко запутаться.

Поэтому было решено ввести совокупный коэффициент для общей оценки эффективности любого паттерна в заданном направлении тренда. Выглядит он следующим образом:

Где E — это эффективность тренда, а P — вероятность возникновения тренда. Рассмотрим формулу эффективности тренда:


Где A, B, С — сколько раз найденный тренд попадал в одну из категорий. k1, k2, k3 — весовые коэффициенты, так как значимость попадания в заданные категории само собой различна. Тренд категории А, когда пороговое значение достигается за одну свечу более значителен, чем когда за три. По умолчанию приоритеты были расставлены так: k1 = 1, k2 = 0.5, k3 = 0.25. Это субъективное восприятие ценности, поэтому каждый может поставить другие. S — это общее количество найденного тренда заданного типа.

Вероятность возникновения тренда Р — это отношение количества раз найденного тренда определенного типа(A,B или С)) к общему количеству найденных свечных моделей из заданной выборки. По сути — это вероятность что цена пойдет в определенном направлении на основе предыдущих действий на истории.

Итак, давайте рассчитаем эффективность для восходящего и нисходящего трендов в нашем примере из рис. 2.  

Рис.3 Результат расчета оценки эффективности.

В результате расчета были получены следующие результаты:

  • Эффективность тренда Е действительно оказалась выше у восходящего тренда, что было видно и визуально. Тем не менее мы достигли количественной оценки.
  • Вероятность возникновения тренда Р при возникновении исследуемого паттерна равна 40 % что будет восходящий тренд, 20% нисходящий.
  • Общая эффективность исследуемого паттерна при восходящем тренде оказал более чем в 2 раза выше. 

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

По сути таким образом в нашем исследовании мы сможем понять три важные вещи:

  1. Работает ли вообще исследуемый паттерн на сегодняшних рынках.
  2. Если работает, то при появлении паттерна на графике каковы наши шансы на тот исход, который он нам прогнозирует.
  3. Сколько и как быстро мы сможем на этом заработать.

 

Разработка прототипа интерфейса для анализа свечных моделей

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

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

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


Рис.3 Структура вкладки Анализ.

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

  1. Переключение между двумя вкладками Анализ и Настройки.
  2. Инструмент поиска необходимых для анализа валютных инструментов.
  3. Таблица результатов, включающая в себя Имя исследуемого паттерна, Число найденных соответствий на диапазоне выборки, Как часто он встречается в пределах исследования, Вероятности движения вверх и вниз, а также расчетный коэффициент оценки эффективности данного паттерна при восходящем и нисходящим трендах. Эта информация даст нам ответ — насколько паттерн соответствует заявленным им характером прогнозируемого движения и того, что получилось по результатам. Насколько они совпадают.
  4. Таймфрейм, на котором будут исследоваться свечные модели.
  5. Диапазон выборки. Количество свечей заданного таймфрейма, на котором будут проводиться тестирования паттернов.

Далее рассмотрим вторую вкладку Настроек. 


Рис.4 Структура вкладки Настройки.

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

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

Реализация инструмента

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

//+------------------------------------------------------------------+
//| Создаёт графический интерфейс программы                          |
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- Создание панели
   if(!CreateWindow("Pattern Analyzer"))
      return(false);
//--- Создание диалогового окна
   if(!CreateWindowSetting("Settings"))
      return(false);
//--- Завершение создания GUI
   CWndEvents::CompletedGUI();
   return(true);
  }
//+-----------------------------------------------------------------

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

  • CreateTabs() — реализует вкладки Анализ и Настройки.
  • CreateSymbolsFilter() — Поле ввода и чекбоксом для поиска нужного символа или включающего в себя часть слова поиска.
  • CreateRequest() — Кнопка при нажатии на которую происходит поиск символов.
  • CreateRange() — Поле ввода диапазона выборки.
  • CreateComboBoxTF() — Выпадающий список выбора таймфрейма на котором будет проводиться анализ.
  • CreateSymbTable() — Создает таблицу с результатами поиска символов.
  • CreateTable() — Таблица с результатами анализа свечных моделей.
  • CreateStatusBar() — Статусная строка, отображающая текущий выбранный символ для анализа или же информирующая что он не выбран.

 Этот список методов реализует графические элементы на вкладке Анализ. Чуть ниже рассмотрим методы, находящиеся на вкладке Настройки.

  • CreateCandle() — метод построения составного элемента состоящего из изображения типа свечи и кнопки со значком шестеренки(поз. 1 на рис.4). 
  • CreateTextLabel() — метод для визуализации текстовых заголовков перед группами коэффициентов(поз.3 на рис.4).
  • CreateCoef() — метод для отображения поля ввода весового коэффициента.
  • CreateThresholdValue() — метод для отображения поля ввода порогового значения прибыли в пунктах.

Далее рассмотрим структуру второго окна дополнительных настроек, реализованного методом CreateWindowSetting().

  • CreateSettingTextLabel() — метод создает динамическую текстовую метку-подсказку для того, чтобы понимать какой параметр для конкретной выбранной свечи вы изменяете.
  • CreateSettingCoef() — метод создает поле ввода для редактирования свойств выбранной свечи.
  • CreateSaveButton() — метод создает кнопку для сохранения и применения отредактированных свойств в анализе.
  • CreateCancelButton() — метод создает кнопку для отмены всех действий с параметрами выбранной свечи.

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

Рис.5 Результат создания графического интерфейса.

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

  • Длинная свеча. Тело свечи > (усредненное тело последних пяти дней)*K1, где К1 настраиваемый коэффициент( рис.4).
  • Короткая свеча. Тело свечи < (усредненное тело последних пяти дней)*K1.
  • Волчки. Нижняя тень > тело*K1  и  Верхняя тень > тело*K1.
  • Доджи. Тело доджи < (диапазон от макс. до мин. цены)*K1.
  • Марибозу. Нижняя тень < тела*K1 или Верхняя тень < тела*K1.
  • Молот. Нижняя тень > тело*K1 и Верхняя тень < тело*K2.

Теперь рассмотрим известные свечные модели( паттерны), которые будут участвовать в нашем методе анализа. Они будут состоят из двух категорий: паттерны из одной свечи и из двух.

Паттерны из одной свечи:

  • Молот (бычья модель).
  • Висельник (медвежья модель).
  • Перевернутый молот (бычья модель).

Паттерны из двух свечей:

  • Падающая звезда (медвежья модель).
  • Поглощение (бычья модель).
  • Поглощение (медвежья модель).
  • Крест Харами (бычья модель).
  • Крест Харами (медвежья модель).
  • Харами (бычья модель).
  • Харами (медвежья модель).
  • Звезда доджи (бычья модель).
  • Звезда доджи (медвежья модель).
  • Просвет в облаках (бычья модель).
  • Завеса из темных облаков (медвежья модель).

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

Сам же алгоритм выглядит следующим образом:

1. Метод CandleType() определяет базовый тип свечей.

//--- Определяем тип свечи   
   res.type=CAND_NONE;
//--- long 
   if(res.bodysize>sum*m_long_coef)
      res.type=CAND_LONG;
//--- sort 
   if(res.bodysize<sum*m_short_coef)
      res.type=CAND_SHORT;
//--- doji
   if(res.bodysize<HL*m_doji_coef)
      res.type=CAND_DOJI;
//--- maribozu
   if((shade_low<res.bodysize*m_maribozu_coef || shade_high<res.bodysize*m_maribozu_coef) && res.bodysize>0)
      res.type=CAND_MARIBOZU;
//--- hammer
   if(shade_low>res.bodysize*m_hummer_coef2 && shade_high<res.bodysize*m_hummer_coef1)
      res.type=CAND_HAMMER;
//--- invert hammer
   if(shade_low<res.bodysize*m_hummer_coef1 && shade_high>res.bodysize*m_hummer_coef2)
      res.type=CAND_INVERT_HAMMER;
//--- spinning top
   if(res.type==CAND_SHORT && shade_low>res.bodysize*m_spin_coef && shade_high>res.bodysize*m_spin_coef)
      res.type=CAND_SPIN_TOP;

2. Метод PatternType() определяет тип паттерна, исходя из данных полученных от CandleType() для исследуемой свечи или набора из двух, образующих один из оговоренных свечных моделей чуть выше.

for(int i=m_range_total;i>3;i--)
     {
      CandleType(symbol,cand2,i);                                                      // предыдущая свеча
      CandleType(symbol,cand1,i-1);                                                    // текущая свеча

      //--- Перевернутый молот бычья модель
      if(cand2.trend==DOWN &&                                                             // проверяем направление тренда
         cand2.type==CAND_INVERT_HAMMER)                                                  // проверка "перевернутый молот"
        {
         m_invert_hummer_total++;
         GetCategory(symbol,i-3,invert_hummer_coef);
        }

      //--- Висельник медвежья модель
      if(cand2.trend==UPPER &&                                                            // проверяем направление тренда
         cand2.type==CAND_HAMMER)                                                         // проверка "молот"
        {
         m_handing_man_total++;
         GetCategory(symbol,i-3,handing_man_coef);
        }
      //--- Молот бычья модель
      if(cand2.trend==DOWN &&                                                             // проверяем направление тренда
         cand2.type==CAND_HAMMER)                                                         // проверка "молот"
        {
         m_hummer_total++;
         GetCategory(symbol,i-3,hummer_coef);
        }
      //---
      //--- Падающая звезда медвежья модель
      if(cand1.trend==UPPER && cand2.trend==UPPER &&                                      // проверяем направление тренда
         cand2.type==CAND_INVERT_HAMMER && cand1.close<=cand2.open)                       // проверка "перевернутый молот"
        {
         m_shooting_star_total++;
         GetCategory(symbol,i-4,shooting_star_coef);
        }

      //--- Поглощение бычья модель
      if(cand1.trend==DOWN && cand1.bull && cand2.trend==DOWN && !cand2.bull && // проверяем направление тренда и направление свечи
         cand1.bodysize>cand2.bodysize &&
         cand1.close>=cand2.open && cand1.open<cand2.close)
        {
         m_engulfing_bull_total++;
         GetCategory(symbol,i-4,engulfing_bull_coef);
        }

      //--- Поглощение медвежья модель
      if(cand1.trend==UPPER && cand1.bull && cand2.trend==UPPER && !cand2.bull && // проверяем направление тренда и направление свечи
         cand1.bodysize<cand2.bodysize &&
         cand1.close<=cand2.open && cand1.open>cand2.close)
        {
         m_engulfing_bear_total++;
         GetCategory(symbol,i-4,engulfing_bear_coef);
        }

      //--- Крест Харами бычья модель
      if(cand2.trend==DOWN && !cand2.bull &&                                              // проверяем направление тренда и направление свечи
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // проверка "длинной" первой свечи и свечи доджи
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // доджи внутри тела первой свечи
        {
         m_harami_cross_bull_total++;
         GetCategory(symbol,i-4,harami_cross_bull_coef);
        }

      //--- Крест Харами медвежья модель
      if(cand2.trend==UPPER && cand2.bull &&                                              // проверяем направление тренда и направление свечи
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // проверка "длинной" свечи и доджи
         cand1.close>cand2.open && cand1.open<=cand2.close)                               // доджи внутри тела первой свечи 
        {
         m_harami_cross_bear_total++;
         GetCategory(symbol,i-4,harami_cross_bear_coef);
        }

      //--- Харами бычья модель
      if(cand1.trend==DOWN && cand1.bull && !cand2.bull &&                                // проверяем направление тренда и направление свечи
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU)  &&                         // проверка "длинной" первой свечи
         cand1.type!=CAND_DOJI && cand1.bodysize<cand2.bodysize &&                        // вторая свеча не доджи и тело первой свечи больше тела второй
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // тело второй свечи внутри тела первой свечи 
        {
         m_harami_bull_total++;
         GetCategory(symbol,i-4,harami_bull_coef);
        }

      //--- Харами медвежья модель
      if(cand1.trend==UPPER && !cand1.bull && cand2.bull &&                               // проверяем направление тренда и направление свечи
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) &&                          // проверка "длинной" первой свечи
         cand1.type!=CAND_DOJI && cand1.bodysize<cand2.bodysize &&                        // вторая свеча не доджи и тело первой свечи больше тела второй
         cand1.close>cand2.open && cand1.open<=cand2.close)                               // тело второй свечи внутри тела первой свечи 
        {
         m_harami_bear_total++;
         GetCategory(symbol,i-4,harami_bear_coef);
        }

      //--- Звезда доджи бычья модель
      if(cand1.trend==DOWN && !cand2.bull && // проверяем направление тренда и направление свечи
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // проверка 1 "длинной" свечи и 2 доджи
         cand1.close<=cand2.open)                                                         // открытие доджи ниже равно закрытию первой свечи 
        {
         m_doji_star_bull_total++;
         GetCategory(symbol,i-4,doji_star_bull_coef);
        }

      //--- Звезда доджи медвежья модель
      if(cand1.trend==UPPER && cand2.bull && // проверяем направление тренда и направление свечи
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // проверка 1 "длинной" свечи и 2 доджи
         cand1.open>=cand2.close)                                                         //открытие доджи выше равно закрытию первой свечи
        {
         m_doji_star_bear_total++;
         GetCategory(symbol,i-4,doji_star_bear_coef);
        }

      //--- Просвет в облаках бычья модель
      if(cand1.trend==DOWN && cand1.bull && !cand2.bull && // проверяем направление тренда и направление свечи
         (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && // проверка "длинной" свечи
         cand1.close>(cand2.close+cand2.open)/2 && // закрытие второй выше середины первой
         cand2.open>cand1.close && cand2.close>=cand1.open)
        {
         m_piercing_line_total++;
         GetCategory(symbol,i-4,piercing_line_coef);
        }

      //--- Завеса из темных облаков медвежья модель
      if(cand1.trend==UPPER && !cand1.bull && cand2.bull && // проверяем направление тренда и направление свечи
         (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && // проверка "длинной" свечи
         cand1.close<(cand2.close+cand2.open)/2 && // close 2 ниже середины тела 1
         cand1.close<cand2.open && cand2.close<=cand1.open)
        {
         m_dark_cloud_cover_total++;
         GetCategory(symbol,i-4,dark_cloud_cover_coef);
        }
     }

3. Как видно из листинга выше, при идентификации одного из заданных паттернов идет проверка на истории методом GetCategory(), а именно — в каком направлении пошла цена после появления сигнала. То есть для каждого найденного паттерна определяются категории движения цены как это описано на рис.1.

//+------------------------------------------------------------------+
//| Определение категорий прибыли                                    |
//+------------------------------------------------------------------+
bool CProgram::GetCategory(const string symbol,const int shift,int &category[])
  {
   MqlRates rt[];
   int copied=CopyRates(symbol,m_timeframe,shift,4,rt);
   int rating=0;
//--- Получаем данные предыдущих свечей
   if(copied<4)
      return(false);
   double high1,high2,high3,low1,low2,low3,close0,point;
   close0=rt[0].close;
   high1=rt[1].high;
   high2=rt[2].high;
   high3=rt[3].high;
   low1=rt[1].low;
   low2=rt[2].low;
   low3=rt[3].low;
   if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point))
      return(false);

//--- Проверка на Uptrend
   if((int)((high1-close0)/point)>=m_threshold_value)
     {
      category[0]++;
     }
   else if((int)((high2-close0)/point)>=m_threshold_value)
     {
      category[1]++;
     }
   else if((int)((high3-close0)/point)>=m_threshold_value)
     {
      category[2]++;
     }

//--- Проверка на Downtrend

   if((int)((close0-low1)/point)>=m_threshold_value)
     {
      category[3]++;
     }
   else if((int)((close0-low2)/point)>=m_threshold_value)
     {
      category[4]++;
     }
   else if((int)((close0-low3)/point)>=m_threshold_value)
     {
      category[5]++;
     }
   return(true);
  }

4. После определения категорий и подсчета " сколько раз и в каком направлении двигалась цена после обнаружения паттерна" производится расчет таких параметров как Встречаемость, Вероятность движения вверх и вниз, а также коэффициент оценки эффективности исследуемого паттерна как для восходящего тренда, так и для нисходящего. Этим занимается метод CoefCalculation().

//+------------------------------------------------------------------+
//| Расчет коэффициентов оценки эффективности                        |
//+------------------------------------------------------------------+
bool CProgram::CoefCalculation(const int row,int &category[],int found)
  {
   double p1,p2,k1,k2;
   int sum1=0,sum2=0;
   for(int i=0;i<3;i++)
     {
      sum1+=category[i];
      sum2+=category[i+3];
     }
//---
   p1=(found>0)?NormalizeDouble((double)sum1/found*100,2):0;
   p2=(found>0)?NormalizeDouble((double)sum2/found*100,2):0;
   k1=(found>0)?NormalizeDouble((m_k1*category[0]+m_k2*category[1]+m_k3*category[2])/found,3):0;
   k2=(found>0)?NormalizeDouble((m_k1*category[3]+m_k2*category[4]+m_k3*category[5])/found,3):0;

   m_table.SetValue(3,row,(string)p1,2);
   m_table.SetValue(4,row,(string)p2,2);
   m_table.SetValue(5,row,(string)k1,2);
   m_table.SetValue(6,row,(string)k2,2);
//--- Обновить таблицу
   m_table.Update(true);
   m_table.GetScrollVPointer().Update(true);
   m_table.GetScrollHPointer().Update(true);
   return(true);
  }

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


Результаты исследования

Для исследования свечных моделей возьмем набор символов из категории forex.major в терминале MetaTrader 5. Чтобы не вводить их все через запятую, было решено добавить специальное слово, которое выдавало бы нам этот список. Поэтому при вводе слова Major, будут отображен нужный набор как показано на рис.6.

Рис.6 Быстрый выбор набора символов major.

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

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

Итак, первый набор параметров отличных от дефолтных:

  • Набор Major.
  • Таймфрейм М15.
  • Пороговое значение прибыли 100 пунктов (для 5-значных котировок).

Результаты тестирования всех семи пар представлены на рис.7 чуть ниже.

Рис.7 Результаты анализа на таймфрейме М15.

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

Рис.8 Результат анализа на валютной паре EURUSD.

Итак, Первый паттерн это Hammer (Молот), и его модель подразумевает движение вверх. В установленных нами условиях в 30% случаях это так и происходит, в 10% происходит движение вниз. При этом не стоит забывать, что движение происходит минимум на определенный нами порог прибыли в 100 пунктов. Учитывая то, что на исторической выборке в более чем трети случаев его появления все таки показывает движение вверх, можно предположить что он подтверждает гипотезу о том, что эта свечная модель сигнализирует о восходящем тренде.

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

Возьмем теперь Engulfing Bear (Поглощение, медвежья модель). Считается, что он сигнализирует о нисходящем тренде и стоит выбрать короткую позицию. Однако, результат показывает, что в данных условиях свечная модель в большинстве случаев ведет себя совершенно иначе: в 20% случаев после появления паттерна цена шла вверх минимум на 100 пунктов, когда как вниз на такое количество пунктов она шла лишь в 9% случаев, более чем в два раза меньше. Здесь наблюдения показывают, что в заданных условиях он ведет себя обратным образом, чем ему положено.

Третьим возьмем свечную модель Harami Bull (Харами, бычья модель). Как видно из названия и зеленой метки, эта модель говорит о сигнале на покупку. Но здесь наблюдается почти равное число движений в обе стороны 17% против 19%. Можно ли сказать что такая модель показывает какой-то  определенный сигнал? Большие сомнения, так как тут нет какого либо выраженного преимущества ни в одну из сторон. Поэтому в данной ситуации следовало было воздержаться использовать этот паттерн для торговли на 15-минутном таймфрейме валютной пары EURUSD.


Выводы

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


Заключение

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

Программы, используемые в статье:

#
 Имя
Тип
Описание
1
PatternAnalyzer.mq5 Графический интерфейс
 Панель инструментов для анализа свечной модели.
2 MainWindow.mqh Библиотека  Библиотека построения графического интерфейса
3 Program.mqh Библиотека  Библиотека методов создания элементов интерфейса и расчетной части


Прикрепленные файлы |
MQL5.zip (453.09 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (5)
Yury Kirillov
Yury Kirillov | 6 февр. 2019 в 05:30
Свечной анализ появился более 20 лет назад

И даже наверное более 200 лет назад...

Aleksey Mavrin
Aleksey Mavrin | 14 нояб. 2019 в 21:38
Давно хотел прочитать эти статьи, т.к. по названию интересно что за работа проделана, и вот нашел время, но после первого абзаца я повергнут в шок, неужели действительно можно написать кучу кода и три статьи на известном сайте, настолько не вникая собственно в тему. Какие 20 лет, о Господи!? Статьи никто не читает чтоли, ну редактура вы бы хоть подсказали. Автор, не в обиду, я дочитаю вдруг я не прав, но на мое мнение нельзя построить дом, не зная из чего состоит кирпич.
Aleksey Mavrin
Aleksey Mavrin | 14 нояб. 2019 в 22:27
Дочитал. Меня прямо распирает от возмущения! Вы серьезно? Ещё и платный продукт выложили на основе "вот этого"!? Куда катится мир... Может все остальное тут не сильно лучше конечно, но я ожидал гораздо большего (хотя бы учесть основы матчасти), тем более видно что возможность у вас есть, и ещё не поздно взять и переделать всё по уму.
Maxim Kuznetsov
Maxim Kuznetsov | 14 нояб. 2019 в 22:41
Aleksey Mavrin:
Дочитал. Меня прямо распирает от возмущения! Вы серьезно? Ещё и платный продукт выложили на основе "вот этого"!? Куда катится мир... Может все остальное тут не сильно лучше конечно, но я ожидал гораздо большего (хотя бы учесть основы матчасти), тем более видно что возможность у вас есть, и ещё не поздно взять и переделать всё по уму.

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

На самом деле в статье показана попытка что-то там стат-исследовать средствами MQL:-) А отнюдь не оценка самих свечек,моделей их частоты и правомерности

и автор принципе молодец - не перебрал с цитатами своего-же кода, всё в общем по делу.

Aleksey Mavrin
Aleksey Mavrin | 20 нояб. 2019 в 23:29
Maxim Kuznetsov:

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

На самом деле в статье показана попытка что-то там стат-исследовать средствами MQL:-) А отнюдь не оценка самих свечек,моделей их частоты и правомерности

и автор принципе молодец - не перебрал с цитатами своего-же кода, всё в общем по делу.

Ну вот Вы понимаете что там отнюдь, а что попытка, но статью читают и новички, и статья называется 

 "Исследование методов свечного анализа (Часть I): Проверка существующих паттернов"


Но по факту таковой не является, проверка существующих паттернов не проводится, и что там исследуется непонятно,

но зато понятно что автору было лень читать основополагающие материалы по теме свечного анализа,

уж видимо очень хотелось быстрее статьи для рейтинга накидать и в маркет что-нибудь выложить.

Если автор читает, то не в обиду, может задумается что если делать то делать нормально, а не чтоб плевались.

При этом ведь труд проделан, надеюсь кому-то он не мартышкин)  и разумное звено в коде есть, но поскольку я вижу такие очевидные серьёзные ляпы,

то мне этот код ни к чему, мало-ли что там автор ещё напортачил, надёжнее и правильнее самому написать. А новички, думающие что на таком серьезном сайте только серьезный материал,

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

Создание графических интерфейсов для экспертов и индикаторов на базе .Net Framework и C# Создание графических интерфейсов для экспертов и индикаторов на базе .Net Framework и C#
Простой и быстрый способ создания графических окон при помощи редактора Visual Studio с последующей интеграцией в код MQL советника. Статья расчитана на широкий круг читателей, и не требует каких-либо познаний в C# и технологии .Net.
Утилита для отбора и навигации на MQL5 и MQL4: добавляем автоматичекий поиск паттернов с показом найденных символов Утилита для отбора и навигации на MQL5 и MQL4: добавляем автоматичекий поиск паттернов с показом найденных символов
В данной статье мы продолжим расширять возможности утилиты для отбора и навигации по инструментам. На этот раз мы создадим новые вкладки, при открытии которых будут отображаться только те символы, которые удовлетворяют тем или иным нашим параметрам. А также научимся легко добавлять в нее свои собственные вкладки с нужными нам правилами фильтрации.
ZigZag всему голова (Часть II):  Примеры получения, обработки и отображения данных ZigZag всему голова (Часть II): Примеры получения, обработки и отображения данных
В первой части был описан модифицированный индикатор ZigZag и класс для получения данных индикаторов такого типа. Теперь мы покажем как создать индикаторы на основе этих инструментов, а также напишем эксперта для тестов, который будет заключать сделки по сигналам, формируемым индикатором ZigZag. В качестве дополнения в этой статье будет представлена новая версия библиотеки для создания графических интерфейсов EasyAndFast.
ZigZag всему голова (Часть I): Разработка базового класса индикатора ZigZag всему голова (Часть I): Разработка базового класса индикатора
Многие исследователи не уделяют должного внимания определению характера поведения цены. При этом используются сложные методы, которые очень часто являются просто «чёрными ящиками», такие как: машинное обучение или нейронные сети. В таких случаях самым важным является такой — «Какие данные подать на вход для обучения той или иной модели?»