Michelangelo, еще раз спасибо. Но я же там в P.S. написал, что решил уже проблему) Но с тем же советником возникла опять трабла, ну не хватает моих знаний.. В общем захотелось мне сделать закрытие всех позиций при достижении определенной прибыли. Моего мозга хватило только вот на это
if (ExistPositions()) { if (AccountProfit()>=Corridor*Lot()*10) { bool result; double price; int error; if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) { while(ExistPositions()) { if(OrderType()==OP_BUY) price=Bid; else price=Ask; result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE); if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); } else error=0; if(error==135) RefreshRates(); else break; } } else Print( "Error when order select ", GetLastError()); } return(0);}
Но в итоге почему то если 1 ордер, то он правильно закрывает, а если больше, то там совсем другая прибыль получается.. Какие есть альтернативы вот этой строчке if (AccountProfit()>=Corridor*Lot()*10) ?
Ну а NormalizeDouble потом введу, если результаты нормальными окажутся..
честно говоря - вне контекста сложно сказать... но если ты хочешь закрыть ВСЕ позиции - закрывай их циклом:
for (i=OrdersTotal()-1; i>=0; i--){ if (OrderSelect(i,SELECT_BY_POS)){ if (OrderSymbol()==Symbol()){ if (OrderType()==OP_BUY){ RefreshRates(); OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); } if (OrderType()==OP_SELL){ RefreshRates(); OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); } } } }
аккуратней используй while - можешь получить бесконечный цикл...