工作已完成
![](https://c.mql5.com/i/avatar/avatar_na2.png)
![](https://c.mql5.com/i/avatar/avatar_na2.png)
指定
Техническое задание.
Нужно написать робота (вспомогательного) для изменения цены открытия отложенных ордеров при изменении суммарного объёма открытых ордеров на счёте.
Суть:
1) То, что происходит на счёте без участия робота (с помощью двух других программ – мультивалютного советника, открывающего ордера BUY или SELL и программы, выставляющей отложенные локирующие ордера SELL STOP и BUY STOP). Примеры:
открывается основной ордер BUY объёмом 1 лот по цене 1000 пунктов. К нему тут же встаёт локирующий отложенный ордер SELL STOP объёмом 0,5 лот по цене 800 пунктов, то есть на расстоянии 200 пунктов от цены открытия основного. Открывается второй основной ордер BUY объёмом 2 лот по цене 950 пунктов, к нему встаёт локирующий отложенный ордер SELL STOP объёмом 1 лот по цене 850 пунктов, то есть на расстоянии 100 пунктов от цены открытия основного. В момент открытия второго основного ордера суммарный объём открытых основных ордеров на счёте возрастает в 3 раза, с 1 лот до 3 лот.
2) Задача робота:
Уменьшить/увеличить расстояние между ценами открытия ордеров внутри каждой пары (основной/локирующий ордер) настолько, насколько увеличился/уменьшился суммарный объём открытых основных ордеров. Объём увеличился в 3 раза, значит каждое расстояние надо уменьшить втрое. Для первой пары расстояние между ценой открытия основного и локирующего ордера 200 пунктов. 200 / 3 = 66. От цены открытия основного ордера откладывается 66, получается новая цена локирующего ордера 1000-66=933 пункта (вместо 800). Для второй пары расстояние между основным и локирующим ордером 100 пунктов. 100/3=33. От цены открытия основного ордера отнимается 33 пункта, получается новая цена открытия локирующего ордера 950-33=917 пунктов (вместо 850).
Я представляю себе программу со следующими настраиваемыми параметрами:
MagicOrdersBasis Monitoring – магики основных ордеров, суммарную лотность которых программа будет учитывать. Все, исключая перечисленные - например №222,№333 (магики, присвоенные ранее локирующим ордерам или ордерам другой программы). Это магики, за которыми робот только следит, сам он магики не присваивает.
MagicOrdersLock Monitoring - магики отложенных локирующих ордеров, среди которых программа будет искать локирующую пару для основного ордера (например 444,555). Магики, за которыми робот следит, сам робот магики не присваивает.
Ratio Lock/Basis - в приведённом выше примере это соотношение составляет 0,5 (объём локирующего ордера составляет 0,5 от объёма основного). Он изменяется (в локирующей программе) и является единым для всех пар Lock/Basis. Нужен для того, чтобы робот нашёл парный локирующий ордер к основному, чтобы потом посчитать расстояние между ними.
MinStop – минимальное расстояние между текущей ценой и ценой открытия локирующего ордера. Если MinStop установлен 30 пунктов, а робот посчитает, что отложенный ордер должен встать на расстоянии 15 пунктов от текущей цены, то расстояние должно установиться равным MinStop, то есть 30 пунктов. (Чтобы лок не попытался встать ближе, чем минимальное расстояние для стопов на сервере).
Digits - 1 или 2 (один или два знака после запятой). На одних счетах возможен объём до 0,1 лот, на других 0,01 лот. MetaTrader округлит значение локирующего ордера до этих цифр, и его надо учитывать при поиске отложенного локирующего ордера.
Последовательность действий робота может выглядеть следующим образом:
1) Открывается (или закрывается) основной ордер.
2) Робот суммирует его объём с объёмом других основных ордеров (или отнимает от суммарного объёма при закрытии ордера).
3) Робот вычисляет, во сколько раз увеличился или уменьшился суммарный объём основных ордеров, определяя последующий коэффициент уменьшения/увеличения расстояния между ценами открытия ордеров в паре Lock/Basis (в привёдённом выше примере увеличение суммарного объёма составило 3 раза, значит расстояние уменьшится тоже в 3).
4) Робот находит «локирующую пару» к открывшемуся основному ордеру, умножая размер основного на Ratio Lock/Basis и учитывая, что лок является противоположным по направлению, он на той же валютной паре, и его магик содержится в MagicOrdersLock Monitoring. Для основного ордера BUY локирующий ордер будет SELL STOP. При основном ордере BUY объёмом 2 лот «локирующей парой» при соотношении 0,5 будет отложенный локирующий ордер SELL STOP объёмом 1 лот с магиком, включённым в MagicOrdersLock Monitoring. При этом нужно учесть, что MetaTrader округляет все цифры до двух или одного знака после запятой. То есть размер локирующего ордера при дробных значениях основного не всегда будет точно вписываться в соотношение 0,5. Например, если объём основного 1,73 лот, тогда при соотношении Lock/Basis 0,5 объём основного получится 0,865. При допустимом минимальном объёме 0,01 MetaTrader округлит его либо до 0,86 либо до 0,87 и надо будет искать ордер либо 0,86, либо 0,87. При допустимом минимальном объёме 0,1 значение огруглится либо до 0,8 либо до 0,9, и надо будет искать лок величиной либо 0,8 либо 0,9.
5) Робот определяет расстояние между ценой открытия основного ордера и ценой открытия локирующего ордера (если цена открытия основного ордера BUY 950 пунктов, а цена открытия отложенного локирующего SELL STOP 850 пунктов, то расстояние между ними 950-850=100 пунктов). Если основной ордер SELL 950 пунктов, а отложенный ордер BUY STOP 1050 пунктов, то расстояние между ними 1050-950=100 (тоже 100 пунктов).
6) Робот делит расстояние в каждой паре Lock/Basis на коэффициент уменьшения/увеличения, полученный ранее (в примере был равен 3). Для первой пары в примере, где «Lock 0,5 лот, 800 пунктов / Basis 1 лот, 1000 пунктов» расстояние между ордерами было 200 пунктов, значит 200/3=66 пунктов – это будет новое расстояние между ордерами для этой пары. Для второй пары в примере, где « Lock 1 лот, 850 пунктов / Basis 2 лот, 950 пунктов» расстояние было 100 пунктов, значит 100/3=33 пункта – новое расстояние между ордерами для пары.
7) Робот изменяет цену открытия каждого локирующего ордера. Для первой пары, где цена открытия основного ордера была 1000 пунктов, будет 1000-66=933 пункта – новая цена открытия локирующего отложенного ордера в этой паре (вместо 800). Для второй пары, где цена открытия основного ордера была 950 пунктов, будет 950-33=917 пунктов – новая цена открытия локирующего отложенного ордера в этой паре (вместо 850).
При этом надо учитывать, что для пары, где основной ордер BUY, его цена открытия (во второй паре в примере это 950) будет выше, чем цена открытия парного отложенного локирующего SELL STOP (во второй паре это 850), то есть для этой пары полученные 33 пункта надо отнимать от цены основного, чтобы получить цену локирующего 950-33=917. Если положение обратное, то есть основной ордер SELL с ценой открытия 950, то его цена будет наоборот ниже, чем цена его локирующего парного ордера BUY STOP с ценой 1050. И полученные 33 пункта надо прибавлять к цене открытия основного ордера 950+33=988 пунктов – новая цена открытия отложенного локирующего ордера в этой паре.
Предполагаемое максимальное число основных ордеров – до 20-ти. Отложенных -до 200.