Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Стохастический Осциллятор (Stochastic Oscillator). 4 страница




//--------------------------------------------------------------------

#property indicator_separate_window // Отображение в отдельном окне

#property indicator_buffers 1 // Количество буферов

#property indicator_color1 Blue // Цвет первой линии

#property indicator_color2 Red // Цвет второй линии

 

extern int History =50; // Колич.баров в расчётной истории

extern int Aver_Bars=5; // Количество баров для расчёта

 

double Buf_0[]; // Объявление индикаторного массива

//--------------------------------------------------------------------

int init() // Специальная функция init()

{

SetIndexBuffer(0,Buf_0); // Назначение массива буферу

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии

return; // Выход из спец. ф-ии init()

}

//--------------------------------------------------------------------

int start() // Специальная функция start()

{

int i, // Индекс бара

n, // Формальный параметр

Counted_bars; // Количество просчитанных баров

double

Sum_H, // Сумма значений High за переиод

Sum_L; // Сумма значений Low за переиод

//--------------------------------------------------------------------

Counted_bars=IndicatorCounted(); // Количество просчитанных баров

i=Bars-Counted_bars-1; // Индекс первого непосчитанного

if (i>History-1) // Если много баров то..

i=History-1; //..рассчитывать заданное колич.

while(i>=0) // Цикл по непосчитанным барам

{

Sum_H=0; // Обнуление в начале цикла

Sum_L=0; // Обнуление в начале цикла

for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений

{

Sum_H=Sum_H + High[n]; // Накопление суммы макс.значений

Sum_L=Sum_L + Low[n]; // Накопление суммы мин. значений

}

Buf_0[i]=(Sum_H-Sum_L)/Aver_Bars;// Знач. 0 буфера на i-ом баре

i--; // Расчёт индекса следующего бара

}

//--------------------------------------------------------------------

return; // Выход из спец. ф-ии start()

}

//--------------------------------------------------------------------

Аналогичный расчёт индикаторной линии выполняется и в техническом индикаторе AverageTrue Range. На Рис. 122 можно наблюдать индикаторную линию, построенную пользовательским индикатором separatewindow.mq4 в одном отдельном окне и индикаторную линию, построенную техническим индикатором ATR в другом окне. В данном случае наблюдается полное совпадение линий благодаря тому, что для обоих индикаторов выбран один и тот же период усреднения, равный 5. Если в каком-нибудь индикаторе изменить этот параметр, то рисунок соответствующей индикаторной линии изменится.


Рис. 122. Отображение линии пользовательского индикатора в отдельном окне.
Совпадение рисунков линий технического (ATR) и пользовательского (separatewindow.mq4) индикаторов.

 

Легко заметить также, что линия пользовательского индикатора построена не на всю ширину экрана, а лишь по 50 последним барам, согласно установленному значению внешней переменной History. В случае, если трейдеру понадобится использовать больший исторический интервал, он может легко изменить значение внешней переменной через окно настроек пользовательского индикатора.

На Рис. 123 показано окно финансового инструмента, в котором индикаторная линия отражается другим стилем - в виде гистограммы. Для получения такого результата в программном коде separatewindow.mq4 была изменена одна строка - указаны иные значения стиля линии:

SetIndexStyle (0,DRAW_HISTOGRAM);// Стиль линии

Весь остальной код программы оставлен без изменения.


Рис. 123. Отображение линии пользовательского индикатора в отдельном окне (гистограмма).
Совпадение рисунков линий технического (ATR) и пользовательского (separatewindow.mq4) индикаторов.

 

Cмещение индикаторных линий по вертикали и горизонтали

 

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

Пример простого пользовательского индикатора displacement.mq4. Смещение индикаторных линий по горизонтали и вертикали.

//--------------------------------------------------------------------

// displacement.mq4

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------------

#property indicator_chart_window // Индик. рисуется в основном окне

#property indicator_buffers 3 // Количество буферов

#property indicator_color1 Red // Цвет первой линии

#property indicator_color2 Blue // Цвет второй линии

#property indicator_color3 Green // Цвет второй линии

 

extern int History =500; // Колич.баров в расчётной истории

extern int Aver_Bars=5; // Количество баров для расчёта

extern int Left_Right= 5; // Смещение по горизонтали (баров)

extern int Up_Down =25; // Смещение по вертикали (пунктов)

 

double Line_0[],Line_1[],Line_2[]; // Объявление массивов данных

//--------------------------------------------------------------------

int init() // Специальная функция init()

{

//--------------------------------------------------------------------

SetIndexBuffer(0,Line_0); // Назначение массива буферу 0

SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Стиль линии

//--------------------------------------------------------------------

SetIndexBuffer(1,Line_1); // Назначение массива буферу 1

SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Стиль линии

//--------------------------------------------------------------------

SetIndexBuffer(2,Line_2); // Назначение массива буферу 2

SetIndexStyle (2,DRAW_LINE,STYLE_DOT,1);// Стиль линии

//--------------------------------------------------------------------

return; // Выход из спец. ф-ии init()

}

//--------------------------------------------------------------------

int start() // Специальная функция start()

{

int i, // Индекс бара

n, // Формальный параметр (индекс)

k, // Индекс элемента индик. массива

Counted_bars; // Количество просчитанных баров

double

Sum; // Сумма Low и High за переиод

//--------------------------------------------------------------------

Counted_bars=IndicatorCounted(); // Количество просчитанных баров

i=Bars-Counted_bars-1; // Индекс первого непосчитанного

if (i>History-1) // Если много баров то..

i=History-1; //..рассчитывать заданное колич.

 

while(i>=0) // Цикл по непосчитанным барам

{

Sum=0; // Обнуление в начале цикла

for(n=i;n<=i+Aver_Bars-1;n++) // Цикл суммирования значений

Sum=Sum + High[n]+Low[n]; // Накопление суммы макс.значений

k=i+Left_Right; // Вычисление расчётного индекса

Line_0[k]= Sum/2/Aver_Bars; // Значение 0 буфера на k-ом баре

Line_1[k]= Line_0[k]+Up_Down*Point;// Значение 1 буфера

Line_2[k]= Line_0[k]-Up_Down*Point;// Значение 2 буфера

 

i--; // Расчёт индекса следующего бара

}

//--------------------------------------------------------------------

return; // Выход из спец. ф-ии start()

}

//--------------------------------------------------------------------

Для того, чтобы пользователь мог настроить смещение линий по графику цен в индикаторе предусмотрены две внешние переменные - Left_Right для смещения всех индикаторных линий по горизонтали, а также Up_Down для смещения двух (пунктирных) линий по вертикали.

extern int Left_Right= 5; // Смещение по горизонтали (баров)
extern int Up_Down = 25; // Смещение по вертикали (пунктов)

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

для смещения линии по горизонтали необходимо присвоить вычисленное значение элементу массива, индекс которого на величину Left_Right больше (для сдвига влево и меньше для сдвига вправо), чем индекс бара, для которого выполнены вычисления;

для смещения линии по вертикали необходимо прибавить (для смещения вверх или вычесть для смещения вниз) значение Up_Down*Point к каждому значению индикаторного массива, характеризующего исходное положение линии;

В рассматриваемом примере вычисление индексов выполняются в строке:

k = i+Left_Right; // Вычисление расчётного индекса

Здесь i - индекс бара, для которого выполняются вычисления, а k - индекс элемента индикаторного массива. Красная индикаторная линия, отображаемая клиентским терминалом на основе индикаторного массива Line_0[], сдвинута влево на 5 баров (в соответствии с настройками пользователя, см. Рис. 124) относительно того места точек, по которым была бы построена исходная линия. Исходная линия в данном случае представляет среднюю МА с периодом усреднения 5, рассчитанную по формуле (High[i]+Low[i])/2.

Line_0[k]= Sum2 Aver_Bars; // Значение 0 буфера на k-ом баре

В данном примере положение красной индикаторной линии является основой для расчёта значений индикаторных массивов двух других индикаторных линий, т.е. их положения на графике цен. Пунктирные линии рассчитываются так:

Line_1[k]= Line_0[k]+Up_Down*Point;// Значение 1 буфера
Line_2[k]= Line_0[k]-Up_Down*Point;// Значение 2 буфера

Использование здесь индекса k для элементов всех индикаторных массивов позволило выполнить расчёт для элементов массивов Line_1[], Line_2[] на том же баре, для которого имеется соответствующее значение опорного массива Line_0[]. В результате пунктирные линии оказались сдвинутыми относительно красной линии на то значение, которое указано пользователем в окне настроек индикатора, в данном случае, на 30 пунктов (Рис. 124).


Рис. 124. Красная индикаторная линия сдвинута влево на 5 баров.
Пунктирные индикаторные линии отстоят от красной линии на 30 пунктов.

Ограничения пользовательских индикаторов

 

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

Существует группа функций, которые можно использовать только в пользовательских индикаторах, и запрещено использовать в экспертах и скриптах: IndicatorBuffers(), IndicatorCounted (), IndicatorDigits(), IndicatorShortName(), SetIndexArrow(), SetIndexBuffer(), SetIndexDrawBegin(), SetIndexEmptyValue(), SetIndexLabel(), SetIndexShift(), SetIndexStyle(), SetLevelStyle(), SetLevelValue().

С другой стороны, в индикаторах запрещено использование торговых функций: OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete() и OrderModify(). Это связано с тем, что индикаторы работают в интерфейсном потоке (в отличие от экспертов и скриптов, работающих в собственном потоке).

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

Общая сравнительная характеристика экспертов, скриптов и индикаторов приведена в Таблице 2.

Пользовательский индикатор скорости изменения цены (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 скорости изменения цены на текущем, ближайшем большем и следующем большем таймфреймах.

 

//--------------------------------------------------------------------

// roc.mq4 (Priliv)

// Предназначен для использования в качестве примера в учебнике MQL4.

//--------------------------------------------------------------------

//--------------------------------------------------------------- 1 --

#property copyright "Copyright © SK, 2007"

#property link "http://AutoGraf.dp.ua"

//--------------------------------------------------------------------

#property indicator_chart_window // Индик. рисуется в основном окне

#property indicator_buffers 6 // Количество буферов

#property indicator_color1 Black // Цвет линии 0 буфера

#property indicator_color2 DarkOrange//Цвет линии 1 буфера

#property indicator_color3 Green // Цвет линии 2 буфера

#property indicator_color4 Brown // Цвет линии 3 буфера

#property indicator_color5 Blue // Цвет линии 4 буфера

#property indicator_color6 Red // Цвет линии 5 буфера

//--------------------------------------------------------------- 2 --

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; // Коэффициент усиления

//--------------------------------------------------------------- 3 --

int

Period_MA_2, Period_MA_3, // Расчётные периоды МА для др. ТФ

Period_MA_02, Period_MA_03, // Расчётные периоды опорных МА

K2, K3; // Коэффициенты соотношения ТФ

double

Line_0[], // Инидикаторн. массив опорной MA

Line_1[], Line_2[], Line_3[], // Инд. массивы линий скорости

Line_4[], // Инидикаторн. массив суммарный

Line_5[], // Инд.массив суммарный сглаженный

Sh_1, Sh_2, Sh_3; // Колич.баров для расч. скоростей

//--------------------------------------------------------------- 4 --

int init() // Специальная функция 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);// Стиль линии

//--------------------------------------------------------------- 5 --

switch(Period()) // Расчёт коэффициентов для..

{ //.. различных ТФ

case 1: K2=5;K3=15; break;// Таймфрейм М1

case 5: K2=3;K3= 6; break;// Таймфрейм М5

case 15: K2=2;K3= 4; break;// Таймфрейм М15

case 30: K2=2;K3= 8; break;// Таймфрейм М30

case 60: K2=4;K3=24; break;// Таймфрейм H1

case 240: K2=6;K3=42; break;// Таймфрейм H4

case 1440: K2=7;K3=30; break;// Таймфрейм D1

case 10080: K2=4;K3=12; break;// Таймфрейм W1

case 43200: K2=3;K3=12; break;// Таймфрейм МN

}

//--------------------------------------------------------------- 6 --

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; // Период опорной МА для след. ТФ

//--------------------------------------------------------------- 7 --

return; // Выход из спец. функции init()

}

//--------------------------------------------------------------- 8 --

int start() // Специальная функция start()

{

//--------------------------------------------------------------- 9 --

double

MA_0, MA_02, MA_03, // Опорные МА для разных ТФ

MA_c, MA_p, // Текущее и предыдущ. знач. МА

Sum; // Техн.параметр для накопл. суммы

int

i, // Индекс бара

n, // Формальн. параметр(индекс бара)

Counted_bars; // Количество просчитанных баров

//-------------------------------------------------------------- 10 --

Counted_bars=IndicatorCounted(); // Количество просчитанных баров

i=Bars-Counted_bars-1; // Индекс первого непосчитанного

if (i>History-1) // Если много баров то..

i=History-1; //..рассчитывать заданное колич.

//-------------------------------------------------------------- 11 --

while(i>=0) // Цикл по непосчитанным барам

{

//-------------------------------------------------------- 12 --

MA_0=iMA(NULL,0,Period_MA_0,0,MODE_LWMA,PRICE_TYPICAL,i);

Line_0[i]=MA_0; // Значение опорной МА

//-------------------------------------------------------- 13 --

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);// Значение 1 линии скорости

//-------------------------------------------------------- 14 --

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);// Значение 2 линии скорости

//-------------------------------------------------------- 15 --

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);// Значение 3 линии скорости

//-------------------------------------------------------- 16 --

Line_4[i]=(Line_1[i]+Line_2[i]+Line_3[i])3;// Суммарный массив

//-------------------------------------------------------- 17 --

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); // Индик. массив сглаженной линии

//-------------------------------------------------------- 18 --

i--; // Расчёт индекса следующего бара

//-------------------------------------------------------- 19 --

}

return; // Выход из спец. ф-ии start()

}

//-------------------------------------------------------------- 20 --

Для расчётов индикаторных массивов трёх линий скорости используются МА с различными периодами усреднения. Период усреднения МА для текущего таймфрейма задаётся пользователем во внешней переменной 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);// Значение 1 линии скорости

Аналогичные вычисления выполняются и для построения линий скорости изменения цены для двух других таймфреймов (блоки 14-16). Опорные МА для этих массивов индикатором не отображаются. В блоке 16-17 определяются значения индикаторного массива Line_4[] для построения средней линии скорости (синяя линия), являющейся их простым средним арифметическим.

В блоке 17-18 выполняются вычисления для ещё одной средней линии скорости - сглаженной (красная жирная линия, индикаторный массив Line_5[]). Сглаживание выполняется путём простого усреднения: значение элемента индикаторного массива Line_5[] на текущем баре является средним арифметическим значений нескольких последних элементов индикаторного массива Line_4[]. В результате применения такого метода сглаживания красная индикаторная линия становится менее извилистой, но в то же время обладает некоторым запаздыванием. Количество баров для сглаживания задаётся во внешней переменной Aver_Bars.

Запустив индикатор на исполнение, в окне финансового инструмента можно наблюдать 6 индикаторных линий:




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 353; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.13 сек.