Студопедия

КАТЕГОРИИ:


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




NormalizeDouble(SL,Digits)==0)//.. или нулевой(!)

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

SL=Ask+TS; // Новый его StopLoss

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

}

} // Конец switch

if (Modify==false) // Если его не надо модифи..

continue; //..то идём по циклу дальше

bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифицируем его!

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

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

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

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

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

i--; // Понижение счётчика

}

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

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

}

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

}

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

В блоках 1-3 описаны глобальные переменные, используемые в функции, а также открыты и описаны локальные переменные. В цикле for (блоки 3-6) выполняется отбор ордеров заданного типа, и если StopLoss какого-либо из этих ордеров находится дальше от текущей цены, чем задано пользователем, этот ордер модифицируется.

Для облегчения восприятия кода значения некоторых элементов массива ордеров Mas_Ord_New присваиваются простым переменным (блок 3-4). Далее для переменной TralingStop выполняется необходимая проверка: если значение этой переменной меньше минимально допустимой дистанции, установленной дилинговым центром, то оно увеличивается до минимально допустимой величины.

В блоке 4-5, в зависимости от типа ордера, выполняются необходимые вычисления. Например, если значение передаваемого параметра Tip равно 1 (необходимо модифицировать ордер Sell), то управление передаётся на метку case 1 оператора switch. Здесь выполняется проверка необходимости модификации StopLoss ордера (в соответствии с правилами, применяемыми для ордера этого типа, см. Требования и ограничения торговых операций). Если StopLoss вообще не установлен или находится дальше от текущего курса, чем на величину дистанции TralingStop, то вычисляется желаемое новое значение StopLoss. Торговый приказ для модификации ордера формируется в строке:

bool Ans = OrderModify(Ticket,Price,SL,TP,0);//Модифицируем его!

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

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

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

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

В блоке 5-6 выполняется анализ ошибок, полученных при исполнении торговых приказов. Если ошибка является критической, то функция заканчивает работу. Если же получена преодолимая ошибка, то значение счётчика i понижается на 1. Это делается для того, чтобы на очередной итерации цикла for была предпринята ещё одна попытка модифицировать тот же ордер.

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

Функция обработки ошибок

 

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

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

 

Пользовательская функция обработки ошибок Errors()

bool Errors(int Error)

Функция возвращает TRUE, если ошибка преодолимая и FALSE, если ошибка является критической или отсутствует.
Параметр Error может принимать любое значение и соответствовать коду ошибки, возникшей при попытке осуществить торговую операцию.

Пользовательская функция обработки ошибок Errors() оформлена в виде включаемого файла Errors.mqh:

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

// Errors.mqh

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

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

// Функция обработки ошибок.

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

// true - если ошибка преодолимая (т.е. можно продолжать работу)

// false - если ошибка критическая (т.е. торговать нельзя)

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

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

{

// Error // Номер ошибки

if(Error==0)

return(false); // Нет ошибки

Inform(15,Error); // Сообщение

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

switch(Error)

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

case 129: // Неправильная цена

case 135: // Цена изменилась

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

return(true); // Ошибка преодолимая

case 136: // Нет цен. Ждём новый тик.

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

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

return(true); // Ошибка преодолимая

case 146: // Подсистема торговли занята

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

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

return(true); // Ошибка преодолимая

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

case 2: // Общая ошибка

case 5: // Старая версия клиентского терминала

case 64: // Счет заблокирован

case 133: // Торговля запрещена

default: // Другие варианты

return(false); // Критическая ошибка

}

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

}

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

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

Какой должна быть реакция функции Errors() на нулевое значение переменной Error, зависит от того, какой алгоритм используется для обработки значения, возвращаемого функцией. В рассматриваемом эксперте значение, возвращаемое функцией, принимается во внимание в исполнительных торговых функциях. Если функция Errors() возвращает значение true (ошибка преодолимая), то предпринимается повторная попытка осуществить торговую операцию. Если же возвращено значение false, то исполнение торговой функции прекращается и управление последовательно возвращается в вызывающую функцию, затем в функцию start() и клиентскому терминалу. Если выбирать между двумя этими вариантами, то случай, когда ошибки нет (Error = 0) соответствует второму варианту, а именно возвращаемому значению false. Этим гарантируется, что однажды исполненный приказ не будет повторён.

После вывода с помощью функции Inform() сообщения об ошибке управление передаётся в блок 3-4, оператору switch. Для каждого из рассматриваемых кодов ошибок в функции предусмотрен свой вариант case. Например, если возникла ошибка 136, то это значит, что на текущий момент у брокера нет цен, на основании которых он может принять правильное решение. Это значит также, что в период до ближайшего тика ситуация не изменится, т.е. нет необходимости многократно повторять один и тот же торговый приказ, он всё равно не будет исполнен. Правильным решением в этом случае является пауза - отсутствие какой-либо инициативы со стороны эксперта. Для этой цели используется простой способ определения нового тика - анализ значения, возвращаемого функцией RefreshRates(). Как только новый тик появляется, управление возвращается в вызвавшую функцию, в которой торговый приказ (при необходимости, после соответствующего анализа) повторяется.

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




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


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


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



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




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