void myOrderClose(int type,int volumepercent,string ordername) //close open orders for current symbol, magic number and "type" (OP_BUY or OP_SELL)
{
if(!IsTradeAllowed()) return;
if(type>1)
{
myAlert("error","Invalid type in myOrderClose");
return;
}
double ask=Ask;
double bid=Bid;
double sprd=(double)((ask-bid)/myPoint);
bool success=false;
int err;
string ordername_=comment;
if(ordername != "")
ordername_ = "("+ordername+")";
int total = OrdersTotal();
for(int i = total-1; i >= 0; i--)
{
while(IsTradeContextBusy()) Sleep(3);
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol() || OrderType()!=type) continue;
while(IsTradeContextBusy()) Sleep(3);
RefreshRates();
double price=(type==OP_SELL) ? Ask : Bid;
double volume=NormalizeDouble(OrderLots()*volumepercent*1.0/100,LotDigits);
if(NormalizeDouble(volume,LotDigits)==0) continue;
success=OrderClose(OrderTicket(),volume,DoubleToStr(NormalizeDouble(price,Digits()),Digits()),MaxSlippage,clrWhite);
if(!success)
{
err=GetLastError();
myAlert("error","OrderClose"+ordername_+" failed; error #"+err+" "+ErrorDescription(err));
}
}
string typestr[6]={" Buy "," Sell ","Buy Limit","Sell Limit","Buy Stop","Sell Stop"};
if(success) myAlert(" order ","Orders closed "+ordername_+": "+typestr[type]+" "+Symbol()+" Magic #"+MagicNumber);
}