English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Торговые идеи на основе направления и скорости движения цен

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

MetaTrader 4Примеры | 17 апреля 2015, 12:40
30 833 56
Alexander Fedosov
Alexander Fedosov

Введение

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


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

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

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

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


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

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

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

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

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

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

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

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

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

  • Зона между уровнями 40 - 60 считается зоной флэта (бокового движения). Когда цена находится в этой зоне, тренда нет. Присвоим отсутствию направленного движения индекс 0.

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

  • Зона 60-70 - это возможное начало движения в сторону повышения. Присвоим движению цены индекс 1.
  • Зона 70-80 - движение уже более отчетливо в сторону повышения. Набирает ход. Присваиваем индекс 2.
  • Зона 80-90 - движение уже имеет устойчивую направленность. Ход набран. Присваиваем ему индекс 3.
  • Зона 90-100. Как правило, это очень сильное однонаправленное движение без откатов. Встречается нечасто. Индекс его движения ставим 4.

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

  • Зона 30-40, начало движения на понижение. Индекс равен -1.
  • Зона 20-30. Набирает ход. Индекс -2.
  • Зона 10-20. Устойчивое направление вниз. Индекс -3.
  • Зона 0-10. Зона однонаправленного сильного движения. Индекс -4.

На языке 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

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

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

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

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

  • Аналогично. Сравнение текущего бара и предыдущего. Если текущий уступает бару до него, индекс скорости равен -1.
  • Сравнение 3 баров на уменьшение от предыдущего к текущему. Индекс равен -2.
  • Сравнение 4 баров. Индекс равен -3.
  • Сравнение 5 баров. Индекс равен -4.

На языке 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. Результаты тестирования торговой стратегии на исторических данных

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

Заключение

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

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

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


Прикрепленные файлы |
trading.mqh (24.56 KB)
tester.mq4 (5.93 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (56)
Andrey Khatimlianskii
Andrey Khatimlianskii | 23 июн. 2015 в 23:06
iJSmile:
Что-то я завис на этих строчках:
если ac[0] > ac[1] то index_ac = 1, а иначе ....иначе все строчки ниже (3 последующих условия) тоже не выполнятся, тогда зачем их писать. Может я не прав?
Ну да, порядок строк перепутан )
Andrey Khatimlianskii
Andrey Khatimlianskii | 23 июн. 2015 в 23:07
Alexander Fedosov:
если ac[0] > ac[1] то index_ac = 1, а иначе если ....а иначе если ....а иначе если ....
"А иначе" не наступит, потому что в остальных если такое же первое условие.
iJSmile
iJSmile | 24 июн. 2015 в 18:27
Спасибо, Андрей. А то думал уже крыша едет)
Denis Sartakov
Denis Sartakov | 17 окт. 2015 в 18:39
Alexander Fedosov:

Ну суть не в этом. Вопрос тот же:

Ответьте, пожалуйста, какой из примеров подходит под категорию Правильный, а какой Корректный?

Тут надо ввести нечеткую переменную, сформировать терм-множество,

ввести для каждого терма функцию принадлежности, ..... без этого никак... 

Aleksandr Masterskikh
Aleksandr Masterskikh | 19 дек. 2016 в 18:46

Очень правильно подняли тему фактора скорости, имея в виду несостоятельность традиционного анализа

в решении вопросов обвалов и резких скачков цен в минутных и секундных интервалах.

Создание интерактивного приложения для отображения RSS-каналов в MetaTrader 5 Создание интерактивного приложения для отображения RSS-каналов в MetaTrader 5
В данной статье рассматривается создание приложения, отображающего RSS-каналы. Мы также рассмотрим аспекты применения Стандартной библиотеки при создании интерактивных программ для MetaTrader 5.
Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
В данной статье описывается специальный алгоритм, позволяющий эффективно получать доступ к элементам по их уникальному ключу. В качестве ключа может быть использован любой базовый тип данных, например ключом могут быть строки или целочисленные переменные. Такой контейнер данных принято называть словарем или ассоциативным массивом. С его помощью решать многие задачи становиться гораздо проще и эффективней.
Трендовые линии на основе фракталов посредством MQL4 и MQL5 Трендовые линии на основе фракталов посредством MQL4 и MQL5
В статье описано решение по автоматизации построения трендовых линий на основе индикатора Fractals с помощью MQL4 и MQL5. Структура статьи представлена в сравнительном виде в рамках решения поставленной задачи с позиции двух языков. Построение трендовых линий осуществляется по двум последним известным фракталам.
Изучаем класс CCanvas. Реализация прозрачности графических объектов Изучаем класс CCanvas. Реализация прозрачности графических объектов
Надоела угловатая графика скользящих средних? Вы хотите рисовать в терминале что-то более красивое, чем простой прямоугольник с заливкой? Рисовать красиво в терминале можно. Для этого есть класс для создания пользовательской графики - CCanvas. С помощью этого класса можно реализовать прозрачность, смешивать цвета и получать иллюзию прозрачности при помощи наложения и смешивания цвета.