Простой скрипт для закрытия всех ордеров. Может быть легко адаптирован под разные нужды
----
Для адаптации к своим потребностям - измените первые три функции:
bool ShouldActSelected() - отвечает за отбор ордера. Ордер УЖЕ выбран по OrderSelect()
double PrtyToAct() - вычисляет приоритет исполнения
bool Action() - собственно производит действие
//+------------------------------------------------------------------+ //| CloseAll.mq5 | //| Maxim A.Kuznetsov | //| https://www.luxtrade.tk | //+------------------------------------------------------------------+ #property copyright "Maxim A.Kuznetsov" #property link "https://www.luxtrade.tk" #property version "1.00" #property script_show_inputs #include <MT4Orders.mqh> bool ShouldActSelected() { return true; } double PrtyToAct() { return MathAbs(OrderProfit()+OrderSwap()+OrderCommission()); } bool Action() { bool ok=true; ok = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0); return ok; } class OrderInfo { public: long ticket; // тикет ордера double prty; // приоритет к закрытию }; OrderInfo *ORDERS[]; // коллекция ордеров к закрытию void OnStart() { ArrayResize(ORDERS,0,OrdersTotal()); bool hasError=false; for(int pos=OrdersTotal()-1;pos>=0;pos--) { if (!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) { Sleep(50); if (!OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) { hasError=true; continue; } } int type=OrderType(); if (type!=OP_BUY && type!=OP_SELL) continue; if (OrderCloseTime()!=0) continue; if (ShouldActSelected()) { PushSelected(); } } int count=ArraySize(ORDERS); if (count==0) { Alert("Nothing to action"); return; } SortOrders(); PrintFormat("Actions on %d orders",ArraySize(ORDERS)); while(count>0) { hasError=false; for(int pos=ArraySize(ORDERS)-1;pos>=0;pos--) { OrderInfo *ord=ORDERS[pos]; if (ord==NULL) continue; if (!OrderSelect(ord.ticket,SELECT_BY_TICKET)) { Sleep(50); if (!OrderSelect(ord.ticket,SELECT_BY_TICKET)) { hasError=true; continue; } } if (OrderCloseTime()!=0) { continue; } if (Action()) { delete ord; ORDERS[pos]=NULL; count--; } } } Alert("All done!"); } void PushSelected() { int pos=ArraySize(ORDERS); if (ArrayResize(ORDERS,pos+1)!=pos+1) return; ORDERS[pos]=new OrderInfo; ORDERS[pos].ticket=OrderTicket(); ORDERS[pos].prty=PrtyToAct(); } void SortOrders() { int total=ArraySize(ORDERS); for(int i=1;i<total;i++) { for(int j=0;j<i;j++) { if (ORDERS[i]==NULL || ORDERS[j]==NULL) continue; if (!MathIsValidNumber(ORDERS[i].prty) || !MathIsValidNumber(ORDERS[j].prty)) continue; if (ORDERS[j].prty<ORDERS[i].prty) { OrderInfo *tmp=ORDERS[j]; ORDERS[j]=ORDERS[i]; ORDERS[i]=tmp; } } } }
Файлы:
CloseAll.ex5
107 kb
CloseAll.mq5
6 kb