MQL для чайников, программирование на MQL4, MQL5
12 Янв
Посмотрите мой код:
for(int i=0;i<OrdersTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
OrderClose(...);
Почему при его выполнении закрываются не все ордера, а через один?
Дело в том, что при закрытии ордера Форекс в Metatrader 4 или удалении отложенного ордера Buy Stop или Sell Stop - позиция оставшихся смещается.
Представим, что у нас есть 3 ордера Forex. Их позиции изначально: 0, 1, 2. При закрытии ордера в позиции 0 следующие ордера будут иметь позиции 0,1. Цикл же этого не учитывает и при следующем проходе будет попытка закрыть ордер в позиции 1. Поэтому более правильным вариантом на MQL будет следующий:
for(int i=OrdersTotal() −1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
OrderClose(...);
Если Вы хотите изучать язык MQL или вам понравилась данная публикация - Вы можете подписаться на получение новых материалов сайта mql4you.ru по |
2 комментария на «Вопрос №2»
Спасибо! Очень дельный совет — вы очень помогли мне!
Здравствуйте. Очень нужна помощь. Столкнулась с невозможностью закрытия/переворота позиции, если она составлена несколькими ордерами. Даже приведенный Вами скрипт в моем советнике закрывает только один ордер, а второй остается открытым. Идея была в том, что при определенных условиях выставляются два рыночных ордера (напр., бай). Если возникают противоположные условия, эти два закрываются и открываются также два ордера, но уже в селл.
total=OrdersTotal();
//-------------------------------------------Закрытие позиций------------------------------------------
for(int cnt=OrdersTotal() −1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
{
if (Close[1]Up)
{
OrderClose(OrderTicket(),OrderLots(),Bid,50,Violet);
OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"«,MAGICMA,0,Red);
OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,»",MAGICMA,0,Red);
return(0);
}
if (Close[1]Dn)
{
OrderClose(OrderTicket(),OrderLots(),Bid,50,Violet);
OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"«,MAGICMA,0,Red);
OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,»",MAGICMA,0,Red);
return(0);
}
}
if(OrderType()==OP_SELL)
{
if (Close[1]>Dn && Close[2]Up && Close[2]<Up)
{
OrderClose(OrderTicket(),OrderLots(),Ask,50,Violet);
OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,"«,MAGICMA,0,Blue);
OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,»",MAGICMA,0,Blue);
return(0);
}
}
}
}
//-----------------------------------------------Конец закрытия позиции------------------------------------
if(total==0) // если нет позиций
{
// открытие длинной позиции
if(Close[2]Dn )
{
OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,"«,MAGICMA,0,Blue);
OrderSend(Symbol(),OP_BUY,Lots,Ask,50,0,0,»",MAGICMA,0,Blue);
return(0);
}
// открытие короткой позиции
if(Close[2]>Up && Close[1]<Up )
{
OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"«,MAGICMA,0,Red);
OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,»",MAGICMA,0,Red);
return(0);
}
}
return(0);
}