Не полное закрытие ордера...

 

Выдает ошибку 131 когда пытаюсь закрыть часть ордера... т.е. размер лота (lots) вычисляется, для выбранного ордера lots<OrderLots()... лот соответственно нормализован под ДЦ... и равен N*MarketInfo(Symbol(),MODE_LOTSTEP), где N - целое число...

пример:

OrderLost()=0,54

lots=0,14

MarketInfo(Symbol(),MODE_LOTSTEP)=0,01

MarketInfo(Symbol(),MODE_MINLOT)=0,01

OrderClose Error 131

че за беда?

 

Господа, я знаю что значит эта ошибка... я не пойму почему она выскакивает...

Нельзя роботом закрыть часть открытой позиции? При этом оставить отрытой часть не меньше минимального лота?

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

 

сделайте для начала закрытие просто 0,1 лота.

затем проверьте как закрывает просто объем по MODE_MINLOT.

Если получится. то работайте с тем, что надо N*... и ищите ошибку в распринтовке.

 
Michelangelo >>:

Господа, я знаю что значит эта ошибка... я не пойму почему она выскакивает...

Нельзя роботом закрыть часть открытой позиции? При этом оставить отрытой часть не меньше минимального лота?

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

Выложите код, где производится закрытие.
 
khorosh >>:
Выложите код, где производится закрытие.
void _OrderCloseByTrend(int _OrderCloseType){
int _closeType=-1,
i,
_ticket=-1,
_points=0;
double _summ=0.0,
_closePrice=0,
_loss=0.0,
_lots=0.0;

if (_OrderCloseType==OP_BUY){
_closeType=OP_SELL;
_closePrice=Ask;
} // End of if (_OrderCloseTyp==OP_BUY)
if (_OrderCloseType==OP_SELL){
_closeType=OP_BUY;
_closePrice=Bid;
} // End of if (_OrderCloseType==OP_SELL)
Alert("Закрывае прибыльные "+_TypeToStr(_closeType)+" ордера!");
if (OrdersTotal()>0){
for (i=OrdersTotal()-1; i>=0; i--){
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if (OrderType()==_closeType && OrderProfit()>0){
_summ=_summ+OrderProfit();
while (!OrderClose(OrderTicket(),OrderLots(),_closePrice,0,0)){
RefreshRates();
if (_closeType==OP_BUY) _closePrice=Bid;
if (_closeType==OP_SELL) _closePrice=Ask;
}// End of while
}// End of if (OrderType()==_closeType && OrderProfit()>0)
}// End of if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)
}// End of for
}// End of if (OrdersTotal()>0)
Alert("Закрывае убыточные "+_TypeToStr(_closeType)+" ордера!");
while (OrdersTotal()>0 && _summ>0){
_ticket=-1;
for (i=OrdersTotal()-1; i>=0; i--){ // Ищем самый убыточный ордер
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderType()==_closeType && OrderProfit()<=_loss){
_loss=OrderProfit();
_ticket=OrderTicket();
} // End of if (OrderType()==_closeType && OrderProfit()<=_loss)
}// End of if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)
} // End of for
if (_ticket==-1) _summ=0;
if (OrderSelect(_ticket, SELECT_BY_TICKET)){
if ((_summ+OrderProfit())<0){
_points=MathAbs(_closePrice-OrderOpenPrice())/Point;
_lots=MathRound((_summ/_points)/MarketInfo(Symbol(), MODE_LOTSTEP))*MarketInfo(Symbol(), MODE_LOTSTEP);
if (_lots<MarketInfo(Symbol(),MODE_MINLOT)){
_summ=0;//return;
break;
} // End of if (_lots<MarketInfo(Symbol(),MODE_MINLOT))
} // End of if ((_summ+OrderProfit())>0)
else{
_lots=OrderLots();
} // End of else
_summ=_summ+OrderProfit();
Alert("Пытаемся закрыть ордер - ",_ticket,", Объемом - ",_lots);
while (!OrderClose(_ticket,_lots,_closePrice,0,0)){
RefreshRates();
if (_closeType==OP_BUY) _closePrice=Bid;
if (_closeType==OP_SELL) _closePrice=Ask;
} // End of while
} // End of if (OrderSelect(_ticket, SELECT_BY_TICKET)
}//End of while
return;
}

вот эта процедура... сначала закрываем все прибыльные, потом "выгрызаем" убыточные... ошибку выдает на последнем цикле while хотя все прверки до него идут... и даже прерывание общего цикла перебора...
 

перемещу по выше... :) с вашего позволения... ни кто решил разобраться где ошибка?

 

ну сделайте простой скрипт, чтобы сначала открыл 0,54 потом закрыл 0,14,

если получится, то значит дело не в объемах

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