Студопедия

КАТЕГОРИИ:


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

Построение обычных программ 3 страница




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

volume - количество лотов. Для рыночных ордеров всегда проверяется достаточность свободных средств на счёте. Для отложенных ордеров количество лотов не ограничено.

price - цена открытия. Устанавливается в соответствии с требованиями и ограничениями, принятыми для проведения торговых операций (см. Характеристики ордеров). Если заявленной цены для открытия рыночных ордеров не было в ценовом потоке или она сильно устарела, то такой торговый приказ отклоняется; если же цена устарела, но присутствует в ценовом потоке и при этом отклонение от текущей цены находится в пределах значения slippage, то такой торговый приказ будет принят клиентским терминалом и отправлен на торговый сервер.

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

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

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

comment - текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером.

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

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

arrow_color - цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка на графике не отображается.

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

 

Открытие рыночных ордеров

 

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

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

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

cmd -для примера будем открывать ордер Buy, поэтому необходимо указать параметр OP_BUY;

volume -можно указать любое допустимое значение; мы будем открывать ордер небольшого размера, пусть это значение будет 0.1;

price - цена открытия для ордера Buy - это цена Ask;

slippage -обычно это значение указывают в размере от 0 до 3 пунктов. Укажем значение 2;

stoploss -стоп-приказы могут быть выставлены не ближе минимальной дистанции, обычно 5 пунктов (см. Требования и ограничения торговых операций); выставим стоп-приказы на расстоянии 15 пунктов от цены закрытия, а именно Bid - 15*Point;

takeprofit -выставим стоп-приказы на расстоянии 15 пунктов от цены закрытия, а именно Bid + 15*Point;

Простейший скрипт simpleopen.mq4, предназначенный для открытия ордера Buy, выглядит так:

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

// simpleopen.mq4

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

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

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

{ // Открытие BUY

OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);

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

}

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

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

1. Пользователь прикрепил скрипт к окну финансового инструмента - перетянул название скрипта мышью из окна "Навигатор" клиентского терминала в окно финансового инструмента, по которому он хочет открыть рыночный ордер Buy стоимостью 0.1 лота со стоп-приказами, удалёнными от рыночного курса на 15 пунктов.

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

3. В рамках исполнения специальной функции start() управление передаётся в строку вызова функции открытия ордера:

OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);

Перед исполнением этой функции программа вычисляет значения всех формальных параметров:

3.1. Мы прикрепили скрипт в окно финансового инструмента Eur/Usd. В этом случае стандартная функция Symbol() вернёт строковое значение EURUSD.

3.2. Пусть на момент обращения Ask =1.2852 и Bid =1.2850.

3.3. Значение StopLoss в этом случае будет равно 1.2850-15*0.0001 = 1.2835, а TakeProfit = 1.2865.

4. Исполнение функции OrderSend():

4.1. Функция сформировала торговый приказ на открытие ордера и передала этот приказ клиентскому терминалу.

4.2. Одновременно с торговым приказом функция передала клиентскому терминалу управление и, таким образом, исполнение программы приостановилось.

4.3. Клиентский терминал произвёл проверку полученного торгового приказа, не обнаружил некорректных параметров и отправил торговый приказ на сервер.

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

4.5. Сервер исполнил торговый приказ, произведя транзакцию в своей базе данных, и отправил сведения об исполненном приказе торговому терминалу.

4.6. Торговый терминал получил информацию о том, что последний торговый приказ исполнен, отразил это событие в окне терминала и в окне финансового инструмента и вернул управление программе.

4.7. Получив управление, программа продолжила свою работу с того места, откуда ранее управление передавалось в клиентский терминал (и куда впоследствии вернулось).

Обратите внимание, в период с п.4.2 по п.4.7 в программе не производилось никаких действий - программа находилась в режиме ожидания ответа сервера.

5. Управление в программе передаётся следующему оператору - return.

6. Исполнение оператора return приводит к выходу из функции start() и, как следствие, к окончанию исполнения программы (напомним, что скрипты после исполнения заканчивают работу) - управление возвращается клиентскому терминалу.

Таким образом, скрипт выполнил своё предназначение: открыт ордер Buy с заданными параметрами. Использование скриптов очень удобно, если необходимо выполнить небольшую разовую операцию; в данном случае использование скрипта вполне оправданно. В соответствии с п. 4.6. трейдер может наблюдать ордер на экране.


Рис. 81. Ордер выставлен скриптом simpleopen.mq4.

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

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

{ // Открытие BUY

OrderSend("GBPUSD",OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);

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

}

Запустим скрипт в том же окне финансового инструмента Eur/Usd. По замыслу, скрипт должен открыть ордер в окне Gbp/Usd. Однако после присоединения скрипта в окно Eur/Usd ожидаемого открытия ордера в окне Gbp/Usd не происходит.

Недостатком подобных программ является их функциональная ограниченность. В данном случае, после присоединения скрипта в окно финансового инструмента пользователь просто ждёт открытия ордера. Но открытия нет. Пользователь находится в неведении относительно причины сложившейся ситуации: то ли причина в том, что в коде программы имеется алгоритмическая ошибка, то ли торговый приказ "потерялся" на пути к серверу, то ли торговый приказ давно отклонён клиентским терминалом (а пользователь ждёт), то ли имеется другая причина.

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

Обработка ошибок

 

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

Если при исполнении программы возникает ошибка, то программа продолжает работу, а клиентский терминал генерирует значение кода ошибки, которое доступно программе при использовании функции GetLastError().

Функция GetLastError()

int GetLastError()

Функция возвращает код последней ошибки, после чего значение специальной переменной last_error, в которой хранится код последней ошибки, обнуляется. Последующий вызов GetLastError() вернет значение 0.

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

Ошибка 130. Неправильные стопы

 

Последний рассмотренный скрипт не производит анализ ошибок, поэтому пользователь остаётся в неведении относительно результатов исполнения функции открытия ордера. В простом варианте использования функции GetLastError() можно проанализировать ошибку и просто сообщить о ней пользователю. Если скрипт confined.mq4 запустить на исполнение в окне Eur/Usd, то возникнет ошибка.

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

// confined.mq4

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

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

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

{ // Открытие BUY

OrderSend("GBPUSD",OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);

Alert (GetLastError()); // Сообщение об ошибке

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

}

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

В этом скрипте добавлена всего одна, но очень содержательная строка:

Alert (GetLastError()); // Сообщение об ошибке

Функция GetLastError() возвращает код последней ошибки, а с помощью Alert() это значение выводится на экран. После присоединения скрипта confined.mq4 в окно финансового инструмента Eur/Usd скрипт исполнится, в результате чего пользователь увидит следующее сообщение:


Рис. 82. Код ошибки, полученный при исполнении скрипта confined.mq4 в окне Eur/Usd.

В приложении представлены Коды ошибок, которые могут возникать при исполнении программы. В данном случае возникла ошибка 130 - неправильные стопы. Это значит, что значения формальных параметров, используемых в функции OrderSend(), не удовлетворяют ограничениям, указанным в Требования и ограничения торговых операций. При внимательном рассмотрении становится очевидной и причина возникшей ошибки: текущие значения рыночной цены Bid и Ask берутся из того окна финансового инструмента, в которое присоединён скрипт, а именно, из окна Eur/Usd. А используются эти значения для формирования торгового приказа по финансовому инструменту Gbp/Usd. В результате, при текущей цене Gbp/Usd Ask = 1.9655, значение TakeProfit для вновь открываемого рыночного ордера оказывается равным (для Eur/Usd Bid =1.2930) 1.2930+15*0.0001=1. 2945, что значительно ниже предельно допустимого значения, т.е ошибочно.

В данном случае возникла алгоритмическая ошибка. Для того чтобы её исправить, необходимо использовать правильные значения цен по финансовому инструменту. Получить эти значения можно с помощью функции MarketInfo(). Скрипт improved.mq4 для открытия рыночного ордера по Gbp/Usd может быть запущен в окне любого финансового инструмента:

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

// improved.mq4

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

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

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

{

double bid =MarketInfo("GBPUSD",MODE_BID); // Запрос значения Bid

double ask =MarketInfo("GBPUSD",MODE_ASK); // Запрос значения Ask

double point =MarketInfo("GBPUSD",MODE_POINT);//Запрос Point

// Открытие BUY

OrderSend("GBPUSD",OP_BUY,0.1,ask,3,bid-15*Point,bid+15*Point);

Alert (GetLastError()); // Сообщение об ошибке

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

}

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

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

Рассмотрим и некоторые другие наиболее распространённые ошибки. Для этого вернёмся к идее открытия ордера с помощью скрипта в том окне, в которое присоединён скрипт.

Ошибка 129. Неправильная цена

 

В ряде случаев возникает банальная ошибка - в качестве цены открытия указывается не то значение двухсторонней котировки. Как известно (см. Требования и ограничения торговых операций), рыночные ордера Buy открываются ценой Ask. Вот что получится, если в скрипте mistaken.mq4 ошибочно указать Bid:

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

// mistaken.mq4

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

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

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

{ // Открытие BUY

OrderSend(Symbol(),OP_BUY,0.1,Bid,3,Bid-15*Point,Bid+15*Point);

Alert (GetLastError()); // Сообщение об ошибке

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

}

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

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


Рис. 83. Ошибка 129 (неправильная цена) при исполнении mistaken.mq4.

 

Ошибка 134. Недостаточно денег для совершения операции

 

Аналогичный результат (ошибка 134) будет получен и в случае, если свободных средств не хватает для открытия ордера. Размер свободных средств, необходимых для открытия 1 лота на покупку для каждого финансового инструмента можно узнать с помощью функции MarketInfo(Имя_инструмента, MODE_MARGINREQUIRED).

Размер стандартного лота в разных дилинговых центрах для одного финансового инструмента может отличаться.

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

Таблица 3. Варианты соотношения стоимости лотов и 1 пункта (валюта депозита- доллар США).

  Дилинговый центр 1 Дилинговый центр 2 Дилинговый центр 3
Buy Sell 1pt Buy Sell 1pt Buy Sell 1pt
EUR/USD 1296.40 1296.20 10.00 1296.50 1296.20 10.00 1000.00 1000.00 10.00
GBP/USD 1966.20 1966.00 10.00 1376.48 1376.20 7.50 1000.00 1000.00 10.00
AUD/USD 784.40 784.20 10.00 1569.20 1568.40 20.00 1000.00 1000.00 10.00
USD/JPY 1000.00 1000.00 8.29 1000.00 1000.00 8.29 1000.00 1000.00 8.29
USD/CHF 1000.00 1000.00 8.02 1000.00 1000.00 8.02 1000.00 1000.00 8.02
EUR/CHF 1296.40 1296.20 8.02 1296.35 1296. 35 8.02 1000.00 1000.00 8.02

Цены даны по состоянию на 16.12.2007г.

Кратко рассмотрим распространённые методы расчёта стоимости 1 лота и 1 пункта.

Дилинговый центр 1 (наиболее распространённый вариант)

Для тех валютных инструментов, у которых в знаменателе указан USD, стоимость 1 лота равна текущей цене соответствующей двухсторонней котировки, умноженной на 1000, стоимость 1 пункта равна $10.

Для тех валютных инструментов, у которых USD указан в числителе, стоимость 1 лота равна $1000.00, а стоимость 1 пункта обратно пропорциональна текущей котировке и равна 1/(Bid). Например, для USD/CHF при Bid= 1.2466 стоимость 1 пункта = 1/1. 2466 = 8.02.

Для кросс-курсов стоимость 1 лота оценивается так, как оценивается стоимость валюты, указанной в числителе, а стоимость 1 пункта так, как для валюты, указанной в знаменателе. Например, для EUR/CHF стоимость 1 лота = 129.40 (как для EUR/USD), а стоимость 1 лота = 8.02 (как для USD/CHF).




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


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


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



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




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