Сорри Вывод отладочной информации стоит вот так
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 получите реквот.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здраствуйте. Объясните почему цена закрытия в рамкам 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());
Вот пример истории ордеров
Вот часть отладочной инфы и данные из журнала.
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 но не помогло.