Скачать MetaTrader 5

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

17 апреля 2015, 12:40
Alexander Fedosov
56
20 121

Введение

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


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

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

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

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


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

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

Для наглядности примера используем стандартные индикаторы: осциллятор Индекс Относительной силы 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:

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

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

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

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

Alexander Masterskikh
Alexander Masterskikh | 19 дек 2016 в 18:46

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

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

Как мы развивали сервис торговых сигналов MetaTrader и социальный трейдинг в целом Как мы развивали сервис торговых сигналов MetaTrader и социальный трейдинг в целом

Мы активно совершенствуем сервис Сигналы, последовательно избавляемся от прежних недоработок и вносим изменения в существующие механизмы. MetaTrader Signals двухлетней давности и MetaTrader Signals на текущий момент - это словно два различных сервиса. Прямо сейчас ведутся работы по реализации виртуального хостинга Virtual Hosting Cloud - сети серверов для поддержки специальных версий клиентского терминала MetaTrader. За пять шагов из MetaTrader станет возможно взять в аренду виртуальную копию терминала с минимальной сетевой задержкой до торгового сервера брокера.

Почему нужно обновить MetaTrader 4 на последний билд до 1 августа? Почему нужно обновить MetaTrader 4 на последний билд до 1 августа?

C 1 августа 2014 года прекращается поддержка десктопных терминалов MetaTrader 4 ниже 600-го билда. А ведь многие трейдеры продолжают сидеть на привычных старых версиях и не знают о возможностях обновленной платформы. Мы вложили много сил в ее разработку и хотели бы вместе с трейдерами двигаться дальше и отказаться от старых билдов. В этой статье мы расскажем о преимуществах нового MetaTrader 4.

Статистическая проверка системы управления капиталом Лябушера Статистическая проверка системы управления капиталом Лябушера

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

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

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