Торговые идеи на основе направления и скорости движения цен

Alexander Fedosov | 17 апреля, 2015

Введение

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


Начало движения и инерция

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

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

Когда же настают перемены, тренд завершается. Почему же движение еще некоторое время продолжается, а не резко меняется? Это происходит из-за того, что те, кто разгонял и толкал цену в нужном им направлении, уже закрывают свои позиции и тормозят тренд, а те, кто лишь "ловил волну", продолжают верить, что ничего не изменилось и даже пытаются сами двигать цену. Но тут "поезд" не только останавливается, но и начинает двигаться в противоположном направлении, и для них все заканчивается.


Торговая идея и как не попасть под "поезд"

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

Для наглядности примера используем стандартные индикаторы: осциллятор Индекс Относительной силы RSI (Relative Strength Index) и индикатор Ускорения/Замедления AC (Acceleration/Deceleration).

1. Условия для входа в рынок

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

Для этого будут установлены уровни, которые помогут это определить:

Рис. 1. Уровни осциллятора RSI

Рис. 1. Уровни осциллятора RSI

Критерии оценки глубины движения цены:

Зоны движения цены на покупку:

Аналогично проиндексируем цены на продажу:

На языке MQL4 данное условие опишем следующим образом:

//--- определение индекса на покупку
   double rsi=iRSI(Symbol(),tf,period,PRICE_CLOSE,0);
   index_rsi = 0;
   if(rsi>90.0) index_rsi=4;
   else if( rsi > 80.0 ) 
   index_rsi = 3;
   else if( rsi > 70.0 ) 
   index_rsi = 2;
   else if( rsi > 60.0 ) 
   index_rsi = 1;
   else if( rsi < 10.0 ) 
   index_rsi = -4;
   else if( rsi < 20.0 ) 
   index_rsi = -3;
   else if( rsi < 30.0 ) 
   index_rsi = -2;
   else if( rsi < 40.0 ) 
   index_rsi = -1;

Индикатор Ускорения/Замедления AC Билла Уильямса будем использовать по прямому назначению, а именно, измерять скорость и ускорение текущего движения.

Рис. 2. Индикатор AC

Рис. 2. Индикатор AC

Критерии оценки скорости:

Рост на повышение.

Рост на понижение.

На языке MQL4 это будет выглядеть так:

double ac[];
   ArrayResize(ac,5);
   for(int i=0; i<5; i++)
      ac[i]=iAC(Symbol(),tf,i);

   index_ac=0;
//--- сигнал на покупку
   if(ac[0]>ac[1])
      index_ac=1;
   else if(ac[0]>ac[1] && ac[1]>ac[2])
      index_ac=2;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3])
      index_ac=3;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3] && ac[3]>ac[4])
      index_ac=4;
//--- сигнал на продажу
   else if(ac[0]<ac[1])
      index_ac=-1;
   else if(ac[0]<ac[1] && ac[1]<ac[2])
      index_ac=-2;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3])
      index_ac=-3;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3] && ac[3]<ac[4])
      index_ac=-4;

Имея индексы глубины движения, а также его скорость, можно сформулировать некоторые условия для входа, а также их классифицировать.

Вот варианты для входа в рынок:

//--- сигнал на покупку
if(index_rsi==1 && index_ac>=1) //возможное движение на покупку
if(index_rsi==2 && index_ac>=1) //слабое движение на покупку
if(index_rsi==3 && index_ac==1) //слабое движение на покупку
if(index_rsi==3 && index_ac>=2) //умеренное движение на покупку
if(index_rsi==4 && index_ac>=1) //сильное движение на покупку

//--- сигнал на продажу  
if(index_rsi==-1 && index_ac<=-1) //возможное движение на продажу
if(index_rsi==-2 && index_ac<=-1) //слабое движение на продажу
if(index_rsi==-3 && index_ac==-1) //слабое движение на продажу
if(index_rsi==-3 && index_ac<=-2) //умеренное движение на продажу
if(index_rsi==-4 && index_ac<=-1) //сильное движение на продажу

//--- флэт 
if(index_rsi==0) 


2. Условия для выхода из рынка

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

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

А теперь давайте разберем, что есть что в этом примере:

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

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

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

Ранее мы рассмотрели критерии оценки глубины движения цены и оценки скорости.

Определим условия выхода:

//--- возможный разворот вниз
if(index_rsi>2 && index_ac<0) 

Если цена шла достаточно долго шла вверх, и ее ускорение становится отрицательным (в сторону понижения), это говорит о том, что возможна смена тенденции.

//--- возможный разворот вверх
if(index_rsi<-2 && index_ac>0) 

По аналогии с приведенным выше примером: мяч достаточно долго падал, но попал в воду, и она его выталкивает в противоположном направлении. Значит, пора закрывать позиции.


3. Увеличение эффективности входа и выхода

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

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

Рис. 3. Состояние тренда на различных масштабах по сигналам индикаторов RSI и AC

Рис. 3. Состояние тренда на различных масштабах по сигналам индикаторов RSI и AC

На рисунке отчетливо видна тенденция движения цены с помощью используемых нами критериев и индикаторов RSI и AC. Рассмотрим ее более подробно.

Движение и скорость на таймфрейме M1 - сильное движение, индекс AC 4, глубина индекса RSI равна 2. На таймфрейме M5 глубина такая же, но в масштабе M5 скорость всего 1. Далее в масштабе М15 определяется то же движение, но менее заметное, чем на младших графиках. Если рассматривать 30-минутный и часовой, то отчетливо видно, что на М30 уже есть сигнал, а на H1 было замедление и даже сигнал на возможный разворот.

Из этого примера следует важный вывод:

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


4. Реализация данной торговой стратегии в качестве советника

Код советника:

//+------------------------------------------------------------------+
//|                                                       tester.mq4 |
//|                                                Alexander Fedosov |
//+------------------------------------------------------------------+
#property copyright "Alexander Fedosov"
#property strict
#include <trading.mqh>      //Вспомогательная библиотека для торговых операций
//+------------------------------------------------------------------+
//| Параметры советника                                              |
//+------------------------------------------------------------------+
input int             SL = 40;               // Стоп-лосс
input int             TP = 70;               // Тейк-профит
input bool            Lot_perm=true;         // Лот от баланса?
input double          lt=0.01;               // Лот
input double          risk = 2;              // Риск депозита, %
input int             slippage= 5;           // Проскальзывание
input int             magic=2356;            // Маджик
input int             period=8;              // Период индикатора RSI
input ENUM_TIMEFRAMES tf=PERIOD_CURRENT;     // Рабочий таймфрейм
int dg,index_rsi,index_ac;
trading tr;
//+------------------------------------------------------------------+
//| Expert Advisor initialization function                           |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- определение переменных для вспомогательного класса торговых функций
//--- язык ошибок, русский или по умолчанию.
   tr.ruErr=true;
   tr.Magic=magic;
   tr.slipag=slippage;
   tr.Lot_const=Lot_perm;
   tr.Lot=lt;
   tr.Risk=risk;
//--- количество попыток при установки торговой операции.
   tr.NumTry=5;
//--- определение десятичных знаков после запятой на текущем графике
   dg=tr.Dig();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Главная функция расчета                                          |
//+------------------------------------------------------------------+
void OnTick()
  {
   depth_trend();
   speed_ac();
//--- проверка на то, что нет уже открытых ордеров
   if(OrdersTotal()<1)
     {
      //--- проверка условий на покупку
      if(Buy())
         tr.OpnOrd(OP_BUY,tr.Lots(),Ask,SL*dg,TP*dg);
      //--- проверка условий на продажу
      if(Sell())
         tr.OpnOrd(OP_SELL,tr.Lots(),Bid,SL*dg,TP*dg);
     }
//--- есть открытые ордера?
   if(OrdersTotal()>0)
     {
      //--- проверяем и закрываем те ордеры на продажу, которые удовлетворяют условиям закрытия.
      if(Sell_close())
         tr.ClosePosAll(OP_SELL);
      //--- проверяем и закрываем те ордеры на покупку, которые удовлетворяют условиям закрытия.
      if(Buy_close())
         tr.ClosePosAll(OP_BUY);
     }

  }
//+------------------------------------------------------------------+
//| Функция определения глубины тренда                               |
//+------------------------------------------------------------------+
void depth_trend()
  {
//--- определение индекса на покупку
   double rsi=iRSI(Symbol(),tf,period,PRICE_CLOSE,0);
   index_rsi = 0;
   if(rsi>90.0) index_rsi=4;
   else if(rsi>80.0)
      index_rsi=3;
   else if(rsi>70.0)
      index_rsi=2;
   else if(rsi>60.0)
      index_rsi=1;
   else if(rsi<10.0)
      index_rsi=-4;
   else if(rsi<20.0)
      index_rsi=-3;
   else if(rsi<30.0)
      index_rsi=-2;
   else if(rsi<40.0)
      index_rsi=-1;
  }
//+------------------------------------------------------------------+
//| Функция определения скорости тренда                              |
//+------------------------------------------------------------------+
void speed_ac()
  {
   double ac[];
   ArrayResize(ac,5);
   for(int i=0; i<5; i++)
      ac[i]=iAC(Symbol(),tf,i);

   index_ac=0;
//--- сигнал на покупку
   if(ac[0]>ac[1])
      index_ac=1;
   else if(ac[0]>ac[1] && ac[1]>ac[2])
      index_ac=2;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3])
      index_ac=3;
   else if(ac[0]>ac[1] && ac[1]>ac[2] && ac[2]>ac[3] && ac[3]>ac[4])
      index_ac=4;
//--- сигнал на продажу
   else if(ac[0]<ac[1])
      index_ac=-1;
   else if(ac[0]<ac[1] && ac[1]<ac[2])
      index_ac=-2;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3])
      index_ac=-3;
   else if(ac[0]<ac[1] && ac[1]<ac[2] && ac[2]<ac[3] && ac[3]<ac[4])
      index_ac=-4;
  }
//+------------------------------------------------------------------+
//| Функция проверки условия на покупку                              |
//+------------------------------------------------------------------+
bool Buy()
  {
   bool res=false;
   if((index_rsi==2 && index_ac>=1) || (index_rsi==3 && index_ac==1))
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| Функция проверки условия на продажу                              |
//+------------------------------------------------------------------+
bool Sell()
  {
   bool res=false;
   if((index_rsi==-2 && index_ac<=-1) || (index_rsi==-3 && index_ac==-1))
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| Функция проверки условия закрытия позиции на покупку             |
//+------------------------------------------------------------------+
bool Buy_close()
  {
   bool res=false;
   if(index_rsi>2 && index_ac<0)
      res=true;
   return (res);
  }
//+------------------------------------------------------------------+
//| Функция проверки условия закрытия позиции на продажу             |
//+------------------------------------------------------------------+
bool Sell_close()
  {
   bool res=false;
   if(index_rsi<-2 && index_ac>0)
      res=true;
   return (res);
  }

Проведя небольшую оптимизацию всего по двум параметрам: tf (рабочий таймфрейм) и period (период индикатора RSI).

На рабочем таймфрейме M5 получили следующие результаты:

Рис. 4. Результаты тестирования торговой стратегии на исторических данных

Рис. 4. Результаты тестирования торговой стратегии на исторических данных

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

Заключение

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

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

Удачных трейдов.