Советники: Close_All_if_Profit_or_Loss.mq4

 

Close_All_if_Profit_or_Loss.mq4:

Закрывает все открытые ордера при изменении эквити на заданное значение. Используется динамический минимальный уровень, поэтому можно использовать как виртуальный трал.

Author: Sergey Guliaev

 

Сейчас нет терминала под рукой - проверить не могу: никогда так не закрывал активные позиции, как в коде автора OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5);

вроде бы как OrderClosePrice() - это для уже закрытых ордеров, выбранных с помощью SELECT_BY_POS,MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров. Если ордер открыт, неуж-то ему будет назначено автоматом Ask или Bid в зависимости от его типа? Может быть я навсегда отстал от жизни? :)

 
да, OrderClosePrice() на открытом ордере вернет 0, но это допустимо, хоть и некорректно и некрасиво. Ордер закроется.
 
Techno:
да, OrderClosePrice() на открытом ордере вернет 0, но это допустимо, хоть и некорректно и некрасиво. Ордер закроется.

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

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


Пока работает... А на каком нибудь новом билде может и заглючить. Посему я буду по старинке:

switch(OrderType())

{

case 0 : OrderClose(OrderTicket(),OrderLots(),Bid,slippage); break;

case 1 : OrderClose(OrderTicket(),OrderLots(),Ask,slippage);

}

 
PPC:
valenok2003:
Поскольку функция OrderClosePrice( ) не задокументирована, я рискнул предположить, что для открытых ордеров она возвращает текущую цену закрытия, всё заработало. Результат есть, как работает чёрный ящик мне не интересно.


Пока работает... А на каком нибудь новом билде может и заглючить. Посему я буду по старинке:

switch(OrderType())

{

case 0 : OrderClose(OrderTicket(),OrderLots(),Bid,slippage); breack;

case 1 : OrderClose(OrderTicket(),OrderLots(),Ask,slippage); break;

}

А изящнее так -

switch (OrderType()) {
case 0: prc=Ask;break;
case 1: prc=Bid; }

OrderClose(OrderTicket(),OrderLots(),prc,slippage);

 

SHOOTER777 писал(а):

А изящнее так -

switch (OrderType()) {
case 0: prc=Ask;break;
case 1: prc=Bid; }

OrderClose(OrderTicket(),OrderLots(),prc,slippage);


Ага... и на одну переменную больше, + добавляется ненужная операция присваивания :-)
 

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

 
alexminak:

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


Абсолютно верно. Кстати, я всегда так и делаю: перекрытые через OrderCloseBy() - просто в данном случае (в рамках предложенного автором советника) я это не рассматривал.