Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Свободные средства 4 страница




Модификация отложенных ордеров

 

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

Например, имеется отложенный ордер BuyStop = 1.2030, имеющий StopLoss = 1.2025 и TakeProfit = 1.2035. Минимально допустимая дистанция установлена брокером в размере 5 пунктов. Нетрудно заметить, что стоп-приказы ордера стоят на допустимой границе, поэтому любая модификация заявленной цены открытия ордера повлечёт обязательную модификацию по крайней мере одного из стоп-приказов. Если же будет сформирован торговый приказ, в соответствии с которым предполагается изменить заявленную цену ордера, а значения стоп-приказов оставить без изменения, то такой торговый приказ будет признан клиентским терминалом как ошибочный и не будет отправлен на сервер для исполнения. Например, если в торговом приказе указаны значения BuyStop = 1. 2028, StopLoss = 1.2025 и TakeProfit = 1.2035, то этот торговый приказ является ошибочным, несмотря на то, что значения стоп-приказов не изменились - в данном случае нарушено правило соблюдения минимальной дистанции между заявленной ценой открытия ордера и ценой одного из стоп-приказов (см. Требования и ограничения торговых операций).

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

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

 

 

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

// modifyorderprice.mq4

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

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

int start() // Спец.функция start

{

int Tral=10; // Дист. приближения

string Symb=Symbol(); // Финанс. инструмент

double Dist=1000000.0; // Предустановка

double Win_Price=WindowPriceOnDropped(); // Здесь брошен скрипт

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

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

{

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

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

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

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

if (OrderType()<2) continue; // Рыночный ордер

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

if(NormalizeDouble(MathAbs(OrderOpenPrice()-Win_Price),Digits)

< NormalizeDouble(Dist,Digits)) // Выбираем ближайший

{

Dist=MathAbs(OrderOpenPrice()-Win_Price);// Новое значение

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

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

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

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

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

} // Конец if

} // Конец анализа ордера

} // Конец перебора орд.

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

if (Tip==0) // Если отложенных нет

{

Alert("По ",Symb," отложенных ордеров нет");

return; // Выход из программы

}

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

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

{

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

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

double TS=Tral; // Исходное значение

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

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

TS=Min_Dist; // Новое значение TS

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

string Text=""; // Не назначен к модифи

double New_SL=0;

double New_TP=0;

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

{

case 2: // BuyLimit

if (NormalizeDouble(Price,Digits) < // Если дальше, чем на

NormalizeDouble(Ask-TS*Point,Digits))//..заданное знач

{

double New_Price=Ask-TS*Point; // Новая его цена

if (NormalizeDouble(SL,Digits)>0)

New_SL=New_Price-(Price-SL); // Новый StopLoss

if (NormalizeDouble(TP,Digits)>0)

New_TP=New_Price+(TP-Price); // Новый TakeProfit

Text= "BuyLimit "; // Будем его модифи.

}

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

case 3: // SellLimit

if (NormalizeDouble(Price,Digits) > // Если дальше, чем на

NormalizeDouble(Bid+TS*Point,Digits))//..заданное знач

{

New_Price=Bid+TS*Point; // Новая его цена

if (NormalizeDouble(SL,Digits)>0)

New_SL=New_Price+(SL-Price); // Новый StopLoss

if (NormalizeDouble(TP,Digits)>0)

New_TP=New_Price-(Price-TP); // Новый TakeProfit

Text= "SellLimit "; // Будем его модифи.

}

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

case 4: // BuyStopt

if (NormalizeDouble(Price,Digits) > // Если дальше, чем на

NormalizeDouble(Ask+TS*Point,Digits))//..заданное знач

{

New_Price=Ask+TS*Point; // Новая его цена

if (NormalizeDouble(SL,Digits)>0)

New_SL=New_Price-(Price-SL); // Новый StopLoss

if (NormalizeDouble(TP,Digits)>0)

New_TP=New_Price+(TP-Price); // Новый TakeProfit

Text= "BuyStopt "; // Будем его модифи.

}

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

case 5: // SellStop

if (NormalizeDouble(Price,Digits) < // Если дальше, чем на

NormalizeDouble(Bid-TS*Point,Digits))//..заданное знач

{

New_Price=Bid-TS*Point; // Новая его цена

if (NormalizeDouble(SL,Digits)>0)

New_SL=New_Price+(SL-Price); // Новый StopLoss

if (NormalizeDouble(TP,Digits)>0)

New_TP=New_Price-(Price-TP); // Новый TakeProfit

Text= "SellStop "; // Будем его модифи.

}

}

if (NormalizeDouble(New_SL,Digits)<0) // Проверка SL

New_SL=0;

if (NormalizeDouble(New_TP,Digits)<0) // Проверка TP

New_TP=0;

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

if (Text=="") // Если его не модифи

{

Alert("Нет условий для модификации.");

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

}

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

Alert ("Модификация ",Text,Ticket,". Ждём ответ..");

bool Ans=OrderModify(Ticket,New_Price,New_SL,New_TP,0);//Модифи!

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

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

{

Alert ("Модифицирован ордер ",Text," ",Ticket,":)");

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

}

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

int Error=GetLastError(); // Не получилось:(

switch(Error) // Преодолимые ошибки

{

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

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

continue; // На след. итерацию

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

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

continue; // На след. итерацию

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

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

continue; // На след. итерацию

}

switch(Error) // Критические ошибки

{

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

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

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

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

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

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

case 139:Alert("Ордер заблокирован и уже обрабатывается");

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

case 145:Alert("Модификация запрещена. ",

"Ордер слишком близок к рынку");

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

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

}

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

} // Конец цикла закр.

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

Alert ("Скрипт закончил работу -----------------------");

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

}

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

Расстояние между рыночной ценой и заявленной ценой отложенного ордера задано в переменной Tral. Переменная Win_Price содержит значение цены, на которой в окно финансового инструмента прикреплён скрипт. В цикле перебора ордеров (блок 2-5) вычисляются характеристики отложенного ордера, находящегося ближе других к месту прикрепления скрипта. Блок 6-13 представляет цикл закрытия ордеров. В блоке 8-9 определяется, нужно ли модифицировать выбранный ордер, и, если необходимо, вычисляются новые значения заявленной цены и стоп-приказов. Приказ на модификацию отдаётся с помощью функции OrderModify() в блоке 10-11. В блоке 11-13 реализована обработка ошибок.

Блок 8-9 состоит из четырёх однотипных блоков, в которых вычисляются новые значения отложенного ордера, используемые в торговом приказе. Рассмотрим один из них, для ордера SellLimit:

case 3: // SellLimit

if (NormalizeDouble(Price,Digits) > // Если дальше, чем на

NormalizeDouble(Bid+TS*Point,Digits))//..заданное знач

{

New_Price=Bid+TS*Point; // Новая его цена

if (NormalizeDouble(SL,Digits)>0)

New_SL = New_Price+(SL-Price);// Новый StopLoss

if (NormalizeDouble(TP,Digits)>0)

New_TP = New_Price-(Price-TP);// Новый TakeProfit

Text= "SellLimit "; // Будем его модифи.

}

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

Новые параметры ордера вычисляются только в том случае, если текущая цена Price находится дальше от текущей рыночной цены Bid, чем на желаемую дистанцию TS. Если это так, то управление передаётся в тело оператора if, где вычисляется новая цена открытия ордера New_Price. Новые значения StopLoss и TakeProfit вычисляются только для ненулевых значений. При этом дистанции между заявленной ценой ордера и каждой ценой стоп-приказа сохраняется неизменной.

Например, ордер SellLimit установлен по цене 1.2050, его StopLoss = 1.2073, а TakeProfit = 1. 2030. Допустим, в результате вычислений новая цена открытия ордера равна 1.2040. В этом случае новые значения стоп-приказов будут такими: StopLoss = 1.2063, а TakeProfit = 1. 2020. Таким образом, в результате работы программы ордер модифицируется "целиком" - все три основных параметра (цена открытия, StopLoss и TakeProfit) одновременно смещаются вниз, сохраняя при этом дистанцию между собой.

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

Здесь необходимо отметить недостаток подобных небольших программ - как скриптов, так и экспертов. Представленная программа modifyorderprice.mq4 очень ограничена в выборе действий. Модифицируемый ордер может быть смещён только в одном направлении - в сторону рыночного курса, при этом его стоп-приказы жёстко "привязаны" к ордеру. Эта программа не приспособлена для модификации заявленной цены ордера в противоположную сторону от рыночной цены, в ней также не реализована возможность изменения положения отдельно взятого какого-либо из стоп-приказов.

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

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

Простые программы на MQL4

 

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

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

Использование технических индикаторов.
В терминале MetaTrader 4 есть несколько десятков встроенных индикаторов, которые называются техническими. Название технический происходит из разделения двух видов анализа рынка: фундаментальный анализ (ФА) - анализ макроэкономических показателей в контексте торгуемого инструмента, рынка, страны и так далее; и технический анализ (ТА) - анализ непосредственно цены с помощью ценовых графиков и разнообразных преобразований цены. Язык MQL4 позволяет получать значения технических индикаторов через соответствующие функции. При вызове функции технического индикатора необходимо указать требуемые параметры.

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

Программирование пользовательских индикаторов.
Создание пользовательского индикатора не является сложным, если знать устройство последнего. Каждый пользовательский индикатор может содержать от 1 до 8 индикаторных буферов, с помощью которых терминал отображает информацию на графиках инструментов. Необходимые буферы объявляются в виде массивов типа double на глобальном уровне программы, и затем в функции init() происходит уточнение/установка параметра каждого буфера: стиль отображения, цвет и толщина линии, и так далее. Так как запуск функции start() происходит в индикаторе с приходом каждого тика, то организация экономных вычислений выходит на первый план. Для создания оптимального алгоритма индикатора служит функция IndicatorCounted(), которая содержит данные о количестве баров, которые не изменились с последнего вызова функции start().

Пользовательский индикатор скорости изменения цены.
Создание пользовательского индикатора лучше всего освоить на примере с подробными объяснениями. Детальные комментарии в тексте индикатора будут полезны вам самим и в дальнейшем, когда вы захотите изменить ранее написанное. Хорошие программы - это хорошо документированные программы.

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

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

 

По признаку принадлежности к информационно-торговой системе MetaTrader в MQL4 различают два вида индикаторов - технические и пользовательские.

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

 

Свойства технических индикаторов

 

Отображение в окне финансового инструмента

 

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


Рис. 104. Присоединение к технического индикатора к окну финансового инструмента.

Индикаторные линии технического индикатора могут отражаться как в основном окне ценового графика, так и в отдельном окне в нижней части окна финансового инструмента. На Рис. 104 показано, что технический индикатор Alligator отображается в окне ценового графика.

Неизменность кода

 

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

Вызов функции технического индикатора

 

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

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

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

Индикаторный массив - одномерный массив, содержащий численные значения, в соответствии с которыми строятся индикаторные линии. Численные значения элементов индикаторного массива - это координаты точек, по которым строится индикаторная линия. При этом координатой каждой точки по оси Y является значение элемента индикаторного массива, а координатой по оси Х - значение индекса элемента индикаторного массива.

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

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

 

В составе клиентского терминала информационно-торговой системы MetaTrader имеется ряд Технических индикаторов. Рассмотрим некоторые из них.




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


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


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



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




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