Полезняшки - скрипт закрытия ордеров

12 февраля 2022, 13:51
Maxim Kuznetsov
0
24

Простой скрипт для закрытия всех ордеров. Может быть легко адаптирован под разные нужды

----

Для адаптации к своим потребностям - измените первые три функции:

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