открытие противоположного ордера при условии стоплосса предыдущего - страница 4

 
Worh:

      соовтесвенно будет так ?    

Если нужно открыть следующий ордер в той же серии, то индекс серии не нужно инкрементировать, только индекс ордера. К примеру, первый ордер в серии с индексом 0:

int nOrderIndex = 0;
int nSeriesIndex = 0;
int nMagicNumber = 455;

int nOrderMagicNumber = 455 * 1000 + 0 * 10 + 0 = 455000;

Второй ордер этой серии:

int nOrderIndex = 1;
int nSeriesIndex = 0;
int nMagicNumber = 455;

int nOrderMagicNumber = 455 * 1000 + 0 * 10 + 1 = 455001;

Первый ордер следующей серии:

int nOrderIndex = 0;
int nSeriesIndex = 1;
int nMagicNumber = 455;

int nOrderMagicNumber = 455 * 1000 + 1 * 10 + 0 = 455010;

Второй ордер серии с индексом 1:

int nOrderIndex = 1;
int nSeriesIndex = 1;
int nMagicNumber = 455;

int nOrderMagicNumber = 455 * 1000 + 1 * 10 + 1 = 455011;
 
Ihor Herasko:

Если нужно открыть следующий ордер в той же серии, то индекс серии не нужно инкрементировать, только индекс ордера. К примеру, первый ордер в серии с индексом 0:

Второй ордер этой серии:

Первый ордер следующей серии:

Второй ордер серии с индексом 1:

Спасибо !

все получается теперь более изящно !

 
Worh:

Спасибо !

все получается теперь более изящно !

Пожалуйста.

Если потребуется, могу еще представить вариант с упаковкой в Magic Number времени открытия серии (наряду ID и индексом ордера). Правда, такой вариант более труден в понимании, т. к. там используются побитовые операции.

 
Ihor Herasko:

Пожалуйста.

Если потребуется, могу еще представить вариант с упаковкой в Magic Number времени открытия серии (наряду ID и индексом ордера). Правда, такой вариант более труден в понимании, т. к. там используются побитовые операции.

Спасибо ! пока не надо . простота текущого решения устраивает. но если время откртыия понадобится то обращусь !

 
Ihor Herasko:

Причину закрытия ордера можно определить вот так:

enum ENUM_CLOSE_REASON
{
   CLOSE_REASON_NONE,                                                                              // Не удалось определить причину закрытия
   CLOSE_REASON_BY_SL,                                                                             // Закрытие ордера по стопу
   CLOSE_REASON_BY_TP,                                                                             // Закрытие ордера по профиту
   CLOSE_REASON_MARKET_PROFIT,                                                                     // Закрытие ордера по рынку в прибыль
   CLOSE_REASON_MARKET_LOSS                                                                        // Закрытие ордера по рынку в убыток
};

ENUM_CLOSE_REASON GetOrderCloseReason(int ticket)
{
   if (!OrderSelect(ticket, SELECT_BY_TICKET) || OrderCloseTime() == 0 || (OrderType() != OP_BUY && OrderType() != OP_SELL))   
      return CLOSE_REASON_NONE;
      
   if (OrderType() == OP_BUY)
   {
      if (OrderTakeProfit() > 0.0 && OrderClosePrice() - OrderTakeProfit() > -DBL_EPSILON)
         return CLOSE_REASON_BY_TP;
         
      if (OrderStopLoss() > 0.0 && OrderStopLoss() - OrderClosePrice() > -DBL_EPSILON)
         return CLOSE_REASON_BY_SL;
   }

   if (OrderType() == OP_SELL)
   {
      if (OrderTakeProfit() > 0.0 && OrderTakeProfit() - OrderClosePrice() > -DBL_EPSILON)
         return CLOSE_REASON_BY_TP;
         
      if (OrderStopLoss() > 0.0 && OrderClosePrice() - OrderStopLoss() > -DBL_EPSILON)
         return CLOSE_REASON_BY_SL;   
   }

   // Ордер закрыт по рынку   
   if (OrderProfit() + OrderSwap() + OrderCommission() >= 0.0)
      return CLOSE_REASON_MARKET_PROFIT;
      
   return CLOSE_REASON_MARKET_LOSS;
}

По ходу, здесь что-то не то. DBL_EPSILON должен быть со знаком +.

Причина обращения: