Как избежать проскальзования?

 

Есть вот такой код, перевода позиции в безубыток:

for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY){
         if(iClose(Symbol(),1440,0)-OrderOpenPrice()==OrderOpenPrice()-OrderStopLoss()){
            Print("BUY ПОЗИЦИЯ ПЕРЕНЕСЕНА В БЕЗУБЫТОК");
            if(TakeProfit>0)
               res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(), OrderOpenPrice()+TakeProfit*Point,0, White);
            else
               res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(), 0,0, White);
         }
      }
      if(OrderType()==OP_SELL){
         if(OrderStopLoss()-OrderOpenPrice()==OrderOpenPrice()-iClose(Symbol(),1440,0)){
            Print("SELL ПОЗИЦИЯ ПЕРЕНЕСЕНА В БЕЗУБЫТОК");
            if(TakeProfit>0)
               res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(), OrderOpenPrice()-TakeProfit*Point,0, White);
            else
               res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(), 0,0, White);
         }
}

Т.е. если позиция дала прибыль равную размеру Стоп лоссу по модулю, то позиция переводится в безубыток. Проблема в том, что фактически цена может проскочить точку равенства и условие не сработает, особенно это заметно при тестировании на исторических данных. Есть ли идеи как этого избежать?

 
C-4 >>:

Есть вот такой код, перевода позиции в безубыток:

Т.е. если позиция дала прибыль равную размеру Стоп лоссу по модулю, то позиция переводится в безубыток. Проблема в том, что фактически цена может проскочить точку равенства и условие не сработает, особенно это заметно при тестировании на исторических данных. Есть ли идеи как этого избежать?


1. При сравнении чисел типа double знак равенства, а также знак неравенства применять не рекомендуется - два равных числа этого типа могут быть не равны по округлению, даже если они равны по значению.

2. Помимо знака равенства есть еще знаки "больше или равно", а также "меньше или равно".

 

Дык в том-то и проблема, что если заменить знак == на >= или <=, то скрипт/эксперт завалит сервер пустыми приказами модификации ордера. Они будут поступать все время, если текущие цены будут выше при покупки и ниже при продаже. Знак равенства используется для того что бы модификация ордера вызывалась один раз (или хотя бы около того).

 
C-4 писал(а) >>

Дык в том-то и проблема, что если заменить знак == на >= или <=, то скрипт/эксперт завалит сервер пустыми приказами модификации ордера. Они будут поступать все время, если текущие цены будут выше при покупки и ниже при продаже. Знак равенства используется для того что бы модификация ордера вызывалась один раз (или хотя бы около того).

В дополнение к указанному Решетовым, Вам перед модификацией стоит сравнить OrderStopLoss() с OrderOpenPrice() и убедиться, сто СЛ в зоне убытка. Т.о. Вы получите однократную модификацию стопа в безубыток.

 
PapaYozh >>:

В дополнение к указанному Решетовым, Вам перед модификацией стоит сравнить OrderStopLoss() с OrderOpenPrice() и убедиться, сто СЛ в зоне убытка. Т.о. Вы получите однократную модификацию стопа в безубыток.

Вот, это уже лучше. Так и сделаю. Правда проблема в том, что это только частный случай. Как только я захочу модифицировать безубыточный стоп лосс в треллинг стоп, снова начнутся проблемы. Как выход, можно где-то хранить последную цену модификации стоп ордера. Сейчас алгоритм представляю смутно, надо обдумать, придумаю - напишу. Надеюсь что есть более простой/общий случай эффективной идентификации цен, надеюсь и на ваши идеи.

 
Все данные о цене есть в самом ордере, сравнивайте новый уровень стопа со старым и если не совпадают - переносите
 
C-4 писал(а) >>

Вот, это уже лучше. Так и сделаю. Правда проблема в том, что это только частный случай. Как только я захочу модифицировать безубыточный стоп лосс в треллинг стоп, снова начнутся проблемы. Как выход, можно где-то хранить последную цену модификации стоп ордера. Сейчас алгоритм представляю смутно, надо обдумать, придумаю - напишу. Надеюсь что есть более простой/общий случай эффективной идентификации цен, надеюсь и на ваши идеи.

Просто используйте две функции: первая однократно переведёт позицию в безубыток при достижении нужного профита, вторая будет трейлить стоп с более высокого уровня профита.

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