Цена закрытия различается в рамкам 1-ой минуты

 

Здраствуйте. Объясните почему цена закрытия в рамкам 1-ой минуты различается и как можно от этого избавиться.

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

 Вот часть кода

for(int i=0;i<OrdersTotal();i++)
{RefreshRates();
if(OrderSelect(i, SELECT_BY_POS )==true)
{
  Margin=(OrderProfit()-MathAbs(OrderCommission()) *(ХХХ);
if ((Margin>0.1))
{
PrintText('');// Вывод отладочной информации
if(OrderType()==OP_BUY) {PR=Bid; }
if(OrderType()==OP_SELL) {PR=Ask; }
  // и так тоже пробовал не помогло PR=OrderClosePrice(); 
if(!OrderClose(OrderTicket(),OrderLots(),PR,3,col))Print("Ошибка закрытия ордера: ",GetLastError());
};
}
else Print("OrderSelect("+IntegerToString(i)+") вернул ошибку - ",GetLastError()); 

Вот пример истории ордеров

2015.04.23 05:09:28buy0.01btcusd231.9500.0000.0002015.04.23 16:13:40233.677-0.050.000.000.08

2015.04.23 06:03:40buy0.01btcusd231.8200.0000.0002015.04.23 16:13:41233.577-0.050.000.000.07

2015.04.23 06:04:04buy0.01btcusd231.9020.0000.0002015.04.23 16:13:41233.433-0.050.000.000.07


Вот часть отладочной инфы и данные из журнала.

CLOSE Order (1) OpenP= 231.950, CloseP=233.677, Profit= 0.0800, Commis=-0.0500
close #1 buy 0.01 BTCUSD at 231.950, at price 233.677

CLOSE Order (2) OpenP=  231.820 , CloseP=233.677, Profit= 0.0800, Commis=-0.0500
close #2 buy 0.01 BTCUSD at   231.820 , at price 233.577  

CLOSE Order (3) OpenP=  231.902 , CloseP=233.677, Profit= 0.0800, Commis=-0.0500
close #2 buy 0.01 BTCUSD at   231.902, at price 233.433  

Соответственно по 2-м последним ордерам не верно считается прибыль. И таких примеров множество. Пробывал Bid заменять на  OrderClosePrice но не помогло.

 

Сорри Вывод отладочной информации стоит вот так 

if(OrderType()==OP_BUY) {PR=Bid; }
if(OrderType()==OP_SELL) {PR=Ask; }
// и так тоже пробовал не помогло PR=OrderClosePrice(); 

PrintText("CLOSE Order (",IntegerToString(OrderTicket()),")"," OpenP= ", OrderOpenPrice(),", CloseP=", PR ,", Profit= ",DoubleToStr(OrderProfit(),4)
  ,", Commis=",DoubleToStr(OrderCommission(),4))'');// Вывод отладочной информации

 if(!OrderClose(OrderTicket(),OrderLots(),PR,3,col))Print("Ошибка закрытия ордера: ",GetLastError());

 

А сегодня увидел что любые ордера могут закрыть по другой цене.

2015.04.24 12:02:25.110 BTCUSD,M1: initialized

2015.04.24 12:03:21.172 1 BTCUSD,M1: CLOSE Order (1430925977) OpenP= 230.602, CloseP=228.8, Profit= 0.0800, Commis=-0.0500

2015.04.24 12:03:21.688 1 BTCUSD,M1: close #1430925977 sell 0.01 BTCUSD at 230.602 at price 229.072
 

 
Поищи в тырнете информацию о проскальзываниях.
 

Я поставил slippage=1. И один хрен просадка хорошая, даже комиссия не закрывается.

И волантильность в это время низкая. Брокеру писать?

 

Попробую угадать. Брокер на "аль" называется?


А slippage тут совсем не при делах.

 

Нет бтс.

 

Еще в коде небольшая проблема. Список ордеров лучше получать в цикле с обратной индексацией:

for (int i = OrdersTotal() - 1; i >= 0; i--)

 Иначе после закрытия одного ордера обращение переходит не к следующему за ним ордеру, а через 1. В итоге четные (или нечетные - в зависимости от того, какой индекс у первого закрываемого ордера) ордера будут пропущены.

Ну а закрытие или открытие ордера может произойти по любой цене (точнее по той, которая будет в момент получения приказа сервером), если тип исполнения Market Execution. В этом случае значение параметра slippage игнорируется. При Instant Execution получите реквот.