При использовании стандартной библиотеки ctrade стопы игнорируются?

 

В событии OnTrade беру следующие цены:

HistoryOrderGetDouble(order_ticket, ORDER_PRICE_CURRENT)

HistoryOrderGetDouble(order_ticket, ORDER_PRICE_OPEN)

HistoryOrderGetDouble(order_ticket, ORDER_SL)

HistoryOrderGetDouble(order_ticket, ORDER_TP)


ORDER_SL и ORDER_TP не меняются ни при каких транзакциях. Меняются только ORDER_PRICE_CURRENT и ORDER_PRICE_OPEN. После ооооочень длительных мучений я таки решил фиксировать установленные стопы... не по стопам а по "цене открытия" исторического ордера. Минус подхода в том, что я не знаю, что изменилось - тейкпрофит или стоплосс. Так что делаю с учетом выполненной последовательности.

Что то напутали в консерватории?!

P.S. После того как написал, понял что и это неправильно. И сдался. Ушел есть мороженое.

 
Evgeniy Scherbina:

В событии OnTrade беру следующие цены:


ORDER_SL и ORDER_TP не меняются ни при каких транзакциях. Меняются только ORDER_PRICE_CURRENT и ORDER_PRICE_OPEN. После ооооочень длительных мучений я таки решил фиксировать установленные стопы... не по стопам а по "цене открытия" исторического ордера. Минус подхода в том, что я не знаю, что изменилось - тейкпрофит или стоплосс. Так что делаю с учетом выполненной последовательности.

Что то напутали в консерватории?!

В торговой истории сохраняются текущие уровни SL и TP которые были у позиции на момент закрытия. 

Если бы каждая модификация позиции сохранялась в торговую историю - никакого хранилища бы не хватило.

 
Vladimir Karputov:

В торговой истории сохраняются текущие уровни SL и TP которые были у позиции на момент закрытия. 

Если бы каждая модификация позиции сохранялась в торговую историю - никакого хранилища бы не хватило.

МТ5 классная прога, но OnTrade работает неправильно!!
 
Evgeniy Scherbina:
МТ5 классная прога, но OnTrade работает неправильно!!

Пример минимальный в студию. Особенно интересует, как получаете и изменяете  order_ticket

 

В моей стратегии я должен вести учет текущий и исторический. При этом исторический меня интересует не дальше последнего бая и селла.

Поэтому я решил создать 2 массива positions_int и positions_double, в которых и учитывать все что нужно. Вопрос встал, как заполнить стопы. В итоге я заполняю их после положительного изменения: ctrade.ResultRetcode()

В OnTrade оставил только записи об открытии новых сделок и закрытии по стопам имеющихся:

void OnTrade(){
  trade_event_is_processed = false;
  

  HistorySelect(0, _TimeCurrent+10);
  
  
  bool order_position_id_found = false;
  int i, j, orders_total = HistoryOrdersTotal();
  int position_id, reason;
  ulong order_ticket;
  
  
  int positions_index = ArrayRange(positions_int, 0);
  
  
  for(i=0; i<orders_total; i++){
    if((order_ticket = HistoryOrderGetTicket(i)) > 0){
      if(HistoryOrderGetString(order_ticket, ORDER_SYMBOL) == _Symbol){
        if(HistoryOrderGetInteger(order_ticket, ORDER_MAGIC) == 8121983){
          position_id = (int) HistoryOrderGetInteger(order_ticket, ORDER_POSITION_ID);
          
          
          if(position_id != 0){
            order_position_id_found = false;
            reason = (int) HistoryOrderGetInteger(order_ticket, ORDER_REASON);
          
          
            for(j=0; j<ArrayRange(positions_int, 0); j++){
              if(positions_int[j][0] == position_id){
                order_position_id_found = true;
                
                
                // еще не закрыто
                if(positions_int[j][3] == 0){
                  // это закрытие
                  if(reason == ORDER_REASON_SL || reason == ORDER_REASON_TP){
                    positions_int[j][3] = (int) HistoryOrderGetInteger(order_ticket, ORDER_TIME_DONE);
                  }


                  // и вот где-то здесь хотелось бы получать стопы, но стопы, как написал в посте выше, всегда равны нуль
                  //
                }
              }
            }
            
            
            // если ордер не найден, значит, новая позиция
            if(!order_position_id_found){
              ArrayResize(positions_double, positions_index+1);
              ArrayResize(positions_int, positions_index+1);
              
              positions_int[positions_index][0] = position_id;
              positions_int[positions_index][1] = (int) HistoryOrderGetInteger(order_ticket, ORDER_TYPE);
              positions_int[positions_index][2] = (int) HistoryOrderGetInteger(order_ticket, ORDER_TIME_DONE);
              positions_int[positions_index][3] = 0;
              
              positions_double[positions_index][0] = HistoryOrderGetDouble(order_ticket, ORDER_PRICE_OPEN);
              positions_double[positions_index][1] = 0;
              positions_double[positions_index][2] = 0;
            }
          }
        }
      }
    }
  }
}
Причина обращения: