Скачать MetaTrader 5

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

18 августа 2009, 07:24
Evgeniy Logunov
25
5 745

Введение

Японские свечи - один из способов отображения информации о ценах за определенный период, показывающий соотношения между ценами открытия, закрытия, максимума и минимума. В основном свечи применяются в техническом анализе и интерпретируются в соответствии с широко известными моделями.

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

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

Внимание! Прилагаемые к статье советники предназначены только для работы в тестере.

В первом методе предполагается, что направление следующей свечи совпадёт с направлением предыдущей. Во втором - что направление следующей свечи будет противоположным направлению предыдущей. Преимущество этих методов - в их простоте. Они будут рассмотрены в разделе "Наивные методы".

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


Исходные данные для прогнозирования

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

Направлением свечи назовём величину, характеризующую знак разности цен её открытия и закрытия. Тогда направление любой свечи можно представить одним из трёх значений - "вверх", "вниз" и "отсутствие движения".

Доступ к информации о ценах открытия и закрытия свечи возможен через массивы Open и Close, соответственно. В качестве индекса в этих массивах используется смещение - номер свечи, отсчитываемый от правого края графика, начиная с нуля. Т.е. текущая свеча имеет нулевое смещение, а ей предшествующая - единичное смещение.

// получение направления свечи
double GetCandleDirection(int shift) {
   double diff=Close[shift]-Open[shift];
   if (diff>0.0) {
      return (DIRECTION_UP);
   }
   else if (diff<0.0) {
      return (DIRECTION_DOWN);
   }
   else /*if (diff==0.0)*/ {
      return (DIRECTION_NONE);
   }
}

В функцию передаётся смещение свечи (shift). Функция вычисляет разность цен её открытия и закрытия, после чего в зависимости от знака полученного числа возвращает значение одной из трёх констант - DIRECTION_UP, DIRECTION_DOWN или DIRECTION_NONE. Эти константы обозначают случаи "направление вверх", "направление вниз" и "отсутствие движения", соответственно.

Следует подчеркнуть, что все рассматриваемые методы прогнозирования предусматривают один особый случай - если направление предыдущей свечи не определено (вызов GetCandleDirection(1) вернул значение DIRECTION_NONE) - в качестве прогноза следующей свечи будет возвращено также неопределённое направление. В таком случае, советники, написанные для тестирования методов, не совершали вход в рынок.

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

// определения возможных направлений свечей
#define DIRECTION_NONE 0
#define DIRECTION_UP 1
#define DIRECTION_DOWN -1

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


Направления свечей - поведение во времени.

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

Теперь перейдём к рассмотрению и детальному анализу предлагаемых методов.


Наивные методы

Начнём с рассмотрения первых двух методов:

  1. Направление следующей свечи совпадёт с направлением предыдущей.
  2. Направление следующей свечи будет противоположным направлению предыдущей.

Для проверки эффективности обоих методов написан советник (файл CandlePredTest_naive.mq4 в прилагаемом архиве) и проведено его тестирование.

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

// предсказание по используемой модели
int ModelPredict() {
   if (modelState==STATE_NORMAL) {
      return (GetCandleDirection(1));
   }
   else /*if (modelState==STATE_REVERSE)*/ {
      return (-GetCandleDirection(1));
   }
}

Функция реализует два метода прогнозирования. Выбор происходит в зависимости от значения переменной modelState.

В случае, когда переменная modelState принимает значение STATE_NORMAL - прогнозирование выполняется в соответствии с первым методом: функция запрашивает направление предыдущей свечи при помощи вызова GetCandleDirection(1) и возвращает его в качестве направления следующей свечи.

Второй метод прогнозирования используется, если переменная modelState равна STATE_REVERSE. Предполагаемое в таком случае вычисление противоположного направления осуществляется сменой знака, т.е. функция ModelPredict возвращает значение -GetCandleDirection(1).

В функции ModelPredict не используется явное сравнение с константой STATE_REVERSE, соответствующей второму методу. В коде советника предполагается, что введённые пользователем данные всегда корректны и переменная modelState всегда принимает одно из двух значений - STATE_NORMAL или STATE_REVERSE. Для осуществления явного сравнения нужно убрать скобки комментария "/*" и "*/" из тела функции, тем самым добавив в код ещё один условный оператор if.

Переменная modelState отсутствует в списке параметров советника, однако её значение при старте советника копируется из внешней переменной initialModelState:

// состояние модели
extern int initialModelState=STATE_NORMAL;

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

// определения состояний модели
#define STATE_NORMAL 0
#define STATE_REVERSE 1

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

Для тестирования советника приняты следующие условия:

  • Объём позиций - 0.1 лот.
  • Начальный депозит - $10000.
  • Периоды - все доступные.
  • Режимы работы - STATE_NORMAL, STATE_REVERSE.
  • Промежуток тестирования - вся доступная история.
  • Инструменты:

    1. USDCHF
    2. GBPUSD
    3. EURUSD
    4. USDJPY
    5. AUDUSD
    6. USDCAD
    7. EURGBP
    8. EURCHF
    9. EURJPY
    10. GBPJPY
    11. GBPCHF
    12. EURAUD

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

В следующих двух таблицах приведены результаты тестирования советника в режиме STATE_NORMAL (первый метод).

Чистая прибыль:


M1 M5 M15 M30 H1 H4 D1
USDCHF -9902 -9900 -9903 -9907 -9901 -9900 -9927
GBPUSD -9868 -9864 -9869 -9887 -9873 -9868 -9924
EURUSD -9921 -9957 -9949 -9941 -9934 -9910 -9879
USDJPY -9900 -9905 -9900 -9905 -9935 -9926 -9904
AUDUSD -9952 -9957 -9966 -9962 -9961 -9956 -10000
USDCAD -9901 -9903 -9901 -9900 -9902 -9904 -8272
EURGBP -9862 -9861 -9864 -9869 -9875 -9871 -5747
EURCHF -9862 -9865 -9865 -9874 -9869 -9862 -5750
EURJPY -9866 -9877 -9964 -9877 -9869 -9867 -10000
GBPJPY -9848 -9841 -9840 -9845 -9848 -9870 -9849
GBPCHF -9891 -9885 -9850 -9844 -9857 -9856 -9891
EURAUD -9865 -9863 -9868 -9874 -9861 -9891 -10000


Процент прибыльных сделок:


M1 M5 M15 M30 H1 H4 D1
USDCHF 19.55 27.82 31.50 38.18 39.86 43.29 43.95
GBPUSD 21.18 27.81 30.29 33.81 35.20 41.39 46.71
EURUSD 26.06 33.20 34.59 37.55 41.64 43.73 44.37
USDJPY 19.28 31.68 34.13 35.48 39.04 42.99 46.85
AUDUSD 19.71 21.30 26.25 27.20 33.15 39.96 44.69
USDCAD 21.88 25.13 27.59 31.79 33.07 39.48 46.40
EURGBP 21.78 28.90 31.49 34.55 35.24 42.11 47.04
EURCHF 28.70 27.86 27.85 31.13 32.90 39.08 47.65
EURJPY 23.69 30.62 35.81 38.89 39.06 44.04 48.16
GBPJPY 10.11 19.47 33.48 37.39 37.75 43.09 47.42
GBPCHF 23.17 23.95 30.84 33.50 36.03 42.43 47.90
EURAUD 1.65 7.35 16.55 22.24 27.65 36.11 44.64

Тестирование первого метода показало неудовлетворительные результаты. По всем инструментам независимо от периода происходит слив депозита; при этом количество прибыльных сделок возрастает с увеличением периода, но не превышает 50%.

В следующих двух таблицах приведены результаты тестирования советника в режиме STATE_REVERSE (второй метод).

Чистая прибыль:


M1 M5 M15 M30 H1 H4 D1
USDCHF -9900 -9912 -9902 -9917 -9915 -9901 +83
GBPUSD -9864 -9866 -9869 -9874 -9870 -9911 -5565
EURUSD -9920 -9917 -9923 -9947 -9922 -9886 +4249
USDJPY -9906 -9901 -9906 -9900 -9900 -9928 +2003
AUDUSD -9955 -9956 -9957 -9956 -9969 -9947 +1203
USDCAD -9900 -9900 -9900 -9900 -9901 -9906 -3129
EURGBP -9868 -9862 -9862 -9863 -9867 -9902 -9867
EURCHF -9863 -9861 -9863 -9862 -9869 -9869 -6556
EURJPY -9861 -9864 -9866 -9868 -9897 -9886 -10000
GBPJPY -9850 -9887 -9905 -9857 -9969 -9848 -9964
GBPCHF -9846 -9841 -9842 -9842 -9886 -9914 -9850
EURAUD -9870 -9866 -9874 -9910 -9872 -9872 -2411


Процент прибыльных сделок:


M1 M5 M15 M30 H1 H4 D1
USDCHF 18.38 27.41 33.76 37.46 42.28 46.71 52.15
GBPUSD 18.59 27.71 34.07 39.01 43.79 47.33 49.39
EURUSD 23.37 33.88 41.05 43.80 43.56 48.16 52.56
USDJPY 16.88 30.39 38.13 40.29 43.94 46.62 49.34
AUDUSD 18.84 22.52 25.39 29.83 36.36 43.51 49.84
USDCAD 22.44 24.04 27.07 31.06 35.69 43.51 49.84
EURGBP 20.52 28.89 35.18 38.82 42.41 45.82 45.55
EURCHF 27.43 31.82 32.80 35.05 36.74 43.89 46.04
EURJPY 18.79 28.15 37.09 39.80 43.05 44.15 46.92
GBPJPY 10.02 19.76 31.92 38.06 41.84 44.32 47.53
GBPCHF 19.87 27.24 33.72 35.70 39.74 47.59 46.11
EURAUD 1.43 7.66 17.24 26.95 34.46 41.29 47.07

Тестирование второго метода показало неоднозначные результаты. На всех периодах меньше D1 результаты примерно совпали с результатами, полученными для первого метода. На периоде D1 советник на четырёх инструментах из двенадцати получил прибыль; при этом количество прибыльных сделок близко к 50%, а в двух случаях достигает 52%.

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


Адаптивный метод

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

Эффективность этого метода проверялась при помощи тестирования советника (файл CandlePredTest_adaptive.mq4 в прилагаемом архиве).

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

// рабочая функция советника
int start() {
   // открытие позиций выполняется один раз на каждом баре
   if (!IsNewBar()) {
      return (0);
   }
   // закрываем все открытые позиции
   TradeClosePositions(DIRECTION_UP);
   TradeClosePositions(DIRECTION_DOWN);
   // обновляем состояние модели
   if (prediction!=DIRECTION_NONE) {
      ModelUpdate(prediction==GetCandleDirection(1));
   }
   // предсказываем цвет следующей свечи
   prediction=ModelPredict();
   if (prediction==DIRECTION_NONE) {
      return (0);
   }
   // открываем позицию в нужном направлении
   TradeOpenPosition(prediction,"");
   return (0);
}

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

Замену одного наивного метода прогнозирования другим осуществляет функция ModelUpdate, которой в качестве параметра передаётся флаг корректности прогноза (prediction==GetCandleDirection(1)).

// обновление состояния модели
void ModelUpdate(bool correct) {
   // если прогноз был ошибочным - изменить состояние модели
   if (!correct) {
      if (modelState==STATE_NORMAL) {
         modelState=STATE_REVERSE;
      }
      else /*if (modelState==STATE_REVERSE)*/ {
         modelState=STATE_NORMAL;
      }
   }
}

Функция анализирует флаг корректности прогноза (correct) и в случае обнаружения ошибки заменяет выбранный наивный метод прогнозирования при помощи изменения значения переменной modelState. Начальное значение переменной modelState при инициализации копируется из переменной initialModelState. Оно не является существенным, т.к. советник сам изменяет способ прогнозирования во время работы.

Прогнозирование осуществляется функцией ModelPredict, аналогичной использованной в советнике CandlePredTest_naive. Изменения значения переменной modelState в ходе работы приводят к тому, что прогноз выполняется то по первому методу, то по второму.

Тестирование советника проводилось в тех же условиях. Исключение составляет выбор значения переменной initialModelState, которое было фиксированным (STATE_NORMAL).

Чистая прибыль:


M1 M5 M15 M30 H1 H4 D1
USDCHF -9903 -9905 -9902 -9915 -9902 -9907 -3738
GBPUSD -9866 -9875 -9876 -9864 -9867 -9933 -6404
EURUSD -9924 -9924 -9931 -9920 -9920 -9903 -3779
USDJPY -9904 -9900 -9900 -9904 -9920 -9902 -6493
AUDUSD -9955 -9954 -9955 -9995 -9955 -9965 -8649
USDCAD -9903 -9902 -9901 -9911 -9900 -9904 -1525
EURGBP -9861 -9867 -9865 -9862 -9881 -9877 -9913
EURCHF -9861 -9862 -9872 -9881 -9870 -9875 -9258
EURJPY -9861 -9865 -9866 -9868 -9876 -9905 -9880
GBPJPY -9842 -9844 -9867 -9840 -9919 -10000 -9933
GBPCHF -9841 -9843 -9917 -9840 -9893 -9848 -9895
EURAUD -9866 -9869 -9863 -9872 -9867 -9904 -7656


Процент прибыльных сделок:


M1 M5 M15 M30 H1 H4 D1
USDCHF 19.22 26.82 32.29 35.71 40.29 44.15 47.93
GBPUSD 20.12 28.16 32.01 34.87 40.05 41.97 49.39
EURUSD 25.24 32.65 38.32 39.48 41.50 45.81 48.88
USDJPY 19.16 29.48 35.02 37.03 40.19 44.45 47.34
AUDUSD 19.63 21.67 25.76 28.16 32.11 41.11 46.76
USDCAD 22.84 24.46 27.39 29.79 34.44 42.26 48.46
EURGBP 21.44 29.45 33.05 36.55 38.19 41.86 46.23
EURCHF 27.51 29.98 30.92 34.44 34.09 40.87 44.27
EURJPY 21.24 28.56 35.58 38.78 40.50 44.23 47.12
GBPJPY 11.30 19.90 31.91 37.15 36.76 41.11 46.24
GBPCHF 22.00 26.81 32.13 34.38 36.99 43.11 47.16
EURAUD 1.50 6.56 15.14 22.25 31.63 37.96 47.70

Тестирование не показало заметных улучшений результатов по сравнению с первым и вторым методами. Прибыль по всем инструментам на всех периодах оказалась отрицательной, а количество прибыльных сделок не превышало 50%.


Заключение

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

  • Первый метод оказался чрезвычайно неэффективным. Очевидно, предположение о совпадении направления следующей свечи с направлением предыдущей нуждается в дополнительном подтверждении при прогнозировании.
  • Второй показал наилучшие результаты среди рассмотренных методов, однако нуждается в более тщательном анализе. Например, интересными могут оказаться данные о количестве сделок, прибыль в которых не была зафиксирована.
  • Третий метод показал средние результаты по сравнению с первым и вторым методами, поэтому он нуждается в доработке. Главной идеей при его создании являлось улучшение характеристик по сравнению с характеристиками используемых наивных методов. Однако улучшений не выявлено. Вероятно, метод слишком часто заменяет способ прогнозирования, что приводит к дополнительным ошибкам.
Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (25)
MQL4 Comments
MQL4 Comments | 24 дек 2009 в 10:25
Автору большое спасибо за статью. От себя скажу, что на центовом счету гонял похожую стратегию по фунту около 2х месяцев. Открывался в 12.00 по Киеву в направлении предыдущей свечи, если ее тело было более 25-35п. Закрывался около 14.00-15.30 т.е. перед началом Америки и новостей. SL около 40-50 п. ТР100п. В результате получилось около +150п. Понимаю конечно, что два месяца это мало для выводов, но больше не выдержал, поэтому и не использую данную стратегию. Хочу сказать, что статья дает отправную точку, а дальше вы сами должны довести стратегию под себя и под рынок (не путать оптимизировать под себя). Например, если Вы берете Н4 по Фунту, то ночные свечи необходимо пропускать, потому как на Азии отслеживать какие-нибудь закономерности по европейским валютам сложно, да и торговать круглые сутки нереально. Также надо вести анализ свечей. Как я понял мы считаем свечу бычьей, даже если ее тело 2-3п., а это может быть крутая доджи и по такой свечке дальнейшее направление определить тяжело. Мы хоть как-то должны сделать перевес в свою сторону, тем же отношением SL\TP или допустим фильтром тренда. А так автор прав, в сыром виде стратегия дает 50/50 минус спрэд=слив.
MQL4 Comments
MQL4 Comments | 27 апр 2010 в 12:39
если сливает то может открыватся в обратную сторону!
MQL4 Comments
MQL4 Comments | 24 дек 2010 в 12:55

Добрый день. Не понимаю, почему так критикуют автора статьи, ну да, он показал, как НЕ надо пытаться торговать, а что, Вы хотите сказать, что это не результат? Так это результат покруче тысяч "якобы прибыльных" супер-систем, публикуемых на просторах рунета. И почему эти результаты тестирования вдруг очевидны БЕЗ тестирования? Для меня например были бы не очевидны. Мне когда-то казалось что раз "тренд ё френд", значит бычья свеча скорее сменится бычьей, чем медвежьей. Не намного, может 60/40 или 55/45, а автор наглядно показал что это не так. Автору РЕСПЕКТ!

Andrey Shpilev
Andrey Shpilev | 12 фев 2011 в 20:25
alexey15:

... Мне когда-то казалось что раз "тренд ё френд", значит бычья свеча скорее сменится бычьей, чем медвежьей. Не намного, может 60/40 или 55/45, а автор наглядно показал что это не так. Автору РЕСПЕКТ!

Слово "тренд" в статье не встречается вообще. И автор ничего не показал, это все ваша фантазия... Единственное, что можно вынести из статьи: "всегда верьте своим глазам", и если на рисунке индикатор наглядно демонстрирует, что выбранная стратегия -- кал, конфета из нее выйдет, мягко говоря, невкусная.

Автор странный какой-то. :D

Chiripaha
Chiripaha | 30 дек 2015 в 06:08

: )))))) Оч. любопытно было прочитать и статью и комментарии к ней.

Хочется обратить внимание писавших коменты - а чем вы отличаетесь от автора? Я потратил на прочтение ваших коллективных трудов не меньше времени, а извлек "пользы" не больше чем вы из статьи. Сами научитесь говорить по делу, чтобы не отнимать время других читающих.

Кто-то, получив кучу ***, будет плеваться, затыкать нос и пытаться отмыться. А кто-то сделает из него удобрение и получит хороший урожай.
На рынке лишь 1-3% находят для себя возможность, остальные ~98% будут бегать и гнобить кого не лень. Поэтому совершенно не удивительна реакция большинства (98-ми процентов) на публикацию. Это нормально, пусть автор не запаривается кучей негатива. Мне статья понравилась - я нашел для себя новые идеи и подходы.
Если кто знает различие между "от кутюр" и "прет-а-порте́", тот никогда не будет, как я в молодости, глядя на показы мод, выёживаться: "Да разве можно это всё носить! Зачем они это всё показывают?!" и т.д. и т.п. Это лишь подчеркнет глупость и недалёкость кричащего. Есть уже серийная вещь, а есть концепткар (в этом разница "от кутюр" и "прет-а-порте́"). Здесь показана концепция для тех, кто может в ней увидеть полёт мысли, направление разработки, подход и т.п. Не переживайте, большинству это не грозит. : )) И уж извините, что вам не дали готовый шмот колбасы в виде зарабатывающей на любом промежутке времени МТС.
Советник для торговли в канале Советник для торговли в канале

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

СМС-извещения о состоянии Советника СМС-извещения о состоянии Советника

Организация системы СМС-извещений о статусе торгового Советника, чтобы удаленно всегда знать о критических ситуациях

Торговля в ночное время – насколько надежна? Торговля в ночное время – насколько надежна?

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

Защищайтесь, господа разработчики! Защищайтесь, господа разработчики!

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