Функция ModifyOrder предназначена для изменения одного или нескольких ценовых уровней одного предварительно выбранного ордера. Здесь под ордером понимается как отложенный ордер Limit или Stop, так и рыночный ордер Buy или Sell, то есть позиция. У позиции с помощью функции ModifyOrder можно изменить два ценовых уровня StopLoss и TakeProfit, а у отложенного ордера дополнительно к этим ещё и цену установки OpenPrice. Изменяемые ценовые уровни передаются в функцию ModifyOrder как параметры. Если какой-либо параметр будет отрицательным, то соответствующий ценовой уровень не будет изменён.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 28.11.2006 |//| Описание : Модификация одного предварительно выбранного ордера. |//+----------------------------------------------------------------------------+//| Параметры: |//| pp - цена установки ордера |//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//| cl - цвет значка модификации |//+----------------------------------------------------------------------------+voidModifyOrder(doublepp=-1, doublesl=0, doubletp=0, colorcl=CLR_NONE){boolfm;
doubleop, pa, pb, os, ot;
intdg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
if(pp<=0)pp=OrderOpenPrice();
if(sl<0)sl=OrderStopLoss();
if(tp<0)tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
op=NormalizeDouble(OrderOpenPrice() , dg);
os=NormalizeDouble(OrderStopLoss() , dg);
ot=NormalizeDouble(OrderTakeProfit(), dg);
if(pp!=op || sl!=os || tp!=ot){for(it=1; it<=NumberOfTry; it++){if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))break;
while(!IsTradeAllowed())Sleep(5000);
RefreshRates();
fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
if(fm){if(UseSound)PlaySound(NameFileSound); break;
}else{er=GetLastError();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
Print("Ask=",pa," Bid=",pb," sy=",OrderSymbol(),
" op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
Sleep(1000*10);
}}}}
Самыми первыми я решил дать примеры, о которых меня уже спрашивали неоднократно. Это открытие позиций в условиях рыночного исполнения торговых заявок Market Watch. Это когда нельзя одновременно отдать приказ на открытие позиции по рыночной цене и прикрепить к ней отложенный ордер. Такое открытие в условиях Market Watch нужно выполнять в два этапа: сначала открывать позицию, а потом прикреплять к ней отложенные ордера, то есть устанавливать ценовые уровни StopLoss и TakeProfit.
1. Купить 0.1 лота текущего инструмента и установить стоп 30 пунктов
Не сочтёте нахальством маленький, на один пост, ликбез на тему "Передачи в функцию" ? Пока для меня это тёмный логико-идеологический лес... (а нет, таки нет...)
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Ну что ж, раз вопросов нет, продолжим...
Функция ModifyOrder().
Функция ModifyOrder предназначена для изменения одного или нескольких ценовых уровней одного предварительно выбранного ордера. Здесь под ордером понимается как отложенный ордер Limit или Stop, так и рыночный ордер Buy или Sell, то есть позиция. У позиции с помощью функции ModifyOrder можно изменить два ценовых уровня StopLoss и TakeProfit, а у отложенного ордера дополнительно к этим ещё и цену установки OpenPrice. Изменяемые ценовые уровни передаются в функцию ModifyOrder как параметры. Если какой-либо параметр будет отрицательным, то соответствующий ценовой уровень не будет изменён.
Примеры использования функции ModifyOrder().
Самыми первыми я решил дать примеры, о которых меня уже спрашивали неоднократно. Это открытие позиций в условиях рыночного исполнения торговых заявок Market Watch. Это когда нельзя одновременно отдать приказ на открытие позиции по рыночной цене и прикрепить к ней отложенный ордер. Такое открытие в условиях Market Watch нужно выполнять в два этапа: сначала открывать позицию, а потом прикреплять к ней отложенные ордера, то есть устанавливать ценовые уровни StopLoss и TakeProfit.
1. Купить 0.1 лота текущего инструмента и установить стоп 30 пунктов
2. Продать 0.15 лота текущего инструмента и установить SL=45, TP=99
В прицепе работающий скрипт с примерами.Игорь, а есть ли у вас функция закрытия ордеров (как просто Close, так и CloseBy)?
Close в алфавитном порядке должна быть ранее функции ModifyOrder ;-)
Логично... ;)
Не сочтёте нахальством маленький, на один пост, ликбез на тему "Передачи в функцию" ?
Пока для меня это тёмный логико-идеологический лес...
(а нет, таки нет...)
Не сочтёте нахальством маленький, на один пост, ликбез на тему "Передачи в функцию" ?
Спасибо...
И конечно не к спеху... торопиться некуда.
Рынок от нас не убежит... :)))
Спасибо...
И конечно не к спеху... торопиться некуда.
Рынок от нас не убежит... :)))