Студопедия

КАТЕГОРИИ:


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

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




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

Рассмотрим пример. Пусть Баланс = 5000.00, в терминале нет открытых ордеров. Откроем ордер Buy стоимостью 1 лот в дилинговом центре 3. В дилинговом центре 3 установлено следующее правило:

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

В окне терминала отразится информация об открытом ордере. Обратите внимание, залог составляет 1000.00, прибыль по ордеру -30.00, таким образом, количество свободных средств составляет 5000-1000-30=3970.00:


Рис. 84. Ордер Buy в окне терминала.

После открытия ордера Sell той же стоимости количество свободных средств увеличится. Меньшая суммарная стоимость однонаправленных рыночных ордеров составляет 1000.00, поэтому свободные средства увеличиваются на 1000.00. На рис. 85 показана ситуация, при которой стоимость разнонаправленных ордеров совпадает, таким образом, вся сумма стоимости ордеров высвобождается для торговли.


Рис. 85. Ордер Buy и Sell в окне терминала.

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


Рис. 86. Ордер Buy и Sell в окне терминала.

В случае если будет открыт ещё один ордер Sell на 0.1 лота (стоимостью 100.00), то меньшая суммарная стоимость однонаправленных ордеров составляет 700.00 + 100. 00 = 800.00. Таким образом, сумма залога (в сравнении с вариантом, когда открыт только один ордер Buy) уменьшается на 800.00. В сравнении с вариантом, представленным на рис. 86, залог уменьшается, а свободные средства увеличиваются на 100.00 (см. рис. 87).


Рис. 87. Ордер Buy и Sell в окне терминала.

Количество свободных средств, отображаемых на рис. 86 и 87, отличаются более чем на 100.00, т.к. при изменении текущего курса изменилось суммарное значение прибыли по открытым ордерам (разница составляет 8.00).

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

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

Например, если в дилинговом центре 2 по USD/JPY ранее был открыт ордер Buy стоимостью 4 лота, то при открытии ордера Sell стоимостью 4 лота сумма залога и сумма свободных средств не изменится.


Рис. 88. Наличие разнонаправленных ордеров не высвобождает залог.

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

Для того чтобы при первом знакомстве с условиями, предлагаемыми дилинговым центром, выяснить размер свободных средств, требуемых для открытия ордера объемом в 1 лот, можно воспользоваться нехитрым скриптом conditions.mq4:

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

// conditions.mq4

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

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

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

{

Alert(Symbol()," Sell = ",AccountFreeMargin()// При продаже

-AccountFreeMarginCheck(Symbol(),OP_SELL,1));

Alert(Symbol()," Buy = ",AccountFreeMargin() // При покупке

-AccountFreeMarginCheck(Symbol(),OP_BUY,1));

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

}

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

Здесь выражение

AccountFreeMargin() - AccountFreeMarginCheck(Symbol(),OP_SELL,1)

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

Если этот скрипт запустить на исполнение в условиях, когда в терминале нет рыночных ордеров, то можно получить текущий требуемый размер средств для открытия ордера объемом 1 лот на покупку и на продажу:


Рис. 89. Стоимость 1 лота для различных финансовых инструментов, полученная с помощью conditions.mq4.

Если скрипт conditions.mq4 запустить на исполнение в окне финансового инструмента, по которому открыты рыночные ордера, то можно получить и другие значения в зависимости от того, каким методом расчёта пользуется тот или иной дилинговый центр.

Другие ошибки и функция MarketInfo()

 

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

Функция MarketInfo()

double MarketInfo(string symbol, int type)

Функция возвращает различную информацию о финансовых инструментах, перечисленных в окне "Обзор рынка". Часть информации о текущем финансовом инструменте хранится в предопределенных переменных.

Параметры:

symbol - символ инструмента;

type - идентификатор запроса, определяющий тип возвращаемой информации. Может быть любым из значений идентификаторов запроса (см. Идентификаторы функции MarketInfo).

 

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

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

Пример простого скрипта, открывающего ордер Buy, стоимостью 35% от суммы свободных средств, с некоторыми заданными значениями стоп-приказов (openbuy.mq4).

 

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

// openbuy.mq4

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

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

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

{

int Dist_SL =10; // Заданный SL (pt)

int Dist_TP =3; // Заданный TP (pt)

double Prots=0.35; // Процент своб. ср.

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

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

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

{

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

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

double Step =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен лотов

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

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

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

double Lot=MathFloor(Free*ProtsOne_LotStep)*Step;// Лоты

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

{

Alert(" Не хватает денег на ", Min_Lot," лотов");

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

}

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

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

{

Dist_SL=Min_Dist; // Установим допуст.

Alert(" Увеличена дистанция SL = ",Dist_SL," pt");

}

double SL=Bid - Dist_SL*Point; // Заявленная цена SL

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

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

{

Dist_TP=Min_Dist; // Установим допуст.

Alert(" Увеличена дистанция TP = ",Dist_TP," pt");

}

double TP=Bid + Dist_TP*Point; // Заявленная цена ТР

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

Alert("Торговый приказ отправлен на сервер. Ожидание ответа..");

int ticket=OrderSend(Symb, OP_BUY, Lot, Ask, 2, SL, TP);

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

if (ticket>0) // Получилось:)

{

Alert ("Открыт ордер Buy ",ticket);

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

}

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

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

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

{

case 135:Alert("Цена изменилась. Пробуем ещё раз..");

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

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

case 136:Alert("Нет цен. Ждём новый тик..");

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

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

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

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

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

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

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

}

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

{

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

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

case 5: Alert("Старая версия клиентского терминала.");

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

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

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

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

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

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

}

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

}

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

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

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

}

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

Скрипт состоит из одной специальной функции start() (блоки 1-10). В блоке 1-2 заданы значения, при которых должен быть открыт ордер. Блок 2-9 представляет цикл while (), в котором производятся необходимые вычисления. Наличие этого цикла предполагает возможность нескольких попыток открытия ордера. В блоке 2-3 обновляются переменные окружения. В блоках 3-4-5-6 вычисляются значение количества лотов и заявленные цены стоп-приказов. В блоке 7-8-9 выполняется обработка ошибок. В блоке 9-10 печатается сообщение о завершении работы скрипта.

Рассмотрим некоторые особенности программного кода. Легко заметить, что формирование торгового приказа осуществляется в блоке 6-7. В предшествующем блоке 3-4 вычисляется количество лотов. Учитывается вариант, при котором выделенных свободных средств не хватит для открытия ордера даже на минимальное количество лотов. Поэтому в блоке 3-4, после опубликования сообщения о нехватке денег, осуществляется выход из цикла 2-9 с помощью оператора break. Управление передаётся в блок 9-10, и скрипт заканчивает работу. Сообщение в блоке 9 не обязательно должно присутствовать. Здесь оно указано только для того, чтобы при опробовании скрипта на демо-счёте было легче сориентироваться - когда программа закончила работу, а когда возникла пауза, связанная с задержками в сети или на сервере.

Если для открытия ордера свободных средств хватает, то управление передаётся в блок 4-5 и далее в блок 5-6. В этих блоках не предусмотрен выход из цикла. Этим полагается, что для любой минимальной дистанции, установленной брокером, найдутся соответствующие значения стоп-приказов. В блоке 1-2 намеренно указано значение 3 пункта для TP. Подавляющее число брокеров устанавливают минимальную дистанцию 5 пунктов. В блоке 5-6 будет обнаружено, что заданное значение меньше допустимого, и установлено такое значение цены стоп-приказа, которое не противоречит ограничению.

Далее управление передаётся в блок 6-7 для открытия ордера. В первой строке этого блока публикуется сообщение и лишь во второй строке формируется торговый приказ. Возникает вопрос: почему мы заявляем о формировании торгового приказа ещё до того, как он сформирован? Ведь можно было бы сначала отдать приказ, а потом сообщить об этом пользователю. Ответ на этот вопрос непосредственно связан с технологией отправки приказа клиентскому терминалу и далее на сервер (см. рис. 66). В нашем случае торговый приказ формируется в функции OrderSend(), указанной в правой части оператора присваивания. Собственно торговый приказ создаётся и отправляется на сервер в самой функции, а исполнение операции присвоения в операторе присваивания будет выполнено уже после того, как сервер вернёт какой-либо ответ о судьбе данного торгового приказа. Таким образом, единственная возможность сообщить пользователю о начале событий, связанных с торговым приказом, - это указать сообщение перед оператором присваивания, в правой части которого указана торговая функция.

Рано или поздно клиентский терминал вернёт управление в программу, будет исполнен оператор присваивания в блоке 6-7, в результате чего переменная ticket получит какое-то значение, и управление будет передано далее - в блок анализа ошибок 7-8-9.

Если ордер открыт на сервере, то переменной ticket будет присвоен номер открытого ордера. В этом случае скрипт выполнил своё предназначение и далее работу программы необходимо прекратить. В блоке 7-8 используется оператор break для выхода из цикла while(). Управление передаётся в блок 9-10 (за пределы цикла) и программа заканчивает работу.

Если же попытка открыть ордер не увенчалась успехом, то управление передаётся в блок 8-9 для анализа ошибок. Здесь рассматривается 2 вида ошибок - те, которые позволяют ещё надеяться на успешное открытие и те, появление которых однозначно указывает на необходимость прекратить исполнение программы. Переменной Error присваивается код последней ошибки, в данном случае той ошибки, которая была возвращена сервером или клиентским терминалом при исполнении торговой функции OrderSend().

В первом операторе switch блока 8-9 рассматриваются преодолимые ошибки. Каждая из ошибок этой группы обрабатывается по-своему. Например, если изменилась цена (ошибка 135), то достаточно просто обновить параметры окружения с помощью RefreshRates() и повторить попытку открытия ордера. Если же возникла ошибка "нет цен" (ошибка 136), то нет смысла сразу снова отправлять торговый приказ на сервер. В этом случае необходимо дождаться нового тика (на сервере в этот период тоже нет цен) и только после этого произвести ещё одну попытку открытия ордера. Поэтому в блоке обработки ошибки 136 имеется цикл задержки, который будет прерван в результате поступления нового тика. Выход из оператора switch() осуществляется с помощью оператора continue, который прекращает текущую итерацию цикла while () и начинает новую.

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

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

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

Относитесь критически к любым программным кодам, невзирая на авторитеты.

Обратите внимание на код в блоке 4-5:

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

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

{

Dist_SL=Min_Dist; // Установим допуст.

Alert(" Увеличена дистанция SL = ",Dist_SL," pt");

}

double SL = Bid - Dist_SL*Point; // Заявленная цена SL

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

В результате вычислений в теле оператора if () переменная Dist_SL может получить новое значение. Предположим, что обычно минимальная дистанция составляет 5 пунктов. Предположим, что при первом исполнении (на быстром рынке) это значение установлено на сервере равным 20 пунктов. Переменная Min_Dist получит значение 20.

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

Предположим также, что сформированный торговый приказ был отклонён в результате ошибки 136. Программа будет отслеживать новый тик в блоке 8-9. За это время на сервере снова может быть изменено значение минимальной дистанции, на этот раз, например, уменьшено до 10 пунктов. С момента поступления нового тика управление будет передано на новый цикл, будет вычислено новое значение переменной Min_Dist, равное 10. Однако значение переменной Dist_SL останется неизменным, равным 20 (блок операторов 4-5 написан так, что значение Dist_SL может только увеличиваться). Чтобы исключить эту алгоритмическую ошибку, блок 4-5 необходимо составить таким образом, чтобы изменялось только то значение, которое зависит от ситуации, - в данном случае значение SL, а значение Dist_SL не изменялось, например, так:

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

double SL = Bid - Dist_SL*Point; // Заявленная цена SL

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

{

SL = Bid - Min_Dist*Point; // Заявленная цена SL

Alert(" Увеличена дистанция SL = ",Min_Dist," pt");

}

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

Аналогичное изменение кода следует выполнить в блоке 5-6 и для другого стоп-приказа.

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

 

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

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

Функция WindowPriceOnDropped()

 

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

double WindowPriceOnDropped()

Функция возвращает значение цены в точке графика, на которой был брошен эксперт или скрипт. Значение будет верным только в случае, если эксперт или скрипт перемещены с помощью мыши (технология "drag and drop"). Для пользовательских индикаторов это значение не определено.

 

Пример простого скрипта, устанавливающего ордер BuyStop, стоимостью 35% от суммы свободных средств, с некоторыми заданными значениями стоп-приказов (openbuystop.mq4).

 

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

// openbuystop.mq4

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

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

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

{

int Dist_SL =10; // Заданный SL (pt)

int Dist_TP =3; // Заданный TP (pt)

double Prots=0.35; // Процент своб. ср.

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

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

Alert("Мышкой задана цена Price = ",Win_Price);// Задано мышей

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

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

{

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

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

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

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

double Lot=MathFloor(Free*ProtsOne_LotMin_Lot)*Min_Lot;// Лоты

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

double Price=Win_Price; // Цена задана мышей

if (NormalizeDouble(Price,Digits)< // Если меньше допуст.

NormalizeDouble(Ask+Min_Dist*Point,Digits))

{ // Только для BuyStop!

Price=Ask+Min_Dist*Point; // Ближе нельзя

Alert("Изменена заявленная цена: Price = ",Price);

}

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

double SL=Price - Dist_SL*Point; // Заявленная цена SL

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

{

SL=Price - Min_Dist*Point; // Заявленная цена SL

Alert(" Увеличена дистанция SL = ",Min_Dist," pt");

}

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

double TP=Price + Dist_TP*Point; // Заявленная цена ТР

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

{

TP=Price + Min_Dist*Point; // Заявленная цена TP

Alert(" Увеличена дистанция TP = ",Min_Dist," pt");

}

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

Alert("Торговый приказ отправлен на сервер. Ожидание ответа..");

int ticket=OrderSend(Symb, OP_BUYSTOP, Lot, Price, 0, SL, TP);

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

if (ticket>0) // Получилось:)

{

Alert ("Установлен ордер BuyStop ",ticket);

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

}

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

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

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

{

case 129:Alert("Неправильная цена. Пробуем ещё раз..");

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

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

case 135:Alert("Цена изменилась. Пробуем ещё раз..");

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

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

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

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

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

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

}

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

{

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

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

case 5: Alert("Старая версия клиентского терминала.");

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

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

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

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

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

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

}

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

}

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

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

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

}

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

Структура скрипта openbuystop.mq4 построена так же, как в скрипте openbuy.mq4, поэтому нет необходимости описывать его подробно. Остановимся только на основных отличиях этих программ.

Цена, на уровне которой скрипт был прикреплён к окну финансового инструмента, определяется в строке:

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

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

Нетрудно увидеть, что в скрипте openbuystop.mq4 отсутствует проверка достаточности свободных средств для открытия ордера, но появилась проверка значения цены открытия ордера (блок 3-4). Если вычисленное значение переменной Price не удовлетворяет требованиям установки отложенного Stop ордера (см. Характеристики ордеров, Требования и ограничения торговых операций), то производится перерасчёт этого значения.

В блоке обработки ошибок также произошли небольшие изменения: некоторые ошибки не рассматриваются, но появилась обработка кодов других ошибок.

Разумные ограничения

 

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

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

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

Закрытие и удаление ордеров

 

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

 

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

Функция OrderClose()

bool OrderClose (int ticket, double lots, double price, int slippage, color Color=CLR_NONE)

Функция закрытия рыночного ордера. Функция возвращает TRUE при успешном исполнении торговой операции. Возвращает FALSE при неудачном завершении торговой операции.




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


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


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



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




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