Пользовательский индикатор скорости изменения цены (ROC)
Все индикаторы, как известно, имеют сугубо прикладное значение - помочь
трейдеру сориентироваться в текущем движении цены и хотя бы отчасти
спрогнозировать будущее движение цен. При достаточном опыте можно вести торговлю
ориентируясь по характеру изменения скользящей средней, например, просто
следовать за её направлением. Однако, скользящая средняя отражает динамику
изменения цен на рынке лишь "в общем", т.к. имеет существенный недостаток -
запаздывание. Представленный здесь пользовательский индикатор скорости изменения
цены обладает некоторыми преимуществами по сравнению с простой МА - он имеет
меньшее запаздывание и большую наглядность.
Посмотрим, как характеризуют движение цены скользящие средние МА с различным
периодом усреднения. На Рис. 125 показано две таких индикаторных линии: красная
- МА с периодом усреднения 21 бар и голубая МА с периодом усреднения 5 баров.
Легко увидеть, что МА с малым периодом усреднения ближе прилегает к свечному
графику и имеет малое запаздывание. Однако, использование этой линии для
характеристики рынка затруднительно, т.к. она чрезмерно извилиста, т.е. часто
изменяет своё направление, давая при этом множество ложных сигналов. МА с
большим периодом усреднения не так извилиста, т. е. не будет давать столько
много ложных сигналов, как МА с малым периодом, но имеет другой недостаток -
большее запаздывание.
Рис. 125. Индикаторные линии: МА(21) - красная, МА(5) - голубая и скорости V -
оранжевая.
Третья линия, представленная на Рис. 125, - индикаторная линия скорости
изменения тренда (оранжевая). Эта линия обладает неоспоримыми достоинствами по
сравнению с любой из МА: она имеет сравнительно небольшое запаздывание и хорошую
сглаженность. Рассмотрим подробней, что представляет эта линия.
В основе построения этой индикаторной линии лежит скорость изменения МА(21).
На участке А-В скорость изменения значений МА растёт. Это значит, что каждая
точка МА на указанном участке не просто выше предыдущей, а выше на такое
значение, которое больше, чем аналогичное значение для предыдущей точки.
Например, если на баре с индексом 271 значение МА(21) было 1.3274, на баре с
индексом 272 - 1.3280, а на баре 273 - 1.3288, то между барами с индексами 271 и
272 МА выросла на 6 пунктов, а между барами 272 и 273 на 8 пунктов. Таким
образом, МА не просто растёт, а ускоряется, т.е. характеризуется всё время
увеличивающейся скоростью роста. На участке ускорения роста (А-В) МА прогибается
вверх, при этом любой небольшой фрагмент этого участка может быть описан как
часть окружности с некоторым радиусом r1.
По мере того, как МА приближается к точке перегиба В, радиус окружности,
описывающей последний участок, растёт, а в самой точке В равен бесконечности.
Т.е. в точке В МА вырождается в прямую линию, характеризующуюся постоянной
скоростью роста, поэтому оранжевая линия изменения скорости перестаёт расти. На
участке В-С МА замедляет свой рост, но рост продолжается. Несмотря на то, что МА
продолжает расти с некоторой положительной скоростью, скорость роста МА
уменьшается, поэтому и кривая скорости V снижается. Любой небольшой фрагмент на
этом участке МА как бы описывает окружность некоторого радиуса r2, находящуюся
ниже МА.
В точке С МА перестаёт расти, т.е. скорость её равна нулю. В данном примере
для построения оранжевой линии скорости в качестве опорной линии отсчёта принята
сама МА. Здесь необходимо уточнить, что такое опорная МА. При обычном построении
какого-нибудь графика на плоскости, как правило, используется Декартова система
координат, при этом в качестве лини начала отсчёта для построения используется
ось Х. В нашем случае в качестве такой линии используется не прямая ось, а МА с
некоторым периодом усреднения (в данном случае сама МА(21), красная), она и называется
опорной МА. Скорость изменения МА пропорциональна значению разницы между красной
МА и оранжевой V. Т.е. если оранжевая линия находится выше МА, то скорость МА
положительная, если ниже, то отрицательная, а в точке пересечения линии V с
линией МА скорость роста МА равна нулю. Участок C-D может быть описан в тех же
терминах, что и участок А-В, но с той разницей, что скорость роста МА имеет
отрицательное значение.
Определяющий момент заключается в том, что МА растёт на всём промежутке E-C,
в то время, как кривая скорости V имеет характерный, ярко выраженный экстремум в
точке К. Визуальный анализ графика цен позволяет легко убедиться, что
индикаторная линия скорости изменения цены гораздо лучше характеризует вершины и
впадины ценового графика, чем любая из МА.
При программировании индикатора для вычисления скорости изменения роста МА
принята простая технология. Собственно скорость, как известно, - это показатель,
имеющий в числителе значение изменяемого параметра, а в знаменателе - время, в
течение которого этот параметр изменяется. Применительно к скорости изменения
цены (см. Рис. 126) это разница значений МА_с (текущее значение МА) и МА_p
(предыдущее значение) на промежутке в несколько баров Bars_V. Имея в виду, что
вычисление скорости на всей истории развития цены выполняется на одном и том же
промежутке времени (количестве баров), знаменатель можно опустить, т.е. судить о
скорости изменения цены по разнице МА_с - МА_p на текущем и предыдущих барах.
Рис. 126. Параметры для построения индикаторной линии скорости.
Рассматриваемый пользовательский индикатор рассчитывает в общей сложности 6
индикаторных линий. Индикаторный массив Line_0[] несёт значения опорной МА,
относительно которой строятся все остальные индикаторные линии. Следующие три
индикаторных массива (Line_1[], Line_2[] и Line_3[]) содержат значения скоростей
изменения цены, основанные на МА с различным периодом усреднения. Индикаторный
массив Line_4[] предназначен для построения средней линии скорости (как среднего
арифметического Line_1[],Line_2[] и Line_3[]), а Line_5[] - для построения той
же средней линии скорости, но сглаженной.
При принятии торговых решений трейдером, как правило, учитывается характер
развития графика цены не только на текущем, но и на ближайших таймфреймах. Для
того, чтобы получше разобраться как построены три индикаторные линии скорости,
обратим внимание на следующую подробность. МА с некоторым периодом усреднения,
построенная на некотором таймфрейме, отображается на ближайшем большем
таймфрейме с помощью МА с периодом усреднения во столько раз меньшим, во сколько
раз больше таймфрейм. Например, если в окне финансового инструмента М30 отражена
МА с периодом усреднения 400, то она так же (с тем же рисунком и близкими абсолютными значениями) будет отражаться в окне H1 с периодом усреднения 200, в окне H4 с
периодом усреднения 50 и т.д. При этом, строго говоря, будет наблюдаться
некоторая погрешность, связанная с большим количеством данных,
учитываемых на более мелких таймфреймах. Однако в большинстве случаев эта
погрешность пренебрежимо мала и здесь не учитывается.
Оранжевая линия, построенная на основе индикаторного массива Line_1[],
отражает изменение скорости на текущем таймфрейме. Зелёная линия, построенная на
основе Line_2[], отображается (в этом же, текущем таймфрейме) так, как в
ближайшем большем таймфрейме отражалась бы оранжевая линия. Коричневая линия
отражается в текущем таймфрейме так, как оранжевая отображалась бы в следующем
большем таймфрейме. Таким образом, с помощью представленного индикатора скорости
можно наблюдать в одном окне одновременно три индикаторных линии, отражающих,
соответственно, скорость развития цены на текущем, ближайшем большем и следующем
большем таймфреймах.
|
Пользовательский индикатор
roc.mq4 скорости изменения цены на
текущем, ближайшем большем и следующем большем таймфреймах. |
#property copyright "Copyright © SK, 2007"
#property link "http://AutoGraf.dp.ua"
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Black
#property indicator_color2 DarkOrange
#property indicator_color3 Green
#property indicator_color4 Brown
#property indicator_color5 Blue
#property indicator_color6 Red
extern int History =5000;
extern int Period_MA_0=13;
extern int Period_MA_1=21;
extern int Bars_V =13;
extern int Aver_Bars =5;
extern double K =2;
int
Period_MA_2, Period_MA_3,
Period_MA_02, Period_MA_03,
K2, K3;
double
Line_0[],
Line_1[], Line_2[], Line_3[],
Line_4[],
Line_5[],
Sh_1, Sh_2, Sh_3;
int init()
{
SetIndexBuffer(0,Line_0);
SetIndexBuffer(1,Line_1);
SetIndexBuffer(2,Line_2);
SetIndexBuffer(3,Line_3);
SetIndexBuffer(4,Line_4);
SetIndexBuffer(5,Line_5);
SetIndexStyle (5,DRAW_LINE,STYLE_SOLID,3);
switch(Period())
{
case 1: K2=5;K3=15; break;
case 5: K2=3;K3= 6; break;
case 15: K2=2;K3= 4; break;
case 30: K2=2;K3= 8; break;
case 60: K2=4;K3=24; break;
case 240: K2=6;K3=42; break;
case 1440: K2=7;K3=30; break;
case 10080: K2=4;K3=12; break;
case 43200: K2=3;K3=12; break;
}
Sh_1=Bars_V;
Sh_2=K2*Sh_1;
Sh_3=K3*Sh_1;
Period_MA_2 =K2*Period_MA_1;
Period_MA_3 =K3*Period_MA_1;
Period_MA_02=K2*Period_MA_0;
Period_MA_03=K3*Period_MA_0;
return;
}
int start()
{
double
MA_0, MA_02, MA_03,
MA_c, MA_p,
Sum;
int
i,
n,
Counted_bars;
Counted_bars=IndicatorCounted();
i=Bars-Counted_bars-1;
if (i>History-1)
i=History-1;
while(i>=0)
{
MA_0=iMA(NULL,0,Period_MA_0,0,MODE_LWMA,PRICE_TYPICAL,i);
Line_0[i]=MA_0;
MA_c=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i);
MA_p=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_1);
Line_1[i]= MA_0+K*(MA_c-MA_p);
MA_c=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i);
MA_p=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_2);
MA_02= iMA(NULL,0,Period_MA_02,0,MODE_LWMA,PRICE_TYPICAL,i);
Line_2[i]=MA_02+K*(MA_c-MA_p);
MA_c=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i);
MA_p=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_3);
MA_03= iMA(NULL,0,Period_MA_03,0,MODE_LWMA,PRICE_TYPICAL,i);
Line_3[i]=MA_03+K*(MA_c-MA_p);
Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])3;
if (Aver_Bars<0)
Aver_Bars=0;
Sum=0;
for(n=i; n<=i+Aver_Bars; n++)
Sum=Sum + Line_4[n];
Line_5[i]= Sum(Aver_Bars+1);
i--;
}
return;
}
Для расчётов индикаторных массивов трёх линий скорости используются МА с
различными периодами усреднения. Период усреднения МА для текущего таймфрейма
задаётся пользователем во внешней переменной Period_MA_1, а период усреднения
опорной МА - во внешней переменной Period_MA_0.
Периоды усреднения МА, для которых рассчитывается скорость, периоды
усреднения опорных МА, а также период, на котором измеряется скорость,
вычисляются для старших таймфреймов в блоке 6-7. Значения соответствующих
коэффициентов для расчётов этих значений определяются в блоке 5-6. Например,
если индикатор присоединён в окно М30, то коэффициенты К2 и К3 будут
соответственно равны 2 и 8, т.к ближайший больший таймфрейм Н1 в 2 раза больше,
чем М30, а следующий больший Н4 - в 8 раз больше М30.
Вычисления в функции start() очень просты. В блоке 12-13 вычисляются значения
опорной МА для текущего таймфрейма (чёрная индикаторная линия). В блоке 13-14
определяются значения индикаторного массива Line_1[] для построения линии
скорости изменения цен на текущем таймфрейме (оранжевая линия). Собственно
скорость определяется как разница значений рассматриваемой МА на текущем баре и
баре, индекс которого на Sh_1 больше текущего, а именно (MA_c-MA_p). Значение
индикаторного массива Line_1[] на текущем баре складывается из значения опорной
МА и показателя, характеризующего скорость (здесь К - масштабный коэффициент,
задаваемый во внешней переменной):
Line_1[i]= MA_0+K*(MA_c-MA_p);
Аналогичные вычисления выполняются и для построения линий скорости изменения
цены для двух других таймфреймов (блоки 14-16). Опорные МА для этих массивов
индикатором не отображаются. В блоке 16-17 определяются значения индикаторного
массива Line_4[] для построения средней линии скорости (синяя линия), являющейся
их простым средним арифметическим.
В блоке 17-18 выполняются вычисления для ещё одной средней линии скорости -
сглаженной (красная жирная линия, индикаторный массив Line_5[]). Сглаживание
выполняется путём простого усреднения: значение элемента индикаторного массива
Line_5[] на текущем баре является средним арифметическим значений нескольких
последних элементов индикаторного массива Line_4[]. В результате применения
такого метода сглаживания красная индикаторная линия становится менее
извилистой, но в то же время обладает некоторым запаздыванием. Количество баров
для сглаживания задаётся во внешней переменной Aver_Bars.
Запустив индикатор на исполнение, в окне финансового инструмента можно
наблюдать 6 индикаторных линий:
- чёрная линия - опорная МА для построения линии скорости цены на текущем
таймфрейме;
- оранжевая линия - скорость изменения цены на текущем таймфрейме;
- зелёная линия - скорость изменения цены на ближайшем большем таймфрейме;
- коричневая линия - скорость изменения цены на следующем большем таймфрейме;
- синяя линия - средняя линия скорости изменения цены;
- красная линия - сглаженная средняя линия скорости изменения цены.
Рис. 127. Пользовательский индикатор
roc.mq4 позволяет наблюдать на одном экране график изменения скорости на
текущем, ближайшем большем и следующем большем таймфрейме, а также их среднюю.
Индикатор roc.mq4 можно прикрепить к
окну любого финансового инструмента с любым таймфреймом. Для каждого таймфрейма
будет справедливо одно и то же правило: оранжевая линия отражает скорость
изменения цены на текущем таймфрейме, зелёная - на ближайшем большем таймфрейме,
а коричневая - на следующем большем таймфрейме. В этом легко убедиться,
прикрепив индикатор в окно финансового инструмента и наблюдая рисунок линий в
текущем и соседних таймфреймах (см. Рис. 128 и Рис. 129).
Рис. 128. Рисунок 3-й (коричневой) линии на текущем (М15) таймфрейме совпадает с
рисунком 2-й (зелёной) линии на
старшем таймфрейме (M30, Рис. 129) и рисунком 1-й (оранжевой) лини на следующем
старшем таймфрейме (H1, Рис. 129).
Рис. 129. Рисунок 2-й (зелёной) линии на текущем (М30) таймфрейме совпадает с
рисунком 3-й (коричневой) линии
на младшем таймфрейме (М15, Рис. 128) и с рисунком 1-й (оранжевой) линии на
старшем таймфрейме (H1).
В представленном индикаторе roc.mq4
имеется одна особенность: каждая линия скорости несёт в себе не только значение
скорости изменения цены, но также зависит и от характера изменения опорной МА. С
одной стороны, такая технология позволяет отображать линии изменения скоростей
непосредственно на ценовом графике, что очень удобно. С другой стороны, при
малых величинах скорости изменения цены определяющим (при построении линии
скорости) становится значение опорной МА, что нежелательно, т.к. любая МА
обладает некоторым запаздыванием.
Следующий пользовательский индикатор является полным аналогом индикатора
roc.mq4, но отображается в отдельном
окне. Это позволило рассчитать значения линий скоростей для разных таймфреймов
не относительно опорной МА, а относительно горизонтальной нулевой линии. В связи
с этим несколько изменился программный код: отпала необходимость в расчёте
опорных МА и в масштабном коэффициенте.
|
Пользовательский индикатор
rocseparate.mq4 скорости
изменения цены на текущем, ближайшем большем и следующем большем таймфреймах
отображается в отдельном окне. |
#property copyright "Copyright © SK, 2007"
#property link "http://AutoGraf.dp.ua"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 Black
#property indicator_color2 DarkOrange
#property indicator_color3 Green
#property indicator_color4 Brown
#property indicator_color5 Blue
#property indicator_color6 Red
extern int History =5000;
extern int Period_MA_1=21;
extern int Bars_V =13;
extern int Aver_Bars =5;
int
Period_MA_2, Period_MA_3,
K2, K3;
double
Line_0[],
Line_1[], Line_2[], Line_3[],
Line_4[],
Line_5[],
Sh_1, Sh_2, Sh_3;
int init()
{
SetIndexBuffer(0,Line_0);
SetIndexBuffer(1,Line_1);
SetIndexBuffer(2,Line_2);
SetIndexBuffer(3,Line_3);
SetIndexBuffer(4,Line_4);
SetIndexBuffer(5,Line_5);
SetIndexStyle (5,DRAW_LINE,STYLE_SOLID,3);
switch(Period())
{
case 1: K2=5;K3=15; break;
case 5: K2=3;K3= 6; break;
case 15: K2=2;K3= 4; break;
case 30: K2=2;K3= 8; break;
case 60: K2=4;K3=24; break;
case 240: K2=6;K3=42; break;
case 1440: K2=7;K3=30; break;
case 10080: K2=4;K3=12; break;
case 43200: K2=3;K3=12; break;
}
Sh_1=Bars_V;
Sh_2=K2*Sh_1;
Sh_3=K3*Sh_1;
Period_MA_2 =K2*Period_MA_1;
Period_MA_3 =K3*Period_MA_1;
return;
}
int start()
{
double
MA_c, MA_p,
Sum;
int
i,
n,
Counted_bars;
Counted_bars=IndicatorCounted();
i=Bars-Counted_bars-1;
if (i>History-1)
i=History-1;
while(i>=0)
{
Line_0[i]=0;
MA_c=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i);
MA_p=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_1);
Line_1[i]= MA_c-MA_p;
MA_c=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i);
MA_p=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_2);
Line_2[i]= MA_c-MA_p;
MA_c=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i);
MA_p=iMA(NULL,0,Period_MA_3,0,MODE_LWMA,PRICE_TYPICAL,i+Sh_3);
Line_3[i]= MA_c-MA_p;
Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])3;
if (Aver_Bars<0)
Aver_Bars=0;
Sum=0;
for(n=i; n<=i+Aver_Bars; n++)
Sum=Sum + Line_4[n];
Line_5[i]= Sum(Aver_Bars+1);
i--;
}
return;
}
При внимательном рассмотрении рисунков индикаторных линий, отображаемых в
отдельном окне и на ценовом графике, можно заметить некоторые отличия, которые
продиктованы использованием при расчётах разных методов. Для расчётов
индикаторных линий, отображаемых в основном окне, используются опорные МА, а при
расчётах для отдельного окна опорные МА отсутствуют. По этой же причине
наблюдается строгое совпадение по времени точек пересечения линии скорости с
опорной МА в индикаторе
roc.mq4 и точек пересечения линии
скорости с нулевой линией в индикаторе
rocseparate.mq4.
Рис. 130. Пользовательский индикатор
rocseparate.mq4 позволяет
наблюдать в отдельном окне график
изменения скорости на текущем, ближайшем большем и следующем большем
таймфрейме, а также их среднюю.