перемещение отложенного ордера

 
Будьте любезны подскажите код автоматического перемещения отложенного ордера в одном направлении за ценой, отстоящего от нее на определенное количество пунктов
 
Будьте любезны подскажите код автоматического перемещения отложенного ордера в одном направлении за ценой, отстоящего от нее на определенное количество пунктов
Да к стати интересный вопрос??? Если можно подрообнее, как сделать так чтоб отложник полз за ценой на определённом растоянии от неё)))
 
Вот-вот! Давно об этом мечтаю. Я уже как-то запрашивал помощь по данному вопросу. Ответа не получил. А хотелось бы, как трейллинг: движение ордера строго в одну из сторон за ценой на установленном расстоянии и его остановка при движении цены в сторону ордера. Думаю, такое разработчики всё же могли бы замутить через правый клик мыши.
 
Насколько я помню, торговая система "Подмышки", как раз этим и занимается:
//+------------------------------------------------------------------+
//|                                                    e-Armpits.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|  21.09.2005  Торговая система ПОДМЫШКИ                           |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"
#define   MAGIC     20050921

//------- Внешние параметры советника --------------------------------
extern string _Parameters_Trade = "----- Параметры торговли";
extern bool   UseOneAccount = True;         // Торговать только на одном счёте
extern int    NumberAccount = 71597;        // Номер торгового счёта
extern string Name_Expert   = "e-Armpits";
extern bool   UseSound      = True;         // Использовать звуковой сигнал
extern string NameFileSound = "expert.wav"; // Наименование звукового файла
extern color  clOpenBuy     = Blue;         // Цвет открытия покупки
extern color  clOpenSell    = Red;          // Цвет открытия продажи
extern color  clModiBuy     = Blue;         // Цвет модификации покупки
extern color  clModiSell    = Red;          // Цвет модификации продажи
extern color  clCloseBuy    = Aqua;         // Цвет закрытия покупки
extern color  clCloseSell   = Violet;       // Цвет закрытия продажи
extern bool   UseHourTrade  = False;        // Использовать время торговли
extern int    HourBegTrade  = 7;            // Время начала торговли
extern int    HourEndTrade  = 18;           // Время конца торговли
extern int    Slippage      = 7;            // Проскальзывание цены
extern double Lots          = 0.1;          // Размер торгуемого лота
extern int    TrailingStop  = 10;           // Размер трала
extern int    TrailingStep  = 2;            // Шаг трала
extern string _Parameters_Expert = "----- Параметры советника";
extern int    ClearanceSet  = 10;           // Зазор установки ордеров
extern int    ClearanceStop = 5;            // Зазор установки ордеров
extern int    MaxStopLoss   = 20;           // Максимальный StopLoss
extern int    DeltaPrice    = 7;            // Изменение цены

//---- Глобальные переменные советника -------------------------------
int    ms[5];
int    prevBar;    // Предыдущее количество баров
string mess;       // Текст сообщения, комментария

//------- Подключение внешних модулей --------------------------------

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
void deinit() {
  Comment("");
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  if (UseOneAccount && AccountNumber()!=NumberAccount) {
    Comment("Торговля на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
    return;
  } else Comment("");

  if (UseHourTrade && (Hour()<HourBegTrade || Hour()>=HourEndTrade)) {
    Comment("Время торговли ещё не наступило!");
    return;
  } else Comment("");

  if (prevBar!=Bars && prevBar!=0) {
    CheckForSetOrders();
    CheckForModify();
  }
  TrailingPositions();
  prevBar=Bars;
}

//+------------------------------------------------------------------+
//| Проверка условий установки ордеров                               |
//+------------------------------------------------------------------+
void CheckForSetOrders() {
  // Ордер на покупку
  if (High[2]-High[1]>DeltaPrice*Point) {
    if (!ExistBuy()) SetOrderBuyStop(High[1]+ClearanceSet*Point);
  }

  // Ордер на продажу
  if (Low[1]-Low[2]>DeltaPrice*Point) {
    if (!ExistSell()) SetOrderSellStop(Low[1]-ClearanceSet*Point);
  }
}

//+------------------------------------------------------------------+
//| Проверка условий модификации установленных ранее ордеров         |
//| или открытых позиций                                             |
//+------------------------------------------------------------------+
void CheckForModify() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_BUYSTOP) {
          if (OrderOpenPrice()>High[1]+ClearanceSet*Point) {
            OrderModify(OrderTicket(),High[1]+ClearanceSet*Point,GetStopLoss(OP_BUYSTOP),0,0,clModiBuy);
          }
        }
        if (OrderType()==OP_SELLSTOP) {
          if (OrderOpenPrice()<Low[1]-ClearanceSet*Point) {
            OrderModify(OrderTicket(),Low[1]-ClearanceSet*Point,GetStopLoss(OP_SELLSTOP),0,0,clModiSell);
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_BUY) {
          if (CurTime()-OrderOpenTime()>5400 && OrderProfit()<0) CloseBuy();
          if (Bid-OrderOpenPrice()>TrailingStop*Point) {
            if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) {
              ModifyStopLoss(Bid-TrailingStop*Point);
            }
          }
        }
        if (OrderType()==OP_SELL) {
          if (CurTime()-OrderOpenTime()>5400 && OrderProfit()<0) CloseSell();
          if (OrderOpenPrice()-Ask>TrailingStop*Point) {
            if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) {
              ModifyStopLoss(Ask+TrailingStop*Point);
            }
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Закрыть длинную (BUY) позицию по рыночной цене                   |
//+------------------------------------------------------------------+
void CloseBuy() {
  bool fc;
  fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
  if (fc && UseSound) PlaySound(NameFileSound);
}

//+------------------------------------------------------------------+
//| Закрыть короткую (SELL) позицию по рыночной цене                 |
//+------------------------------------------------------------------+
void CloseSell() {
  bool fc;
  fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
  if (fc && UseSound) PlaySound(NameFileSound);
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования ордера BUYSTOP или позиции BUY     |
//+------------------------------------------------------------------+
bool ExistBuy() {
  bool BuyExist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_BUY || OrderType()==OP_BUYSTOP) BuyExist=True;
      }
    }
  }
  return(BuyExist);
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования ордера SELLSTOP или позиции SELL   |
//+------------------------------------------------------------------+
bool ExistSell() {
  bool SellExist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
        if (OrderType()==OP_SELL || OrderType()==OP_SELLSTOP) SellExist=True;
      }
    }
  }
  return(SellExist);
}

//+------------------------------------------------------------------+
//| Установить ордер BUYSTOP                                         |
//+------------------------------------------------------------------+
void SetOrderBuyStop(double pAsk) {
  double ldLot, ldStop;
  string lsComm;

  ldLot  = GetSizeLot();
  ldStop = GetStopLoss(OP_BUYSTOP);
  lsComm = GetCommentForOrder();
  if (pAsk-ldStop<MaxStopLoss*Point) {
    OrderSend(Symbol(),OP_BUYSTOP,ldLot,pAsk,Slippage,ldStop,0,lsComm,MAGIC,0,clOpenBuy);
    if (UseSound) PlaySound(NameFileSound);
  }
}

//+------------------------------------------------------------------+
//| Установить ордер SELLSTOP                                        |
//+------------------------------------------------------------------+
void SetOrderSellStop(double pBid) {
  double ldLot, ldStop;
  string lsComm;

  ldLot  = GetSizeLot();
  ldStop = GetStopLoss(OP_SELLSTOP);
  lsComm = GetCommentForOrder();
  if (ldStop-pBid<MaxStopLoss*Point) {
    OrderSend(Symbol(),OP_SELLSTOP,ldLot,pBid,Slippage,ldStop,0,lsComm,MAGIC,0,clOpenSell);
    if (UseSound) PlaySound(NameFileSound);
  }
}

//+------------------------------------------------------------------+
//| Генерирует и возвращает строку коментария для ордера или позиции |
//+------------------------------------------------------------------+
string GetCommentForOrder() {
  return(Name_Expert);
}

//+------------------------------------------------------------------+
//| Главная функция получения размера лота (вызывается из советника) |
//+------------------------------------------------------------------+
double GetSizeLot() {
  return(Lots);
}

//+------------------------------------------------------------------+
//| Возвращает уровень StopLoss для ордера или позиции               |
//| Параметры:                                                       |
//|   op - вид операции                                              |
//+------------------------------------------------------------------+
double GetStopLoss(int op) {
  double ldStop=0, sp=MarketInfo(Symbol(), MODE_SPREAD);

  if (op==OP_BUYSTOP)  ldStop=Low[1]-ClearanceStop*Point;
  if (op==OP_SELLSTOP) ldStop=High[1]+(ClearanceStop+sp)*Point;

  return(ldStop);
}

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;         // Флаг модификации позиции

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+
 
Порылся у себя в закромах и нашёл ещё одного советника по теме. Он выполняет перемещение всех стоповых ордеров вслед за ценой.
//+------------------------------------------------------------------+
//|                                                 e-SOTrailing.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 03.09.2006 Автоматический Trailing всех стоповых ордеров.        |
//|            Вешать только на один график.                         |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Внешние параметры ------------------------------------------
extern bool   AllStopOrders = False;   // Управлять всеми стоповыми ордерами
extern int    TrailingStop  = 20;      // Фиксированный размер трала
extern int    TrailingStep  = 3;       // Шаг трала
extern bool   UseSound      = True;    // Использовать звуковой сигнал
extern string NameFileSound = "expert.wav"; // Наименование звукового файла
extern color  clModifyBuy   = Aqua;         // Цвет модификации покупки
extern color  clModifySell  = Tomato;       // Цвет модификации продажи

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (AllStopOrders || OrderSymbol()==Symbol()) {
        TrailingOrders();
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Сопровождение ордеров простым тралом                             |
//+------------------------------------------------------------------+
void TrailingOrders() {
  double pBid, pAsk, pp;

  pp=MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUYSTOP) {
    pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
    if (OrderOpenPrice()-pAsk>(TrailingStop+TrailingStep-1)*pp) {
      ModifyOpenPrice(pAsk+TrailingStop*pp, clModifyBuy);
    }
  }
  if (OrderType()==OP_SELLSTOP) {
    pBid=MarketInfo(OrderSymbol(), MODE_BID);
    if (pBid-OrderOpenPrice()>(TrailingStop+TrailingStep-1)*pp) {
      ModifyOpenPrice(pBid-TrailingStop*pp, clModifySell);
    }
  }
}

//+------------------------------------------------------------------+
//| Перенос ордера                                                   |
//| Параметры:                                                       |
//|   ldOpen  - уровень OpenPrice                                    |
//|   lcColor - цвет модификации                                     |
//+------------------------------------------------------------------+
void ModifyOpenPrice(double ldOpen, color lcColor=CLR_NONE) {
  bool   fm;
  double ldStop=OrderStopLoss();
  double ldTake=OrderTakeProfit();

  fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, lcColor);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+
 
Спасибо за ответ, Kim IV. Вбив свой счет в торговую систему "Подмышки", прикрепил к графику, не работает.
В чем может быть дело
 
Kim IV,проясните принцип работы торговой системы "Подмышки". выставляю отложен.ордера buy , sell- limit,stop--не модифицируются
 
Kim IV,проясните принцип работы торговой системы "Подмышки".

Что-то типа обнаружения движения на некотором количестве часовых баров. Например, обнаружено движение вверх, под это движение подставляется SellStop. Если движение вниз, то подставляется BuyStop. Отсюда название системы "Подмышки". Сам придумал, гы...

выставляю отложен.ордера buy , sell- limit,stop--не модифицируются

Советник не будет работать с Вашими ордерами. Он свои сам ставит...
Я ведь выложил не готовое решение, а чтобы посмотрели, как в коде организуется модификация ордеров.
 
Такой интерестный вопрос, а решения так и не нашли?
 
Зачем тащить отложник за ценой? Чтобы он никогда не исполнился?

Ну раз надо, то OrderModify в помощь
Причина обращения: