![Торговые идеи на основе направления и скорости движения цен](https://c.mql5.com/i/articles/overlay.png)
Торговые идеи на основе направления и скорости движения цен
Введение
Давно известно, что все ликвидные рынки при движении цен имеют некоторую цикличность в виде волны, которая сначала нарастает, а потом спадает. Это хорошо видно на графиках старших таймфреймов. Синусоидальная природа говорит о том, что цена имеет некую инерционность, а иначе это выглядело бы как зигзаг - резкие движения вверх и вниз за короткие промежутки времени. Давайте попытаемся разобраться в том, почему это происходит, и как это можно использовать в торговле.
Начало движения и инерция
Любое движение в нашем мире имеет такие характеристики как направление, ускорение, скорость. На ликвидных рынках оно также поддается этим характеристикам. Из этого следует важное правило - ни одно сильное направленное перемещение цены на рынках резко никогда не заканчивается, это как поезд, который при торможении на полном ходу с составом может иметь тормозной путь до километра.
Когда же происходит начало тренда? Когда мнение большинства участников рынка меняется на противоположное по каким-либо причинам, будь то глобальная перемена курса, изменение важных факторов, влияющих на рынок или новости. После этого складывается твердое общее мнение и тренд начинается. Участник рынка все больше уверены в том, что движение набирает силу и продолжится, входят крупные игроки с большими позициями, поэтому движение имеет уже свою направленность, ускорение и определенную скорость развития. Вот тут и начинают зарабатывать те, кто вошли в начале этого движения, дали ему импульс и скорость. Позже уже по худшей цене входят остальные трейдеры, но в отличие от первых, они лишь пытаются использовать само направление движения цены.
Когда же настают перемены, тренд завершается. Почему же движение еще некоторое время продолжается, а не резко меняется? Это происходит из-за того, что те, кто разгонял и толкал цену в нужном им направлении, уже закрывают свои позиции и тормозят тренд, а те, кто лишь "ловил волну", продолжают верить, что ничего не изменилось и даже пытаются сами двигать цену. Но тут "поезд" не только останавливается, но и начинает двигаться в противоположном направлении, и для них все заканчивается.
Торговая идея и как не попасть под "поезд"
Идея использования движения и получения прибыли основывается на анализе глубины текущего тренда, т.е. его величины и длительности.
Для наглядности примера используем стандартные индикаторы: осциллятор Индекс Относительной силы RSI (Relative Strength Index) и индикатор Ускорения/Замедления AC (Acceleration/Deceleration).
1. Условия для входа в рынок
Первый индикатор мы будем использовать как показатель того, насколько далеко и глубоко ушла цена в текущем движении.
Для этого будут установлены уровни, которые помогут это определить:
Рис. 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
Критерии оценки скорости:
Рост на повышение.
- Первым критерием будет сравнение значений двух гистограмм, текущей и предыдущей. Если текущая больше предыдущей, то это будет возможное ускорение на повышение цены. Определим это как индекс скорости, равный 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. Условия для выхода из рынка
Параметры для входа были определены и классифицированы. Чтобы понять, как сформулировать условия выхода с рынка, я приведу следующую аналогию:
Возьмем обычный детский резиновый мячик. А теперь рассмотрим, что будет с ним, если человек бросает его с большой высоты в воду. Сначала он будет лететь, набирая скорость с ускорением свободного падения. Потом происходит столкновение с водой, но его скорость достаточна, чтобы уйти под воду на определенную глубину, при этом сильно теряя в скорости, и имея уже отрицательное ускорение. На мяч действует Закон Архимеда, выталкивая его из воды вверх.
А теперь давайте разберем, что есть что в этом примере:
- Как вы уже догадались, наш мяч это цена.
- Человек - это те участники рынка, что начинают тенденцию.
- Сила притяжения, которая создает ускорение свободного падения - это трейдеры, присоединившиеся к направлению цены после начала тренда.
- Вода - важные факторы, влияющие на смену направления.
- Сила Архимеда - это закрытые позиции тех, кто начинал тренд.
Две главные задачи для получения прибыли на рынке состоят в следующем:
- Вовремя определить момент, когда мяч уже брошен, и купить или продать.
- Закрыть позиции в момент, когда мяч входит в воду и замедляет свое движение.
Определить длительность и точную высоту падения мяча очень сложно, ведь на финансовых рынках мы не видим ни человека, бросающего мяч, ни воды. Мы видим лишь скорость и направление мяча.
Ранее мы рассмотрели критерии оценки глубины движения цены и оценки скорости.
Определим условия выхода:
//--- возможный разворот вниз if(index_rsi>2 && index_ac<0)
Если цена шла достаточно долго шла вверх, и ее ускорение становится
отрицательным (в сторону понижения), это говорит о том, что возможна
смена тенденции.
//--- возможный разворот вверх if(index_rsi<-2 && index_ac>0)
По аналогии с приведенным выше примером: мяч достаточно долго падал, но попал в воду, и она его выталкивает в противоположном направлении. Значит, пора закрывать позиции.
3. Увеличение эффективности входа и выхода
Известно, что некоторые индикаторы, используемые для торговли, при уменьшении периода увеличивают скорость реагирования на смену тенденции, однако и ложных сигналов появляется больше.
Альтернативный способ - это не изменять период расчета в меньшую сторону, а отслеживать его на нескольких таймфреймах.
Рис. 3. Состояние тренда на различных масштабах по сигналам индикаторов RSI и AC
На рисунке отчетливо видна тенденция движения цены с помощью используемых нами критериев и индикаторов RSI и AC. Рассмотрим ее более подробно.
Движение и скорость на таймфрейме M1 - сильное движение, индекс AC 4, глубина индекса RSI равна 2. На таймфрейме M5 глубина такая же, но в масштабе M5 скорость всего 1. Далее в масштабе М15 определяется то же движение, но менее заметное, чем на младших графиках. Если рассматривать 30-минутный и часовой, то отчетливо видно, что на М30 уже есть сигнал, а на 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. Результаты тестирования торговой стратегии на исторических данных
Заключение
Определение момента начала и окончания тренда - это одна из непростых задач для трейдеров всего мира, ведь предугадать рынок невозможно.
Однако вполне возможно определить моменты входа и выхода в текущем тренде, взяв от него ощутимый профит. Общая идея определения и динамического отслеживания скорости движения на рынке сможет помочь в этом.
Удачных трейдов.
![Создание интерактивного приложения для отображения RSS-каналов в MetaTrader 5](https://c.mql5.com/2/17/RSS_Feed_MetaTrader5__1.png)
![Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным](https://c.mql5.com/2/18/MQL5_Associative_Arrays__1.png)
![Трендовые линии на основе фракталов посредством MQL4 и MQL5](https://c.mql5.com/2/18/TrendLines_Fractals_Based.png)
![Изучаем класс CCanvas. Реализация прозрачности графических объектов](https://c.mql5.com/2/17/CCanvas_class_Standard_library_MetaTrader5.png)
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Что-то я завис на этих строчках:
если ac[0] > ac[1] то index_ac = 1, а иначе ....иначе все строчки ниже (3 последующих условия) тоже не выполнятся, тогда зачем их писать. Может я не прав?
если ac[0] > ac[1] то index_ac = 1, а иначе если ....а иначе если ....а иначе если ....
Ну суть не в этом. Вопрос тот же:
Ответьте, пожалуйста, какой из примеров подходит под категорию Правильный, а какой Корректный?
Тут надо ввести нечеткую переменную, сформировать терм-множество,
ввести для каждого терма функцию принадлежности, ..... без этого никак...
Очень правильно подняли тему фактора скорости, имея в виду несостоятельность традиционного анализа
в решении вопросов обвалов и резких скачков цен в минутных и секундных интервалах.