Полезные функции от KimIV - страница 7

 

Ну что ж, раз вопросов нет, продолжим...

Функция ModifyOrder().

Функция ModifyOrder предназначена для изменения одного или нескольких ценовых уровней одного предварительно выбранного ордера. Здесь под ордером понимается как отложенный ордер Limit или Stop, так и рыночный ордер Buy или Sell, то есть позиция. У позиции с помощью функции ModifyOrder можно изменить два ценовых уровня StopLoss и TakeProfit, а у отложенного ордера дополнительно к этим ещё и цену установки OpenPrice. Изменяемые ценовые уровни передаются в функцию ModifyOrder как параметры. Если какой-либо параметр будет отрицательным, то соответствующий ценовой уровень не будет изменён.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=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);
      }
    }
  }
}
 

Примеры использования функции ModifyOrder().

Самыми первыми я решил дать примеры, о которых меня уже спрашивали неоднократно. Это открытие позиций в условиях рыночного исполнения торговых заявок Market Watch. Это когда нельзя одновременно отдать приказ на открытие позиции по рыночной цене и прикрепить к ней отложенный ордер. Такое открытие в условиях Market Watch нужно выполнять в два этапа: сначала открывать позицию, а потом прикреплять к ней отложенные ордера, то есть устанавливать ценовые уровни StopLoss и TakeProfit.

1. Купить 0.1 лота текущего инструмента и установить стоп 30 пунктов

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2. Продать 0.15 лота текущего инструмента и установить SL=45, TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
В прицепе работающий скрипт с примерами.
Файлы:
 
Игорь, а есть ли у вас функция закрытия ордеров (как просто Close, так и CloseBy)?
 
Lukyanov:
Игорь, а есть ли у вас функция закрытия ордеров (как просто Close, так и CloseBy)?
Close - есть, CloseBy - нет.
 
Close в алфавитном порядке должна быть ранее функции ModifyOrder ;-)
 
Lukyanov:
Close в алфавитном порядке должна быть ранее функции ModifyOrder ;-)
Да, верно... сначала Open, потом Modify, а в конце Close ;-)
 

Логично... ;)

Не сочтёте нахальством маленький, на один пост, ликбез на тему "Передачи в функцию" ?
Пока для меня это тёмный логико-идеологический лес...
(а нет, таки нет...)

 
kombat писал (а):
Не сочтёте нахальством маленький, на один пост, ликбез на тему "Передачи в функцию" ?
Нет, не сочту. Касаемо моих функций допустимы любые вопросы в любое время. Отвечать буду стараться на все...
 

Спасибо...
И конечно не к спеху... торопиться некуда.
Рынок от нас не убежит... :)))

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