Ордера BuyStopLimit и SellStopLimit

С выходом первых билдов терминала Мeta Trader 5 к стандартному списку торговых приказов прибавилось еще два типа приказов – BuyStopLimit и SellStopLimit. BuyStopLimit – это приказ установить ордер Buy Limit при достижении ценой значения, которое находится выше текущей цены Ask. SellStopLimit – это приказ установить ордер Sell Limit при достижении ценой значения, которое ниже текущей цены Bid.

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

Так как мы реализуем два вида ордеров, то и скрипт логически будет разбит на две части – обработка BuyStopLimit и обработка SellStopLimit. Пересекаться между собой эти части никак не будут. Тип операции будет указываться пользователем в специальной внешней переменной Type. Так, для установки ордера Buy Stop Limit, необходимо в Type занести значение 0, а для Sell Stop Limit – значение 1. Любое другое значение приведет к отключению работы скрипта.

Итак, блок работы с BuyStopLimit:

if (Type == 0) // Если выбран BuyStopLimit
{
// — 2 — ==== Проверка правильности входных параметров для BuyStopLimit =======
if (StopLimitPrice >= (Price-StopLevel))        // Проверка значения StopLimitPrice
{
Alert(«При установке BuyStopLimit цена StopLimitPrice должна быть ниже Price»);
return(0);
}
if (Price <= Ask)                                        // Проверка значения Price
{

Alert(«При установке BuyStopLimit цена Price должна быть выше Ask»);
return(0);
}
if (TakeProfit — StopLimitPrice <= StopLevel)       // Проверка значения TakeProfit
{
Alert(«Слишком близкий TakeProfit»);
return(0);
}
if (StopLimitPrice — StopLoss <= StopLevel)           // Проверка значения StopLoss
{
Alert(«Слишком близкий StopLoss»);
return(0);
}
// — 2 — ================= Окончание блока =======================

// — 3 — ==== Ожидание достижения ценой значения StopLimitPrice =============
Comment(«Скрипт MT5_BuyStopLimit_SellStopLimit ожидает достижение ценой значения «,
Price);
ShowPrice(Price);

double NAsk = ND(MarketInfo(Symbol(), MODE_ASK));
while(!IsStopped() && NAsk < Price)
NAsk = ND(MarketInfo(Symbol(), MODE_ASK));
deinit();
if (IsStopped())  return(0);
// — 3 — ================= Окончание блока =======================

// — 4 — ==== Нужная цена достигнута — ставим ордер BuyLimit ================
while (!FatalError && !Res && !IsStopped())
{
Res = OpenOrder(OP_BUYLIMIT, StopLimitPrice, TakeProfit, StopLoss);
Sleep(1000);
}
return(0);
// — 4 — ================= Окончание блока =======================
}

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

В свою очередь, цена Price должна быть выше текущей цены Ask. Параметры TakeProfit и StopLoss также настраиваются пользователем. Поэтому они также подвергаются проверке. Здесь все понятнее – профит должен быть выше цены открытия ордера Buy Limit на StopLevel пунктов, а стоп – ниже цены открытия на те же StopLevel пунктов.

Если все параметры заданы пользователем правильно, то происходит переход к третьему блоку, где и производится ожидание нужной цены. Для придания ожиданию б?льшей информативности в левом верхнем углу экрана выводится сообщение об ожидании цены, а также рисуется желтая горизонтальная линия, соответствующая цене Price. Также стоит заметить, что в случае с Buy Stop Limit все цены указываются по Ask, поэтому именно равенство цен Price и Ask скрипт будет ожидать. Ожидание происходит в цикле, выход из которого возможен по двум событиям: остановка скрипта пользователем и достижение ценой нужного значения.

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

Очень похожа на первую часть скрипта вторая часть, обрабатывающая SellStopLimit:

else
if (Type == 1) // Если выбран SellStopLimit
{
// — 5 — ==== Проверка правильности входных параметров для SellStopLimit =======
if (StopLimitPrice <= (Price+StopLevel))      // Проверка значения StopLimitPrice
{
Alert(«При установке SellStopLimit цена StopLimitPrice должна быть выше Price»);
return(0);
}
if (Price >= Bid)                                      // Проверка значения Price
{
Alert(«При установке SellStopLimit цена Price должна быть ниже Bid»);
return(0);
}
if (StopLimitPrice — TakeProfit <= StopLevel)     // Проверка значения TakeProfit
{
Alert(«Слишком близкий TakeProfit»);
return(0);
}
if (StopLoss — StopLimitPrice <= StopLevel)         // Проверка значения StopLoss
{
Alert(«Слишком близкий StopLoss»);
return(0);
}
// — 5 — ================= Окончание блока =======================

// — 6 — ==== Ожидание достижения ценой значения StopLimitPrice =============
Comment(«Скрипт MT5_BuyStopLimit_SellStopLimit ожидает достижение ценой значения»,
Price);
ShowPrice(Price);
double NBid = ND(MarketInfo(Symbol(), MODE_BID));
while(!IsStopped() && NBid > Price && !IsStopped())
NBid = ND(MarketInfo(Symbol(), MODE_BID));
deinit();
if (IsStopped())  return(0);
// — 6 — ================= Окончание блока =======================

// — 7 — ==== Нужная цена достигнута — ставим ордер SellLimit ================
while (!FatalError && !Res)
{
Res = OpenOrder(OP_SELLLIMIT, StopLimitPrice, TakeProfit, StopLoss);
Sleep(1000);
}
return(0);
}
// — 7 — ================= Окончание блока =======================

Пятый блок идентичен второму с присущими для ордера Sell Limit изменениями. Напомню, с этим типом ордеров все цены считаются по Bid.

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

Седьмой блок, также как и четвертый, пытается установить ордер, только не Buy Limit, а уже Sell Limit.

Вот и вся нехитрая логика скрипта.

При запуске скрипта можно установить значения входных параметров:
•    Lots = 0.1 – объем каждого ордера
•    Type = 0 – Тип устанавливаемого ордера: 0 — BuyStopLimit, 1 – SellStopLimit
•    StopLimitPrice = 1.46 — цена, по которой будет установлен ордер Limit
•    Price = 1.47 —  цена, по достижению которой будет установлен ордер Limit
•    TakeProfit = 1.47 – уровень профита для ордера
•    StopLoss = 1.45 – уровень стоп-приказа для ордера

Полный исходный код скрипта можно найти здесь.

Добавить комментарий

Кнопка возврата к началу