Студопедия

КАТЕГОРИИ:


Архитектура-(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). 5 страница




чёрная линия - опорная МА для построения линии скорости цены на текущем таймфрейме;

оранжевая линия - скорость изменения цены на текущем таймфрейме;

зелёная линия - скорость изменения цены на ближайшем большем таймфрейме;

коричневая линия - скорость изменения цены на следующем большем таймфрейме;

синяя линия - средняя линия скорости изменения цены;

красная линия - сглаженная средняя линия скорости изменения цены.


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

 

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

// rocseparate.mq4 (Priliv_s)

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

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

#property copyright "Copyright © SK, 2007"

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

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

#property indicator_separate_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_1=21; // Период расчётной МА

extern int Bars_V =13; // Колич.баров для расчёта скорост

extern int Aver_Bars =5; // Колич. баров для сглаживания

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

int

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

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; // Расчётн.период МА для след. ТФ

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

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

}

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

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

{

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

double

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 --

Line_0[i]=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_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);

Line_2[i]= 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);

Line_3[i]= 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 --

При внимательном рассмотрении рисунков индикаторных линий, отображаемых в отдельном окне и на ценовом графике, можно заметить некоторые отличия, которые продиктованы использованием при расчётах разных методов. Для расчётов индикаторных линий, отображаемых в основном окне, используются опорные МА, а при расчётах для отдельного окна опорные МА отсутствуют. По этой же причине наблюдается строгое совпадение по времени точек пересечения линии скорости с опорной МА в индикаторе roc.mq4 и точек пересечения линии скорости с нулевой линией в индикаторе rocseparate.mq4.


Рис. 130. Пользовательский индикатор rocseparate.mq4 позволяет наблюдать в отдельном окне график
изменения скорости на текущем, ближайшем большем и следующем большем таймфрейме, а также их среднюю.

Совместное использование программ

 

Ранее упоминалось, что, в соответствии с правилами MQL4, применение торговых функций в пользовательских индикаторах не допускается, поэтому для автоматической торговли необходимо использовать эксперт или скрипт. Однако, ресурсосберегающая технология, принятая для расчётов в индикаторах (см. Создание пользовательских индикаторов), оказывается востребованной при создании торгующих программ. В значительной части случаев в пользовательских индикаторах можно эффективно рассчитать значения элементов индикаторных массивов, необходимые для формирования в эксперте торговых критериев и принятия торговых решений.

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

Функция iCustom()

double iCustom(string symbol, int timeframe, string name,..., int mode, int shift)

Расчет указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории Каталог_терминала\experts\indicators.

Параметры:

symbol - символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe - период. Может быть одним из периодов графика. 0 означает период текущего графика.

name - имя пользовательского индикатора.

... - Список параметров (при необходимости). Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.

mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.

shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

 

Рассмотрим как практически может быть использована функция iCustom(), для этого решим следующую задачу:

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

Принцип построения пользовательского индикатора rocseparate.mq4 подробно рассмотрен в разделе Пользователський индикатор ROC. На Рис. 131 показаны две точки, в которых линия скорости изменения цены на текущем таймфрейме (М15) пересекается со средней сглаженной линией скорости изменения цены. В точке А оранжевая линия пересекает красную снизу вверх, причём место пересечения линий находится ниже уровня -0.001. В точке В оранжевая пересекает красную сверху вниз, причём точка пересечения находится выше уровня 0.001. Факт пересечения указанных линий должен быть вычислен в эксперте и расцениваться как сигнал на покупку (точка А - закрыть Sell и открыть Buy) или продажу (точка В - закрыть Buy и открыть Sell).


Рис. 131. Пересечения линий пользовательского индикатора рассматривается как торговый критерий.

При решении подобных задач можно использовать готовый эксперт, изменив в нём порядок расчёта торговых критериев. В данном случае можно взять за основу эксперт tradingexpert.mq4, представленный в разделе Простой эксперт. Эксперт shared.mq4, вычисляющий торговые критерии на основе пользовательского индикатора, будет выглядеть так:

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

// shared.mq4

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

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

#property copyright "Copyright © Book, 2007"

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

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

// М15

extern double StopLoss =100; // SL для открываемого ордера

extern double TakeProfit=35; // ТР для открываемого ордера

extern double Lots =0.1; // Жестко заданное колич. лотов

extern double Prots =0.07; // Процент свободных средств

//-------------------------------------------------------------- 1a --

extern int Period_MA_1 =56; // Период расчётной МА

extern int Bars_V =34; // Колич.баров для расчёта скор

extern int Aver_Bars =0; // Колич. баров для сглаживания

extern double Level =0.001;

//-------------------------------------------------------------- 1b --

bool Work=true; // Эксперт будет работать.

string Symb; // Название финанс. инструмента

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

int start()

{

int

Total, // Количество ордеров в окне

Tip=-1, // Тип выбран. ордера (B=0,S=1)

Ticket; // Номер ордера

double

MA_1_t, // Значен. МА_1 текущее

MA_2_t, // Значен. МА_2 текущее

Lot, // Колич. лотов в выбран.ордере

Lts, // Колич. лотов в открыв.ордере

Min_Lot, // Минимальное количество лотов

Step, // Шаг изменения размера лота

Free, // Текущие свободные средства

One_Lot, // Стоимость одного лота

Price, // Цена выбранного ордера

SL, // SL выбранного ордера

TP; // TP выбранного ордера

bool

Ans =false, // Ответ сервера после закрытия

Cls_B=false, // Критерий для закрытия Buy

Cls_S=false, // Критерий для закрытия Sell

Opn_B=false, // Критерий для открытия Buy

Opn_S=false; // Критерий для открытия Sell

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

// Предварит.обработка

if(Bars < Period_MA_1) // Недостаточно баров

{

Alert("Недостаточно баров в окне. Эксперт не работает.");

return; // Выход из start()

}

if(Work==false) // Критическая ошибка

{

Alert("Критическая ошибка. Эксперт не работает.");

return; // Выход из start()

}

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

// Учёт ордеров

Symb=Symbol(); // Название фин.инстр.

Total=0; // Количество ордеров

for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

{ // Анализ ордеров:

if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм

if (OrderType()>1) // Попался отложенный

{

Alert("Обнаружен отложенный ордер. Эксперт не работает.");

return; // Выход из start()

}

Total++; // Счётчик рыночн. орд

if (Total>1) // Не более одного орд

{

Alert("Несколько рыночных ордеров. Эксперт не работает.");

return; // Выход из start()

}

Ticket=OrderTicket(); // Номер выбранн. орд.

Tip =OrderType(); // Тип выбранного орд.

Price =OrderOpenPrice(); // Цена выбранн. орд.

SL =OrderStopLoss(); // SL выбранного орд.

TP =OrderTakeProfit(); // TP выбранного орд.

Lot =OrderLots(); // Количество лотов

}

}

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

// Торговые критерии

int H= 1000; // Колич.баров в расчётной истории

int P= Period_MA_1; // Период расчётной МА

int B= Bars_V; // Колич.баров для расчёта скорост

int A= Aver_Bars; // Колич. баров для сглаживания

//-------------------------------------------------------------- 5a --

double L_1=iCustom(NULL,0,"rocseparate",H,P,B,A,1,0);

double L_5=iCustom(NULL,0,"rocseparate",H,P,B,A,5,0);

//-------------------------------------------------------------- 5b --

if (L_5<=-Level && L_1>L_5)

{

Opn_B=true; // Критерий откр. Buy

Cls_S=true; // Критерий закр. Sell

}

if (L_5>=Level && L_1<L_5)

{

Opn_S=true; // Критерий откр. Sell

Cls_B=true; // Критерий закр. Buy

}

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

// Закрытие ордеров

while(true) // Цикл закрытия орд.

{

if (Tip==0 && Cls_B==true) // Открыт ордер Buy..

{ //и есть критерий закр

Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");

RefreshRates(); // Обновление данных

Ans=OrderClose(Ticket,Lot,Bid,2); // Закрытие Buy

if (Ans==true) // Получилось:)

{

Alert ("Закрыт ордер Buy ",Ticket);

break; // Выход из цикла закр

}

if (Fun_Error(GetLastError())==1) // Обработка ошибок

continue; // Повторная попытка

return; // Выход из start()

}

 

if (Tip==1 && Cls_S==true) // Открыт ордер Sell..

{ // и есть критерий закр

Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");

RefreshRates(); // Обновление данных

Ans=OrderClose(Ticket,Lot,Ask,2); // Закрытие Sell

if (Ans==true) // Получилось:)

{

Alert ("Закрыт ордер Sell ",Ticket);

break; // Выход из цикла закр

}

if (Fun_Error(GetLastError())==1) // Обработка ошибок

continue; // Повторная попытка

return; // Выход из start()

}

break; // Выход из while

}

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

// Стоимость ордеров

RefreshRates(); // Обновление данных

Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов

Free =AccountFreeMargin(); // Свободн средства

One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота

Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера

 

if (Lots > 0) // Если заданы лоты,то

Lts =Lots; // с ними и работаем

else // % свободных средств

Lts=MathFloor(Free*ProtsOne_LotStep)*Step;// Для открытия

 

if(Lts < Min_Lot) Lts=Min_Lot; // Не меньше минимальн

if (Lts*One_Lot > Free) // Лот дороже свободн.

{

Alert(" Не хватает денег на ", Lts," лотов");

return; // Выход из start()

}

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

// Открытие ордеров

while(true) // Цикл закрытия орд.

{

if (Total==0 && Opn_B==true) // Открытых орд. нет +

{ // критерий откр. Buy

RefreshRates(); // Обновление данных

SL=Bid - New_Stop(StopLoss)*Point; // Вычисление SL откр.

TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр.

Alert("Попытка открыть Buy. Ожидание ответа..");

Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy

if (Ticket > 0) // Получилось:)

{

Alert ("Открыт ордер Buy ",Ticket);

return; // Выход из start()

}

if (Fun_Error(GetLastError())==1) // Обработка ошибок

continue; // Повторная попытка

return; // Выход из start()

}

if (Total==0 && Opn_S==true) // Открытых орд. нет +

{ // критерий откр. Sell

RefreshRates(); // Обновление данных

SL=Ask + New_Stop(StopLoss)*Point; // Вычисление SL откр.

TP=Ask - New_Stop(TakeProfit)*Point; // Вычисление TP откр.

Alert("Попытка открыть Sell. Ожидание ответа..");

Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Открытие Sel

if (Ticket > 0) // Получилось:)

{

Alert ("Открыт ордер Sell ",Ticket);

return; // Выход из start()

}

if (Fun_Error(GetLastError())==1) // Обработка ошибок

continue; // Повторная попытка

return; // Выход из start()

}

break; // Выход из while

}

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

return; // Выход из start()

}

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

int Fun_Error(int Error) // Ф-ия обработ ошибок

{

switch(Error)

{ // Преодолимые ошибки

case 4: Alert("Торговый сервер занят. Пробуем ещё раз..");

Sleep(3000); // Простое решение

return(1); // Выход из функции

case 135:Alert("Цена изменилась. Пробуем ещё раз..");

RefreshRates(); // Обновим данные

return(1); // Выход из функции

case 136:Alert("Нет цен. Ждём новый тик..");

while(RefreshRates()==false) // До нового тика

Sleep(1); // Задержка в цикле

return(1); // Выход из функции

case 137:Alert("Брокер занят. Пробуем ещё раз..");

Sleep(3000); // Простое решение

return(1); // Выход из функции

case 146:Alert("Подсистема торговли занята. Пробуем ещё..");

Sleep(500); // Простое решение

return(1); // Выход из функции

// Критические ошибки

case 2: Alert("Общая ошибка.");

return(0); // Выход из функции

case 5: Alert("Старая версия терминала.");

Work=false; // Больше не работать

return(0); // Выход из функции

case 64: Alert("Счет заблокирован.");

Work=false; // Больше не работать

return(0); // Выход из функции

case 133:Alert("Торговля запрещена.");

return(0); // Выход из функции

case 134:Alert("Недостаточно денег для совершения операции.");

return(0); // Выход из функции

default: Alert("Возникла ошибка ",Error); // Другие варианты

return(0); // Выход из функции

}

}

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

int New_Stop(int Parametr) // Проверка стоп-прик.

{

int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция

if (Parametr<Min_Dist) // Если меньше допуст.

{

Parametr=Min_Dist; // Установим допуст.

Alert("Увеличена дистанция стоп-приказа.");

}

return(Parametr); // Возврат значения

}

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

Рассмотрим какие преобразования внесены в исходный код (tradingexpert.mq4). Значительная часть кода эксперта, взятого за основу, не изменилась. Изменения внесены в два блока - блок 1-2 и блок 5-6.

В блоке 5-6 рассчитываются торговые критерии. В представленном эксперте торговая стратегия построена на основе всего двух торговых критериев - критерия открытия Buy и критерия открытия Sell. Принятая в эксперте стратегия предусматривает возможность одновременного присутствия в торговле только одного рыночного ордера, отложенные ордера не допускаются. Стратегия предполагает также закрытие противоположного ордера при срабатывании критерия открытия; например, если значимым является критерий для открытия Buy, то это также означает, что необходимо закрыть Sell.

Для того, чтобы в эксперте shared.mq4 использовать результаты вычислений, выполненных в пользовательском индикаторе rocseparate.mq4, необходимо исполнить функцию iCustom():

double L_1 = iCustom(NULL,0,"rocseparate",H,P,B,A,1,0);
double L_5 = iCustom(NULL,0,"rocseparate",H,P,B,A,5,0);

В данном случае формальные параметры, указанные в вызове функции iCustom(), означают следующее:

NULL - расчёты в индикаторе осуществляются на основе данных по текущему финансовому инструменту; в данном случае эксперт прикреплён в оно EURUSD, значит будут использованы данные по EURUSD (см. Рис. 131);

0 - при расчётах используются данные, соответствующие текущему таймфрейму; в данном случае текущий таймфрейм М15, значит будут использованы данные, соответствующие М15;

"rocseparate" - название пользовательского индикатора, в котором будут выполнены расчёты.

H,P,B и A - список настраиваемых параметров. В данном случае пользовательский индикатор rocseparate.mq4 имеет настраиваемые параметры (блок 2-3 в коде rocseparate.mq4). Для того, чтобы предоставить пользователю возможность настраивать значения этих параметров из эксперта, они указаны в списке передаваемых параметров функции iCustom(). В эксперте могут быть определены значения этих параметров, не совпадающие по значению с теми, что указаны в индикаторе, и при выполнении расчётов в индикаторе будут использоваться именно эти переданные значения. Эти параметры означают следующее:

H - количество баров в расчётной истории;

P - период расчётной МА;

B - количество баров для расчёта скорости;

A - количество баров для сглаживания.

(подробное объяснение сущности указанных параметров см. в разделе Пользователський индикатор ROC).

1 (5) - индекс линии индикатора. В пользовательском индикаторе rocseparate.mq4 используется 6 индикаторных массивов. Линия скорости изменения цены на текущем таймфрейме (оранжевая) строится на основе значений индикаторного массива Line_1[], для которого используется буфер с индексом 1. Средняя сглаженная линия скорости строится на основе значений элементов массива Line_5[], индекс используемого буфера 5.

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

Для того, чтобы предоставить пользователю возможность вручную в эксперте изменять настраиваемые параметры индикатора, в блоке 1а-1b (эксперта) указаны внешние переменные. В блоке 5-5а значения этих настраиваемых параметров переприсвоены другим переменным с более короткими именами - это сделано для удобства представления кода в блоке 5а-5b. Таким образом, пользователь может по своему усмотрению указать в эксперте shared.mq4 параметры, при которых будут производиться расчёты в пользовательском индикаторе rocseparate.mq4. После исполнения функция iCustom() вернёт значение, соответствующее значению заданного элемента индикаторного массива, вычисленного в заданном индикаторе при заданных значениях настраиваемых параметров.

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




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


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


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



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




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