Студопедия

КАТЕГОРИИ:


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




if (Mas_Ord_Old[old][6]> 1)

Inform(3, Mas_Ord_Old[old][4]); // Отложен. ордер удалён

}

}

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

// Поиск новых ордеров

for(new=1; new<=Mas_Ord_New[0][0]; new++)// По массиву новых орд.

{

if (Mas_Ord_New[new][8]>0) //Это не новый,а переоткр

continue; //..или частично закрытый

Conc_Nom_Ord=false; // Пока совпадения нет

for(old=1; old<=Mas_Ord_Old[0][0]; old++)// Поищем этот ордерок

{ //..в массиве старых

if (Mas_Ord_New[new][4]==Mas_Ord_Old[old][4])//Совпал номер..

{ //.. ордера

Conc_Nom_Ord=true; // Ордер найден,..

break; //..значит выходим из..

} //.. внутреннего цикла

}

if (Conc_Nom_Ord==false) // Если совпадения нет,..

{ //..то ордер новый:)

if (Mas_Ord_New[new][6]==0)

Inform(4, Mas_Ord_New[new][4]); // Ордер Buy открыт

if (Mas_Ord_New[new][6]==1)

Inform(5, Mas_Ord_New[new][4]); // Ордер Sell открыт

if (Mas_Ord_New[new][6]> 1)

Inform(6, Mas_Ord_New[new][4]); // Установлен отлож.ордер

}

}

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

return;

}

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

В блоке 1-2 описаны глобальные массивы и переменные, необходимые для исполнения функции. В блоке 2-3 открыта переменная Conc_Nom_Ord, используемая в дальнейшем коде для анализа состава ордеров.

Функция отслеживает изменение минимальной дистанции для установки ордеров и стоп-приказов. Для этого при каждом исполнении функции (блок 3-4) сначала вычисляется текущее значение минимальной дистанции Level_new, а затем оно сравнивается с предыдущим значением минимальной дистанции Level_old (полученным в период предыдущего исполнения функции). Если значения этих переменных не равны, значит незадолго до последнего исполнения функции минимальная дистанция была изменена дилинговым центром. В этом случае переменной Level_old присваивается текущее значение минимальной дистанции (чтобы учесть при последующих исполнениях функции) и исполняется функция Inform() с целью вывести необходимое сообщение.

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

В блоках 4-10 выполняется анализ состояния рыночных и отложенных ордеров. Информация о большинстве событий, связанных с изменениями ордеров, доводится до сведения пользователя. Анализ выполняется в два этапа. На первом этапе выявляются изменения, касающиеся пропавших (закрытых или удалённых), поменявших тип, частично закрытых и переоткрытых ордеров (блок 4-9). На втором этапе (блок 9-10) осуществляется поиск новых ордеров.

В блоке 4-9 производится анализ ордеров, учтённых в массиве Mas_Ord_Old. Количество итераций во внешнем цикл for устанавливается в соответствии с общим количеством ордеров в этом массиве (элемент массива Mas_Ord_Old[0][0]). Для того чтобы определить, сохранился ли ордер на текущий момент, необходимо найти аналогичный ордер в массиве ордеров Mas_Ord_New. Этот поиск выполняется во внутреннем цикле for (блок 6-8), количество итераций которого равно количеству ордеров в массиве (элемент массива Mas_Ord_New[0][0]). В дальнейшем изложении массив Mas_Ord_Old именуется старым массивом, а Mas_Ord_New - новым.

В блоках 6-8 выполняется поиск только тех ордеров, характеристики которых отличаются. Например, в блоке 6-7 производится проверка ордера по его номеру (см. соответствие индексов массивов характеристикам ордеров в Таблице 4). Если исследуемый ордер из старого массива совпал по номеру с одним из ордеров нового массива, то этот ордер, по крайней мере не закрыт (или удалён). При этом необходимо выяснить также, не поменялся ли тип ордера. И если тип ордера изменился, значит отложенный ордер преобразовался в рыночный. В этом случае с помощью функции Inform() выводится необходимое сообщение. Независимо от факта изменения (или сохранения) типа ордера дальнейшие исследования этого ордера прекращаются: осуществляется выход из внутреннего цикла и, в конечном счёте, начало новой итерации внешнего цикла.

Если при исполнении блока 6-7 обнаружено, что исследуемый ордер из старого массива не совпал по номеру ни с одним из ордеров нового массива, то управление передаётся в блок 7-8. Здесь выясняется, есть ли у текущего ордера из нового массива ненулевой MagicNumber (все ордера, открываемые и устанавливаемые экспертом, имеют ненулевой MagicNumber). Если MagicNumber есть и он совпадает с MagicNumber исследуемого ордера из старого массива, значит исследуемый ордер присутствует в торговле, но претерпел какие-то преобразования. Преобразования, связанные с изменением номера ордера, возникают в двух случаях.

Случай 1. Если ордер частично закрыт. Частичное закрытие рыночного ордера (для отложенных ордеров не предусмотрено) в соответствии с технологией, принятой в среде МТ4, выполняется в два этапа. На первом этапе полностью закрывается исходный ордер в полном объёме. В этот же момент открывается новый рыночный ордер в объёме остаточной стоимости, с тем же курсом открытия и заявленными ценами стоп-приказов, что и у исходного. Этот новый ордер получает свой уникальный номер ордера, не совпадающий с номером исходного частично закрываемого ордера.

Случай 2. Если ордер переоткрыт дилинговым центром. Некоторые банки (в связи со специфическим порядком внутреннего учёта) в конце каждого рабочего дня принудительно закрывают все рыночные ордера и в тот же момент открывают рыночные ордера того же типа на то же количество лотов, но уже по текущему курсу за вычетом свопа. Это событие не оказывает никакого влияния на экономический результат по игровому счёту. Каждый из вновь открытых ордеров также получает свой уникальный номер, не совпадающий с номерами закрытых ордеров.

Разница между рассмотренными случаями заключается в новом количестве лотов для новых ордеров - в первом случае количество лотов уменьшается, во втором случае не изменяется. Это различие используется в блоке 7-8 для того, чтобы отличать причину преобразования ордера. В том и другом случае выводится соответствующее сообщение (ордер частично закрыт или ордер переоткрыт).

Если к моменту полного окончания внутреннего цикла не удалось выявить признаки совпадения (блок 6-7) или наследования (блок 7-8) ордера в новом массиве, значит исследуемый ордер из старого массива ордеров закрыт или удалён. В этом случае управление передаётся в блок 8-9, где в зависимости от типа ордера выводится то или иное сообщение. В данном примере реализовано три варианта сообщений - для ордера Buy, ордера Sell и отложенных ордеров независимо от их типа. В общем случае этот порядок может быть несколько изменён (дополнен) - возможно создание группы соответствующих сообщений для каждого из типов отложенных ордеров.

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

Если ордер не содержит комментарий, то выполняется поиск ордера с таким же номером в массиве старых ордеров. В случае, если во внутреннем цикле for среди старых ордеров обнаружен ордер с таким номером, значит он не новый, а был открыт ранее. Если же номер исследуемого ордера из нового массива не совпадает ни с одним из номеров ордеров в старом массиве, значит этот ордер - открытый рыночный или установленный отложенный. В нижней части блока 9-10, в зависимости от типа ордера, выполняется обращение к функции Inform() для вывода необходимого сообщения.

Использование рассматриваемой функции Events() на практике оказывается очень полезным. Однажды применив функцию в советнике, программист обычно использует её и в дальнейшем. Отдельно нужно заметить, что функции Events() и Terminal() тесно связаны между собой. Если предполагается вносить изменения в одну из этих функций (например, использовать другие названия глобальных массивов), то соответствующие изменения необходимы и в другой функции. Если для реализации торговой стратегии используются комментарии в ордерах, то следует иначе обрабатывать признак наследования ордера (блок 9-10), а именно, с помощью строковых функций проанализировать текст комментария к ордеру.

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

Функция определения количества лотов

 

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

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

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

Вариант 1. Количество лотов для новых ордеров задаётся пользователем вручную.

Вариант 2. Количество лотов вычисляется в зависимости от количества выделенных пользователем средств. Количество выделенных средств задаётся в виде процента от суммы свободных средств.

Пользовательская функция Lot()

bool Lot()

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

Функция использует значения глобальных переменных:

Lots - количество лотов, заданное пользователем;

Percent - процент от свободных средств, заданный пользователем.

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

Функция определения количества лотов Lot() оформлена в виде включаемого файла Lot.mqh:

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

// Lot.mqh

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

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

// Функция вычисления количества лотов.

// Глобальные переменные:

// double Lots_New - количество лотов для новых ордеров (вычисляется)

// double Lots - желаемое количество лотов, заданное пользовател.

// int Percent - процент средств, заданный пользователем

// Возвращаемые значения:

// true - если средств хватает на минимальный лот

// false - если средств не хватает на минимальный лот

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

bool Lot() // Позовательская ф-ия

{

string Symb =Symbol(); // Финансовый инструм.

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

double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов

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

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

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

if (Lots>0) // Лоты заданы явно..

{ //..проверим это

double Money=Lots*One_Lot; // Стоимость ордера

if(Money<=AccountFreeMargin()) // Средств хватает..

Lots_New=Lots; //..принимаем заданное

else // Если не хватает..

Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов

}

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

else // Если лоты не заданы

{ //..то берём процент

if (Percent > 100) // Задано ошибочно..

Percent=100; //.. то не более 100

if (Percent==0) // Если установлен 0..

Lots_New=Min_Lot; //..то минимальный лот

else // Желаем. колич.лотов:

Lots_New=MathFloor(Free*Percent/100/One_Lot/Step)*Step;//Расч

}

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

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

Lots_New=Min_Lot; //.. то миниамальный

if (Lots_New*One_Lot > AccountFreeMargin()) // Не хватает даже..

{ //..на минимальн. лот:(

Inform(11,0,Min_Lot); // Сообщение..

return(false); //..и выход

}

return(true); // Выход из польз. ф-ии

}

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

Функция имеет простой код. В блоке 1-2 описаны глобальные переменные и возвращаемые значения. В блоке 2-3 вычислены значения некоторых переменных. Для расчёта принят следующий приоритет устанавливаемых значений: если пользователь задал ненулевое количество лотов, то значение процента от свободных средств не принимается во внимание. Внешние переменные Lots и Percent объявлены во включаемом файле Variables.mqh.

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

Управление передаётся в блок 4-5 в случае, если пользователь установил нулевое количество лотов. При этом принимается во внимание процент свободных средств, указанный пользователем во внешней переменной Percent. Выполняется проверка: если указанное значение больше ста (процентов), то в расчётах используется значение 100. Если пользователь указал нулевое значение переменной Percent, то количество лотов приравнивается минимально возможному значению, установленному в дилинговом центре. Для всех промежуточных величин высчитывается количество лотов, соответствующее количеству выделенных пользователем средств.

В блоке 5-6 выполняется необходимая проверка. Если вычисленное количество лотов оказывается меньше, чем минимально допустимое (например, нулевое значение может быть получено в блоке 4-5, если пользователь указал малое значение переменной Percent), то переменной Lots_New присваивается минимальное значение. Далее проверяется, достаточно ли свободных средств для открытия ордера в объёме ранее вычисленного количества лотов (на счёте может быть недостаточно средств). Если имеющихся средств не хватает, то после сообщения пользователю о недостатке средств осуществляется выход из функции, при этом функция возвращает значение false. Если же проверка прошла успешно, то возвращается значение true.

Функция определения торговых критериев

 

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

В общем случае могут быть определены следующие критерии:

критерий для открытия рыночного ордера;

критерий для закрытия рыночного ордера;

критерий для частичного закрытия рыночного ордера;

критерий для встречного закрытия рыночных ордеров;

критерий для модификации заявленных цен стоп-приказов рыночного ордера;

критерий для установки отложенного ордера;

критерий для удаления отложенного ордера;

критерий для модификации заявленной цены открытия отложенного ордера;

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

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

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

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

Пользовательская функция Criterion()

int Criterion()

Функция вычисляет торговые критерии. Функция возвращает следующие значения:
10 - сработал торговый критерий для открытия рыночного ордера Buy;
20 - сработал торговый критерий для открытия рыночного ордера Sell;
11 - сработал торговый критерий для закрытия рыночного ордера Buy;
21 - сработал торговый критерий для закрытия рыночного ордера Sell;
0 - значимых критериев нет;
-1 - используемый финансовый инструмент не является EURUSD.

Функция использует значения следующих внешних переменных:
St_min - нижний уровень индикатора Stochastic Oscillator;
St_max - верхний уровень индикатора Stochastic Oscillator;
Open_Level - уровень индикатора MACD (для открытия ордеров);
Close_Level - уровень индикатора MACD (для закрытия ордеров).

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

Функция определения торговых критериев Criterion() оформлена в виде включаемого файла Criterion.mqh:

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

// Criterion.mqh

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

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

// Функция вычисления торговых критериев.

// Возвращаемые значения:

// 10 - открытие Buy

// 20 - открытие Sell

// 11 - закрытие Buy

// 21 - закрытие Sell

// 0 - значимых критериев нет

// -1 - используется другой финансовый инструмент

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

// Внешние переменные:

extern int St_min=30; // Миним. уровень стохастика

extern int St_max=70; // Максим. уровень стохастика

extern double Open_Level =5; // Уровень MACD для откр.(+/-)

extern double Close_Level=4; // Уровень MACD для закр.(+/-)

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

int Criterion() // Пользовательская функция

{

string Sym="EURUSD";

if (Sym!=Symbol()) // Если не наш фин. инструмент

{

Inform(16); // Сообщение..

return(-1); //.. и выход

}

double

M_0, M_1, // Значение MAIN на 0 и 1 барах

S_0, S_1, // Значение SIGNAL на 0 и 1 бар

St_M_0, St_M_1, // Значение MAIN на 0 и 1 барах

St_S_0, St_S_1; // Значение SIGNAL на 0 и 1 бар

double Opn=Open_Level*Point; // Уровень откр. MACD (пунктов)

double Cls=Close_Level*Point; // Уровень закр. MACD (пунктов)

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

// Параметры технич. индикат:

M_0=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_MAIN,0); // 0 бар

M_1=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_MAIN,1); // 1 бар

S_0=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);//0 бар

S_1=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);//1 бар

 

St_M_0=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN, 0);

St_M_1=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN, 1);

St_S_0=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);

St_S_1=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);

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

// Вычисление торговых критериев

if(M_0>S_0 && -M_0>Opn && St_M_0>St_S_0 && St_S_0<St_min)

return(10); // Открытие Buy

if(M_0<S_0 && M_0>Opn && St_M_0<St_S_0 && St_S_0>St_max)

return(20); // Открытие Sell

if(M_0<S_0 && M_0>Cls && St_M_0<St_S_0 && St_S_0>St_max)

return(11); // Закрытие Buy

if(M_0>S_0 && -M_0>Cls && St_M_0>St_S_0 && St_S_0<St_min)

return(21); // Закрытие Sell

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

return(0); // Выход из пользов. функции

}

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

В блоке 1-2 описаны значения, возвращаемые функцией. В блоке 2-3 объявлены некоторые внешние переменные. Включаемый файл Criterion.mqh - единственный файл, используемый в рассматриваемом эксперте, в котором объявлены глобальные (в данном случае - внешние) переменные. В разделе Структура обычной программы приведены причины, указывающие на необходимость объявления всех без исключения глобальных переменных в отдельном файле Variables.mqh. В данном случае внешние переменные объявлены в файле Criterion.mqh по двум причинам: во-первых, для того, чтобы продемонстрировать техническую возможность (такая возможность бывает не всегда), во-вторых, для того, чтобы показать, как можно использовать внешние переменные в период отладки и тестирования программы.

Техническая возможность объявления внешних переменных в файле Criterion.mqh существует потому, что эти переменные ни в каких других функциях программы не используются. Значения внешних переменных, объявленных в блоке 2-3, определяют уровни для индикаторов Stochastic Oscillator и MACD и используются только в рассматриваемой функции Criterion(). Объявление внешних переменных в файле, содержащем функцию определения торговых критериев, может быть оправдано в случае, если файл с таким содержанием используется временно, а именно, в течение периода отладки программы и вычисления оптимальных значений этих внешних переменных. Для этой цели можно ввести и другие внешние переменные, например, для оптимизации параметров индикаторов (в данном случае константами заданы значения 12,26,9 для MACD и 5,3,3 для Stochastic Oscillator). По окончании работы над программой указанные внешние переменные могут быть удалены из программы, а вместо них в программе должны использоваться константы со значениями, вычисленными во время оптимизации.

В блоке 3-4 открыты и описаны локальные переменные. Эксперт предназначен для использования на финансовом инструменте EURUSD, поэтому в блоке 3-4 выполняется необходимая проверка. Если эксперт запущен в окне другого финансового инструмента, то функция заканчивает работу и возвращает значение -1 (не тот инструмент).

В программе используются значения двух индикаторов, вычисленные на текущем и предыдущем барах (блок 4-5). При обычном применении индикаторов Stochastic Oscillator и MACD сигналы на покупку и продажу образуются в момент пересечения двух индикаторных линий. В данном случае для определения торговых критериев используются одновременно два индикатора. Вероятность того, что в некоторый момент времени произойдёт пересечение индикаторных линий одновременно в двух индикаторах, очень невелика. Более вероятно, что пересечения могут произойти последовательно одно за другим - сначала в одном индикаторе, а несколько позднее - в другом. В случае, если пересечения индикаторных линий происходят через небольшой промежуток времени, можно считать, что вместе два индикатора сформировали торговый критерий.

Например, критерий на покупку вычисляется так (блок 5-6):

if(M_0>S_0 && -M_0>Opn && St_M_0>St_S_0 && St_S_0<St_min)

В соответствии с этой записью, критерий на покупку является значимым, если соблюдаются условия:

в индикаторе MACD индикаторная линия MAIN (гистограмма) находится выше индикаторной линии SIGNAL и при этом находится ниже нижнего уровня Open_Level, (Рис. 157);

в индикаторе Stochastic Oscillator индикаторная линия MAIN находится выше индикаторной линии SIGNAL и при этом находится ниже минимального уровня St_min (Рис. 158).


Рис. 157. Необходимое условие положения индикаторных линий MACD для подтверждения факта значимости торговых критериев для открытия и закрытия ордеров.

В левой части Рис. 157 показано положение индикаторных линий MACD, при котором срабатывают два критерия - открытие Buy и закрытие Sell. Индикаторная линия MAIN находится ниже уровня 0.0005 в период времени T1 = t 1 - t 0. Если в этот период сложатся необходимые показания индикатора Stochastic Oscillator, то сработает критерий для открытия Buy. В течение времени T2 = t 2 - t 0 линия MAIN находится также ниже уровня 0.0004. Если в это время произойдёт подтверждение индикатора Stochastic Oscillator, то сработает критерий для закрытия Sell.

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

В данном случае (согласно рассматриваемой торговой стратегии) приоритет у критерия открытия Buy выше, чем у критерия закрытия Sell. Поэтому в блоке 5-6 программная строка, в которой вычисляется критерий для открытия ордера Buy находится выше по тексту. Если в период T1 (Рис. 157) получено подтверждение индикатора Stochastic Oscillator, то функция возвращает значение 10, поставленное в соответствие этому критерию. В период времени с момента t 1 до момента t 2 функция вернёт значение 21, поставленное в соответствие критерию закрытия Sell.

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




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


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


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



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




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