OrderModify При создании нового ордера, как изменить TakeProfit у преді

 

Привет всем.

Есть такая проблема:

Есть 3 прочтых стратегии, каждая из которых открывает новый ордер Бай/Селл, соответсвенно устанавливает тейкпрофит и стоплос

Суть проблемы, как сделать так, если открылся ордер Бай2, то нужно изменить ордер Бай1 и изменить тейкпрофит, стоплос на тот который в Бай2

Далее если открылся Бай3, то меняется тейкпрофит и стоплосс в Бай2, Бай1  --- соответсвенно к уровню Бай3

Тоже самое для SELL

Поонимаю что нужно OrderModify , нужно Ticket.  Но как тогда вытянуть тикет и понимать какой куда???

Спасибо за коменты и идеи.


Часть программы для открытия ордеров:

void OpenOrder(int Direction, double lot, double TP, double SL, int magic)//Direction: 1,3,5==BUY; 2,4,5==SELL;

{

   int OType=0,Ticket=0;

   double TProfit=0,SLoss=0,price=0;

   color clr=0;

   if(Direction==1)

   {

      OType=OP_BUY;

      price=NormalizeDouble(Ask,Digits);

      TProfit=NormalizeDouble(Bid+NormalizeDouble(TP*Point,Digits),Digits);

      SLoss=NormalizeDouble(Bid-NormalizeDouble(SL*Point,Digits),Digits);

      clr=Blue;

   }

   if(Direction==2)

   {

      OType=OP_SELL;

      price=NormalizeDouble(Bid,Digits);

      TProfit=NormalizeDouble(Ask-NormalizeDouble(TP*Point,Digits),Digits);

      SLoss=NormalizeDouble(Ask+NormalizeDouble(SL*Point,Digits),Digits);

      clr=Red;

         }

       if(Direction==3)

   {

      OType=OP_BUY;

      price=NormalizeDouble(Ask,Digits);

      TProfit=buyProfit1;

      SLoss=NormalizeDouble(Bid-NormalizeDouble(SL*Point,Digits),Digits);

      clr=Blue;

      }

   if(Direction==4)

   {

      OType=OP_SELL;

      price=NormalizeDouble(Bid,Digits);

      TProfit=sellProfit1;

      SLoss=NormalizeDouble(Ask+NormalizeDouble(SL*Point,Digits),Digits);

      clr=Red;

      }

          if(Direction==5)

   {

      OType=OP_BUY;

      price=NormalizeDouble(Ask,Digits);

      TProfit=buyProfit2;

      SLoss=NormalizeDouble(Bid-NormalizeDouble(SL*Point,Digits),Digits);

      clr=Blue;

      }

   if(Direction==6)

   {

      OType=OP_SELL;

      price=NormalizeDouble(Bid,Digits);

      TProfit=sellProfit2;

      SLoss=NormalizeDouble(Ask+NormalizeDouble(SL*Point,Digits),Digits);

      clr=Red;

      }

     if(TP==0)TProfit=0;

   if(SL==0)SLoss=0;

      Ticket=OrderSend(Symbol(),OType,lot,price,Slippage,0,0,"order",magic,0,clr);


 

Очевидно, что нужно идентифицировать ордера как Buy1..3. Для этого есть два пути:

  1. Запоминать тикеты ордеров при их открытии. Подойдет в тех случаях, если стратегия работает без переноса на другой терминал/компьютер.
  2. Записывать идентификаторы (не тикеты) в поле MagicNumber. То есть совместно с ID эксперта записывать туда что-то типа 1, 2, 3 и т.д. В этом случае, найдя ордер при очередном переборе всех рабочих ордеров, всегда можно будет узнать, какой ордер Buy1, а какой - Buy3. Этот вариант является универсальным.

P. S. Хотя есть еще один специфический способ, так сказать, частный случай. Можно распределять ордера по времени их открытия. То есть берем SL и TP от того ордера, который открыт позже других, и устанавливаем эти цены для всех более ранних ордеров.
 
Во первых
12020
Konstantin Nikitin 2019.05.14 19:29   RU

А во вторых Глобальные переменные терминала вам в помощь.
 
Спасибо всем. Уже сделал . Через голобальные переменные. Пока так
 
Голобальные переменные тут лишние, как мне кажется. Для себя я решил аналогичную проблему перебором ордеров и сравнением времени открытия. Самый свежий Бай-х не трогаем, а остальные Бай-1,-2...-х-1 модифицируем по своему усмотрению.