Как правильно сделать "доливку" к убыточной позиции?

 

Необходимо "долиться" к убыточной позиции, например, если позиция уходит в минус на Dolivka_pip пунктов, то открываем новую позицию в ту же сторону с ТП равным ТП предыдущего ("минусового") ордера.

Проблема: если ордер один, то все нормально, "доливка" работает как надо.
А если открытых ордеров несколько, то "доливка" к одному и тому же ордеру делается несколько раз,
как этого избежать. Т.е. необходимо, как-то запомнить что к этому ордеру мы уже "долились" для того, чтобы больше к нему не "доливать".

// переменные
 
extern int        Sdelki         = 10;   // макс. кол-во открытых ордеров
extern bool       Dolivka        = true; // доливка
extern int        Dolivka_pip    = 20;   // уровень срабатывания доливки
int               _MagicNumber   = 12345;
 
 
int _ExpertOrdersTotal = OrdersTotal();
 
 
// проверка
 
if (Dolivka && _ExpertOrdersTotal<Sdelki*2) Dolivalka();
 
// доливка
 
void Dolivalka()
{ 
 
   int cnt;
   for(cnt=_ExpertOrdersTotal-1;cnt>=0;cnt--)
   //for(cnt=0;cnt<_ExpertOrdersTotal;cnt++)
      {
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()!=Symbol())
         continue;
         if(OrderSymbol()==Symbol() && OrderMagicNumber()== _MagicNumber )
         if(OrderType()==OP_SELL && (OrderOpenPrice()-Ask) < (-Dolivka_pip*Point))
            {
               double   lots1=LotsCounting(OP_SELL); if (lots1==0) return; 
               double   loss1=0; if (StopLoss>0) loss1=NormalizeDouble(Bid+StopLoss*Point, Digits); 
               double   profit1=0; if (OrderTakeProfit()>0) profit1=OrderTakeProfit(); 
   
               if       (OrderSend(Symbol(),OP_SELL,lots1,Bid,Slipi,loss1,profit1,"доливка",_MagicNumber,0,CLR_NONE)<0)
                  {  
                  ShowError(); // если ордер не открылся - выводим ошибку
                               // сюда добавить обработку ошибки --------!!!
                  }
            }
         
         if(OrderType()==OP_BUY && (OrderOpenPrice()-Bid) > Dolivka_pip*Point)
            {
               double   lots2=LotsCounting(OP_BUY); if (lots2==0) return; 
               double   loss2=0; if (StopLoss>0) loss2=NormalizeDouble(Ask-StopLoss*Point, Digits);
               double   profit2=0; if (OrderTakeProfit()>0) profit2=OrderTakeProfit(); 
 
               if       (OrderSend(Symbol(),OP_BUY,lots2,Ask,Slipi,loss2,profit2,"доливка",_MagicNumber,0,CLR_NONE)<0)
                  {  
                  ShowError(); // если ордер не открылся - выводим ошибку
                               // сюда добавить обработку ошибки --------!!!
                  }
            }
  
      }
   ShowError(); 
}
 

На доливку - другой ордер с другим "магиком", см. статью Игоря Кима.

 
доливку организуй лучше со смыслом а не по пунктам и вот здесь же неплохо замешать скрипт - решение задачки )))
'Задачка!!!'
 
FION писал (а):

На доливку - другой ордер с другим "магиком"...


Это решит вопрос о не доливке к ордеру который сам является доливкой.
Но не решит вопрос повторной доливки к основному ордеру. Объясню:
Допустим Ордер№1 ушел в минус на 50 пунктов, сработала доливка (открылся Ордер№2-доливка), при дальнейшей проверке, Ордер№1 ушел еще больше в минус - к нему открывается еще одна доливка - которая не нужна - как этого избежать?

В статье и примера Игоря Кима - ответа на мой вопрос не нашел.
 
А почему бы не доливать только к последнему ордеру?
Хинт: У последнего ордера OrderOpenTime() самый большой. :)
Из недокументированного: ордера добавляются в конец списка. Если в цикле идти сверху (как, собственно, и сделано), то после первого найденного можно вываливаться даже без проверки времени открытия.
Здесь, правда, нужно ловить последнюю длинную и короткую.

Кстати, код в примере какой-то, мягко говоря, странноватый.

Две подряд проверки на OrderSymbol(). Вторая, очевидно, никогда не сработает, стало быть, redundant.
По маджику фильтруются только короткие позиции. Длинные позиции почему-то обрабатываются все, без учета маджика.
Если размер для новой короткой позиции нулевой, длинные не рассматриваются вообще.

PS
Интереснее может получиться, если наращивать размер экспоненциально, а не линейно.
Впрочем, так и сольет быстрее :)
 
Irtron:
А почему бы не доливать только к последнему ордеру?
Или к самому "неубыточному" из убыточных. Такой надо будет искать по всему списку, хотя он и будет, по логике, последним в данном направлении.
 
sashken писал (а):
FION писал (а):

На доливку - другой ордер с другим "магиком"...


Это решит вопрос о не доливке к ордеру который сам является доливкой.
Но не решит вопрос повторной доливки к основному ордеру. Объясню:
Допустим Ордер№1 ушел в минус на 50 пунктов, сработала доливка (открылся Ордер№2-доливка), при дальнейшей проверке, Ордер№1 ушел еще больше в минус - к нему открывается еще одна доливка - которая не нужна - как этого избежать?

В статье и примера Игоря Кима - ответа на мой вопрос не нашел.

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

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

Вот я и хочу узнать как поставить флаг. Через OrderModify?
 
sashken писал (а):
FION писал (а):

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

Вот я и хочу узнать как поставить флаг. Через OrderModify?
Флаг - это логическая функция , после выполнения некоторой операции ей присваивается значение -противоположное присвоенному заранее, посмотрите советники Игоря Кима, он любит использовать флаги.
 
Пардон, не сразу догнал, про какие несколько позиций идет речь. Проще всего идентифицировать "доливные" группы по одинаковому т/п и выбирать последний (первый с конца) с нужным т\п и к нему доливать, если надо. Если по тейкпрофиту не удается, например, когда у разных групп может быть одинаковый т/п, тогда для каждой группы свой маджик.
 
sashken писал (а):
Объясню:
Допустим Ордер№1 ушел в минус на 50 пунктов, сработала доливка (открылся Ордер№2-доливка), при дальнейшей проверке, Ордер№1 ушел еще больше в минус - к нему открывается еще одна доливка - которая не нужна - как этого избежать?


Алгоритмически можно так. При создании Ордер№2-доливка ему в комментарии пишется magic number 1-го Ордер№1. И перед созданием ордера-доливки проверяется, существует ли ордер с комментом, содержащим номер данного. Если да, то не создавать, иначе создать с вышеуказанным комментарием.
Так через комментарии обычно отслеживают какие-то параметры, чтобы не на клиенте их хранить, а на сервере.
Причина обращения: