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

 
Worh:

и как в истории отлавлавть - закрылся по СЛ  или ТП ? по профиту ?

Да, по профиту.

 
Vitaly Muzichenko:

Да, по профиту.

но тут нюанс объясните .

логика такая у меня : открываю порынку первый ордер, заранее  выставляю лимит ордер для первго ордера с ценой = СЛ первого ордера, но заранее выставить ордер для закрытого по стоплос второго ордера надо теперь (по цене = СЛ второго ордера уже). при чем после второго ордера могут открыться и другие ордера по эксперту уже по другой серии...

 
Worh:

и как в истории отлавлавть - закрылся по СЛ  или ТП ? по профиту ?

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

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;
}
 

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

OrderSelect(ticket, SELECT_BY_TICKET) 

лучше OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)     и сравнение цен лучше fabs() без учета знака

 
Alexey Valeev:

Извиняюсь что вмешиваюсь. А смысл что найдя в истории последний закрытый ордер, вы по магику можете узнать каким он был по счёту в серии. И открыть противоположный. Изящное решение!

смысл уловил )

у меня получается первый ордер открлыся по рыночной , второй лимит отредр открылся по цене СЛ первого. а третий откроется в случае СЛ второго ордера.

может в nMagicNumber включить дату открытия пеервых двух ордеров ? (они же однианковые) а потом уже третий открывать , отлавливая по номеру ?

 
STARIJ:

лучше OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)    

Если второй аргумент функции SELECT_BY_TICKET, то третий аргумент игнорируется.

и сравнение цен лучше fabs() без учета знака

Не понял мысль.

 
Worh:

смысл уловил )

у меня получается первый ордер открлыся по рыночной , второй лимит отредр открылся по цене СЛ первого. а третий откроется в случае СЛ второго ордера.

Точно лимитный ордер? Если так, то выходит, что все три ордера имеют однаковый тип - все Buy или все Sell. В этом случае возникает вопрос: зачем закрывать ордер по Stop Loss и тут же открывать точно такой же ордер в том же направлении? Это ведь просто подарок брокеру в виду спреда.

может в nMagicNumber включить дату открытия пеервых двух ордеров ? (они же однианковые) а потом уже третий открывать , отлавливая по номеру ?

Пока не вижу смысла в запоминании дат. Видится такой алгоритм:

  1. Имеется ордер. Ничего не делаем.
  2. Нет ордеров. Определяем причину закрытия последнего ордера в серии.
2.1 Если последний ордер закрылся по Take Profit, то серия завершена.
2.2 Если последний ордер закрылся по Stop Loss, то открываем ордер с индексом, который на 1 больше индекса последнего закрытого ордера.
Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
Ihor Herasko:

Точно лимитный ордер? Если так, то выходит, что все три ордера имеют однаковый тип - все Buy или все Sell. В этом случае возникает вопрос: зачем закрывать ордер по Stop Loss и тут же открывать точно такой же ордер в том же направлении? Это ведь просто подарок брокеру в виду спреда.

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

Пока не вижу смысла в запоминании дат. Видится такой алгоритм:

  1. Имеется ордер. Ничего не делаем.
  2. Нет ордеров. Определяем причину закрытия последнего ордера в серии.
2.1 Если последний ордер закрылся по Take Profit, то серия завершена.
2.2 Если последний ордер закрылся по Stop Loss, то открываем ордер с индексом, который на 1 больше индекса последнего закрытого ордера.
Но есть нюанс - между закрытием первого оредра из первой серии  может открыться другой ордер из следующей серии (логика советника такова), и тогда индекс как ловить ? как приявзать ордера к одной серии ? дату предлдожил так как вроде как общий признак видится...
 

Worh:

Но есть нюанс - между закрытием первого оредра из первой серии  может открыться другой ордер из следующей серии (логика советника такова), и тогда индекс как ловить ? как приявзать ордера к одной серии ? дату предлдожил так как вроде как общий признак видится...

Если серий несколько, то вместе с индексом ордера записывать индекс серии:

int nMagicNumber = i_nMagicNumber * 1000 + nSeriesIndex * 10 + nOrderIndex;

В момент открытия первого ордера очередной серии нужно пройтись по массиву серий и посмотреть, есть среди них свободный индекс. Если нет, то взять индекс последней серии и увеличить на 1.

 Дело в том что при закрытии первого - открываю второй с увеличенным лотом чтоб перекрыть убыток, и третий сотвесвенно также с увеличенным лотом.

Вот я и говорю, что спред дарите. Не закрывайте первый ордер, а просто открывайте следующий без увеличения объема. В итоге получите совокупное увеличение объема, сэкономив спред.

 

Сейчас на ровном месте потерял более 20 USD. У меня эксперт при достижении определенного профита ставит лок. А потом, CloseBy - закрываем перекрытые позиции.

Эксперт лок поставил, но CloseBy не работает. Даже руками, нет пункта "Закрыть перекрытые позиции". Я что-то пропустил? Полгода не торговал.

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