Студопедия

КАТЕГОРИИ:


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




Условия, при которых срабатывает подтверждение индикатора Stochastic Oscillator, показаны на Рис. 158.


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

Согласно программному коду, указанному в блоке 5-6, критерии для открытия Buy и закрытия Sell могут оказаться значимыми при условии, если в индикаторе Stochastic Oscillator индикаторная линия MAIN окажется выше сигнальной линии SIGNAL, причём линия MAIN будет находиться ниже минимального уровня St_min. На Рис. 158 такие условия складываются в течение периода времени Ts. Зеркальные условия подтверждают срабатывание критериев для открытия ордера Sell и закрытия ордеров Buy (в правой части Рис. 158). Если ни один из критериев не сработал, то функция возвращает 0. При этих условиях могут выполняться другие торговые операции, например, корректировка заявленных значений стоп-приказов.

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

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

Торговые функции

 

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

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

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

открытие рыночного ордера заданного типа;

закрытие одного рыночного ордера заданного типа;

частичное закрытие одного рыночного ордера заданного типа;

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

встречное закрытие двух рыночных ордеров в заданном объёме;

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

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

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

удаление одного отложенного ордера заданного типа;

удаление всех отложенных ордеров заданного типа;

удаление всех отложенных ордеров;

модификация отложенного ордера заданного типа.

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

Пользовательская управляющая торговая функция Trade()

int Trade(int Trad_Oper)

Основная функция, реализующая стратегию.

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

Для исполнения функции требуются следующие торговые функции:

Close_All() - функция закрытия всех рыночных ордеров заданного типа;

Open_Ord() - функция открытия одного рыночного ордера заданного типа;

Tral_Stop() - функция модификации StopLoss рыночного ордера заданного типа;

Lot() - функция определения количества лотов для новых ордеров.

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

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

// Trade.mqh

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

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

// Торговая функция.

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

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

{

// Trad_Oper - тип торговой операции:

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

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

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

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

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

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

switch(Trad_Oper)

{

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

case 10: // Торговый критерий = Buy

Close_All(1); // Закрыть все Sell

if (Lot()==false) // Средств не хватает на миним.

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

Open_Ord(0); // Открыть Buy

return; // Поторговали - уходим

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

case 11: // Торг. крит. = закрытие Buy

Close_All(0); // Закрыть все Buy

return; // Поторговали - уходим

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

case 20: // Торговый критерий = Sell

Close_All(0); // Закрыть все Buy

if (Lot()==false)

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

Open_Ord(1); // Открыть Sell

return; // Поторговали - уходим

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

case 21: // Торг. крит. = закрытие Sell

Close_All(1); // Закрыть все Sell

return; // Поторговали - уходим

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

case 0: // Удержание открытых позиций

Tral_Stop(0); // Трейлинг стоп Buy

Tral_Stop(1); // Трейлинг стоп Sell

return; // Поторговали - уходим

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

}

}

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

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

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

В разделе Функция определения торговых критериев указывалось, что по некоторым торговым критериям может быть сформировано несколько различных торговых приказов. Так, в случае, если значимым является торговый критерий на покупку (значение переменной Trad_Oper равно 10), то при исполнении оператора switch() управление передаётся на метку case 10 (блок 2-3). В этом случае сначала вызывается торговая функция Close_All(1). Исполнение этой функции приводит к закрытию всех рыночных ордеров Sell, открытых по финансовому инструменту EURUSD. После того, как все ордера Sell закрыты, выполняется проверка достаточности средств для совершения следующей торговой операции. Для этого вызывается пользовательская функция Lot() (см. раздел Функция определения количества лотов). Если эта функция возвращает false, значит имеющихся средств недостаточно даже для открытия ордера Buy на минимально допустимое количество лотов. В этом случае функция Trade() заканчивает свою работу. Если же средств достаточно, то вызывается торговая функция Open_Ord(0) для открытия одного рыночного ордера Buy на такое количество лотов, которое вычислено при исполнении функции Lot(). Указанная совокупность действий являет реакцию эксперта на сложившуюся ситуацию на рынке (в соответствии с данным торговым критерием).

Если значимым является критерий, указывающий на необходимость закрытия рыночных ордеров Buy, то управление передаётся на метку case 11, в блок 3-4. В этом случае вызывается для исполнения всего одна функция Close_All(0) для закрытия всех имеющихся рыночных ордеров типа Buy. Блоки 4-6 составлены аналогично блокам 2-4, управление вариантам case 20 и case 21 передаётся в случаях, если значимыми являются критерии на продажу или закрытие рыночных ордеров Sell.

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

Если при исполнении функции Criterion() определено, что ни один из торговых критериев не является значимым (переменная Trad_Oper равна 0), то управление передаётся на метку case 0, в результате чего дважды вызывается для исполнения функция Tral_Stop() для модификации заявленных значений рыночных ордеров разных типов. Реализованная в эксперте торговая стратегия допускает наличие только одного рыночного ордера, поэтому порядок следования вызовов функций Tral_Stop(0) и Tral_Stop(1) не имеет значения. В данном случае сделан случайный выбор.

В случае, если функция Criterion() вернула значение -1, то это означает, что эксперт прикреплён в окно финансового инструмента, не являющегося EURUSD. В этом случае функция Trade() не осуществляет вызов каких-либо исполнительных торговых функций и возвращает управление вызвавшей её специальной функции start().

 

Пользовательская исполнительная торговая функция Close_All()

int Close_All(int Tip)

Функция закрывает все рыночные ордера указанного типа.

Параметр Tip может принимать следующие значения, соответствующие типу закрываемых ордеров:
0 - тип закрываемых ордеров Buy;
1 - тип закрываемых ордеров Sell.

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

Используются значения глобальных массивов:

Mas_Ord_New - массив характеристик ордеров на момент последнего исполнения функции Terminal();

Mas_Tip - массив количества ордеров всех типов на момент последнего исполнения функции Terminal().

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

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

// Close_All.mqh

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

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

// Функция закрытия всех рыночных ордеров указанного типа

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

// Mas_Ord_New Массив ордеров последний известный

// Mas_Tip Массив типов ордеров

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

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

{

// int Tip // Тип ордера

int Ticket=0; // Номер ордера

double Lot=0; // Количество закр. лотов

double Price_Cls; // Цена закрытия ордера

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

while(Mas_Tip[Tip]>0) // До тех пор, пока есть..

{ //.. ордера заданного типа

for(int i=1; i<=Mas_Ord_New[0][0]; i++)// Цикл по живым ордерам

{

if(Mas_Ord_New[i][6]==Tip && // Среди ордеров нашего типа

Mas_Ord_New[i][5]>Lot) //.. выбираем самый дорогой

{ // Этот больше ранее найден.

Lot=Mas_Ord_New[i][5]; // Наибольший найденный лот

Ticket=Mas_Ord_New[i][4]; // Номер его ордера такой

}

}

if (Tip==0) Price_Cls=Bid; // Для ордеров Buy

if (Tip==1) Price_Cls=Ask; // Для ордеров Sell

Inform(12,Ticket); // Сообщение о попытке закр.

bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрыть ордер!:)

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

if (Ans==false) // Не получилось:(

{ // Поинтересуемся ошибками:

if(Errors(GetLastError())==false)// Если ошибка непреодолимая

return; //.. то уходим.

}

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

Terminal(); // Функция учёта ордеров

Events(); // Отслеживание событий

}

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

}

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

В блоке 1-2 описаны используемые глобальные переменные, в блоке 2-3 открыты и описаны локальные переменные. Условие Mas_Tip[Tip]>0 в заголовке оператора цикла while (блоки 3-6) предполагает, что функция будет удерживать управление до тех пор, пока не выполнит своё предназначение, а именно, пока не будут закрыты все ордера заданного типа. Элемент глобального массива Mas_Tip[Tip] содержит значение, равное количеству ордеров заданного типа Tip. Например, если функция Close_All() вызвана с передаваемым параметром, равным 1, то это означает, что ей предписывается закрыть все рыночные ордера Sell (см. Типы торговых операций). В этом случае значение элемента массива Mas_Tip[1] будет равно количеству имеющихся ордеров Sell (последнему известному на момент исполнения функции Terminal()). Таким образом, оператор цикла while будет исполнен столько раз, сколько имеется ордеров Sell.

Если трейдер не вмешивается в работу эксперта (т.е. не выставляет ордера вручную), то в торговле может присутствовать только один рыночный ордер того или иного типа. Если же трейдер по своей инициативе установил дополнительно один или несколько рыночных ордеров, то при исполнении функции Close_All() должен быть соблюдён некоторый порядок закрытия ордеров. Предпочтительным является порядок закрытия ордеров от большего к меньшему. Например, если на момент начала исполнения функции Close_All() имеется три ордера Sell, причём один из них открыт на 5 лотов, другой на 1 лот, а третий - на 4 лота, то в соответствии с указанным порядком ордера будут закрыты в такой последовательности: сначала ордер в объёме 5 лотов, потом 4 лота и последним - ордер объёмом 1 лот.

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

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

Для соблюдения указанного порядка закрытия ордеров в блоке 3-4 используется цикл for, в котором среди всех ордеров заданного типа выбирается один ордер, имеющий наибольшее количество лотов. Поиск этого ордера выполняется на основе анализа значений элементов глобального массива Mas_Ord_New, содержащего информацию обо всех ордерах, присутствующих в торговле. После того, как номер этого ордера определён, в зависимости от типа ордера вычисляется заявленная цена закрытия, равная соответствующему значению последней известной двухсторонней котировки. Если тип закрываемых ордеров Buy, то следует заявлять цену закрытия в соответствии со значением Bid, а если Sell, - то Ask.

Непосредственно перед формированием торгового приказа выводится информация о попытке закрыть ордер, для этого используется вызов функции Inform(). Торговый приказ на закрытие ордера формируется в строке:

bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрыть ордер!:)

В качестве параметров используются вычисленные значения: Ticket - номер ордера, Lot - количество лотов, Price_Cls - заявленная цена закрытия, 2 - проскальзывание.

В блоке 4-5 выполняется анализ результатов выполнения торговой операции. Если функция OrderClose() вернула значение true, то это означает, что торговая операция успешно завершена, т.е ордер закрыт. В этом случае управление передаётся в блок 5-6, где обновляется информация об ордерах, имеющихся на текущий момент. После исполнения функций Terminal() и Events() текущая итерация цикла while заканчивается (за время, пока исполняется функция, в том числе, выполняются торговые операции, количество ордеров может измениться, поэтому исполнение функции учёта ордеров на каждой итерации цикла while обязательно). В случае, если в торговле ещё присутствуют ордера заданного типа, то на следующей итерации цикла while они будут закрыты, при этом для определения параметров очередного закрываемого ордера используются новые значения элементов массивов Mas_Ord_New и Mas_Tip, полученные при исполнении функции Terminal().

Если в результате исполнения торгового приказа функция OrderClose() вернула значение false, то это значит, что ордер не закрыт. Чтобы выяснить причину неудачи выполняется анализ последней ошибки, возникшей при попытке осуществления торговой операции. Для этого вызывается функция Errors() (см. раздел Функция обработки ошибок). Если при исполнении этой функции обнаруживается, что ошибка является непреодолимой (например, торговля запрещена), то функция Close_All() заканчивает работу и возвращает управление в управляющую торговую функцию Trade(), что в конечном счёте приводит к завершению исполнения специальной функции start() эксперта. На следующем тике торговый терминал снова запустит на исполнение функцию start(), и если критерий закрытия на тот момент будет ещё актуален, то это снова приведёт к вызову на исполнение функции закрытия всех ордеров Close_All().

 

Пользовательская исполнительная торговая функция Open_Ord()

int Open_Ord (int Tip)

Функция открывает один рыночный ордер указанного типа.

Параметр Tip может принимать следующие значения, соответствующие типу закрываемых ордеров:
0 - тип закрываемых ордеров Buy;
1 - тип закрываемых ордеров Sell.

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

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

Mas_Tip - массив количества ордеров всех типов на момент последнего исполнения функции Terminal();

StopLoss - значение StopLoss (количество пунктов);

TakeProfit - значение TakeProfit (количество пунктов).

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

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

// Open_Ord.mqh

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

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

// Функция открытия одного рыночного ордера указанного типа

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

// int Mas_Tip Массив типов ордеров

// int StopLoss Значение StopLoss (количество пунктов)

// int TakeProfit Значение TakeProfit (количество пунктов)

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

int Open_Ord(int Tip)

{

int Ticket, // Номер ордера

MN; // MagicNumber

double SL, // StopLoss (относит.знач.цены)

TP; // TakeProf (относит.знач.цены)

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

while(Mas_Tip[Tip]==0) // До тех пор, пока..

{ //.. не достигнут успех

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

StopLoss=Level_new; //.. то допустимый

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

TakeProfit=Level_new; //..то допустимый

MN=TimeCurrent(); // Простой MagicNumber

Inform(13,Tip); // Сообщение о попытке откр

if (Tip==0) // Будем открывать Buy

{

SL=Bid - StopLoss* Point; // StopLoss (цена)

TP=Bid + TakeProfit*Point; // TakeProfit (цена)

Ticket=OrderSend(Symbol(),0,Lots_New,Ask,2,SL,TP,"",MN);

}

if (Tip==1) // Будем открывать Sell

{

SL=Ask + StopLoss* Point; // StopLoss (цена)

TP=Ask - TakeProfit*Point; // TakeProfit (цена)

Ticket=OrderSend(Symbol(),1,Lots_New,Bid,2,SL,TP,"",MN);

}

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

if (Ticket<0) // Не получилось:(

{ // Поинтересуемся ошибками:

if(Errors(GetLastError())==false)// Если ошибка непреодолимая

return; //.. то уходим.

}

Terminal(); // Функция учёта ордеров

Events(); // Отслеживание событий

}

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

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

}

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

В блоках 1-3 функции Open_Ord() описаны глобальные переменные, значения которых используются при исполнении функции, а также открыты и описаны локальные переменные. Основной код функции сосредоточен в операторе цикла while (блоки 3-5), который исполняется до тех пор, пока в торговле нет ни одного ордера заданного типа Tip.

Торговая стратегия предполагает открытие ордеров, имеющих ненулевые стоп-приказы. В общем случае трейдер может установить такие значения стоп-приказов, которые не удовлетворяют требованиям дилингового центра, а именно меньше ограничивающей минимальной дистанции. Поэтому перед открытием ордера выполняется необходимая проверка: если последняя известная минимальная дистанция (Level_new) превышает значение внешней переменной StopLoss или TakeProfit, то значение этой переменной увеличивается и устанавливается равным Level_new.

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

В зависимости от типа ордера выполняется тело одного из операторов if. Например, если значение передаваемого параметра Tip равно 0, то это значит, что необходимо открыть ордер Buy. В этом случае вычисляются значения StopLoss и TakeProfit, соответствующие типу ордера Buy, и после этого управление передаётся в строку

Ticket=OrderSend(Symbol(),0,Lots_New,Ask,2,SL,TP,"",MN);

для формирования торгового приказа на открытие рыночного ордера Buy. Аналогичные вычисления производятся в случае, если значение параметра Tip равно 1, т.е необходимо открыть ордер Sell.

Обработка ошибок во всех пользовательских исполнительных торговых функциях выполняется подобным образом. Если торговая операция завершилась успехом, то функция заканчивает работу (потому, что не будет выполняться очередная итерация цикла while, т.к. после исполнения функции Terminal() значение элемента массива Mas_Tip[Tip] будет равно 1). Если же торговый приказ не был исполнен, то выполняется анализ ошибок (блок 4-5). В этом случае вызывается для исполнения функция обработки ошибок Errors(). Если она возвращает false (ошибка является критической), то исполнение функции Open_Ord() заканчивается, управление последовательно возвращается в управляющую торговую функцию Trade(), специальную функцию start() и далее клиентскому терминалу. Если же ошибка является преодолимой, то после обновления массивов ордеров в функции Terminal() управление передаётся на очередную итерацию цикла while, в результате чего выполняется ещё одна попытка открыть ордер.

Таким образом, функция Open_Ord() удерживает управление до тех пор, пока не будет открыт ордер, либо при исполнении торгового приказа будет получена критическая ошибка.

 

Пользовательская исполнительная торговая функция Tral_Stop()

int Tral_Stop (int Tip)

Функция модификации всех рыночных ордеров указанного типа.

Параметр Tip может принимать следующие значения, соответствующие типу закрываемых ордеров:
0 - тип закрываемых ордеров Buy;
1 - тип закрываемых ордеров Sell.

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

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

Mas_Ord_New - массив характеристик ордеров на момент последнего исполнения функции Terminal();

TralingStop - дистанция между рыночной ценой и желаемым значением заявленной цены StopLoss (количество пунктов).

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

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

// Tral_Stop.mqh

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

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

// Функция модификации StopLoss всех ордеров указанного типа

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

// Mas_Ord_New Массив ордеров последний известный

// int TralingStop Значение TralingStop(количество пунктов)

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

int Tral_Stop(int Tip)

{

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

double

Price, // Цена открытия рыночного ордера

TS, // TralingStop (относит.знач.цены)

SL, // Значение StopLoss ордера

TP; // Значение TakeProfit ордера

bool Modify; // Признак необходимости модифи.

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

for(int i=1;i<=Mas_Ord_New[0][0];i++) // Цикл по всем ордерам

{ // Ищем ордера задан. типа

if (Mas_Ord_New[i][6]!=Tip) // Если это не наш тип..

continue; //.. то переступим ордер

Modify=false; // Пока не назначен к модифи

Price =Mas_Ord_New[i][1]; // Цена открытия ордера

SL =Mas_Ord_New[i][2]; // Значение StopLoss ордера

TP =Mas_Ord_New[i][3]; // Значение TakeProft ордера

Ticket=Mas_Ord_New[i][4]; // Номер ордера

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

TralingStop=Level_new; //.. то допустимый

TS=TralingStop*Point; // То же в относит.знач.цены

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

switch(Tip) // Переход на тип ордера

{

case 0: // Ордер Buy

if (NormalizeDouble(SL,Digits)<// Если ниже желаемого..

NormalizeDouble(Bid-TS,Digits))

{ //..то модифицируем его:

SL=Bid-TS; // Новый его StopLoss

Modify=true; // Назначен к модифи.

}

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

case 1: // Ордер Sell

if (NormalizeDouble(SL,Digits)>// Если выше желаемого..

NormalizeDouble(Ask+TS,Digits)||




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


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


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



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




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