Mt4订单处理class库

各种内外盘量化代谢联系qq:3810042301 ,vx:jsson-gu
Mql4系统自带的开、平仓函数很不方便,自己创建了一个Mt4订单提交class类。

类公开了14个函数和一个变量;

class Ctrade
  {
private:
   double            Price;
   double            Voulme;
   int               Type;
   string            Sym;
   double            Sl;
   double            Tp;
   string            Com;
   int               Slip;
   datetime          ExpTime;
   color             Oclr;
public:
   void              Ctrade(void) {}
   int               Omaigc;
   double            LotsSpecs(double lotscnt,string sym=NULL);
   bool              Send(double            vou,
                          int               type,
                          double            price,
                          string            sym=NULL,
                          double            sl=0,
                          double            tp=0,
                          string            com="",
                          int               slip=100,
                          datetime          exptime=0,
                          color             orderclr=clrNONE
                         );
   bool              buy(double            vou,
                         string            sym=NULL,
                         double            sl=0,
                         double            tp=0,
                         string            com="",
                         int              slip=100,
                         datetime          exptime=0,
                         color             orderclr=clrNONE)
     {
      return Send(vou,OP_BUY,Ask,sym,sl,tp,com,slip,exptime,orderclr);
     }
   bool              sell(double            vou,
                          string            sym=NULL,
                          double            sl=0,
                          double            tp=0,
                          string            com="",
                          int              slip=100,
                          datetime          exptime=0,
                          color             orderclr=clrNONE)
     {
      return Send(vou,OP_SELL,Bid,sym,sl,tp,com,slip,exptime,orderclr);
     }
   bool              buylimit(double            vou,
                              double           price,
                              string            sym=NULL,
                              double            sl=0,
                              double            tp=0,
                              string            com="",
                              int              slip=0,
                              datetime          exptime=0,
                              color             orderclr=clrNONE)
     {
      return Send(vou,OP_BUYLIMIT,price,sym,sl,tp,com,slip,exptime,orderclr);
     }
   bool              selllimit(double            vou,
                               double     price,
                               string            sym=NULL,
                               double            sl=0,
                               double            tp=0,
                               string            com="",
                               int               slip=0,
                               datetime          exptime=0,
                               color             orderclr=clrNONE)
     {
      return Send(vou,OP_SELLLIMIT,price,sym,sl,tp,com,slip,exptime, orderclr);
     }
   bool              buystop(double            vou,
                             double     price,
                             string            sym=NULL,
                             double            sl=0,
                             double            tp=0,
                             string            com="",
                             int              slip=100,
                             datetime          exptime=0,
                             color             orderclr=clrNONE)
     {
      return Send(vou,OP_BUYSTOP,price,sym,sl,tp,com,slip,exptime,orderclr);
     }
   bool              sellstop(double            vou,
                              double     price,
                              string            sym=NULL,
                              double            sl=0,
                              double            tp=0,
                              string            com="",
                              int              slip=100,
                              datetime          exptime=0,
                              color             orderclr=clrNONE)
     {
      return Send(vou,OP_SELLSTOP,price,sym,sl,tp, com,slip,exptime,orderclr);
     }
   bool              Closeall(int ordertype =0, string ts="0:市场价+挂单,1:市场价,2:挂单");
   bool              CloseTic(int tic,double lot=0,int  slippage=100);
   bool              CloseType(int type);
   bool              DelType(int type);
   bool              Closebuy() {return this.CloseType(ORDER_TYPE_BUY);};
   bool              Closesell() {return this.CloseType(ORDER_TYPE_SELL);};
  } trade;
//+------------------------------------------------------------------+
bool Ctrade::Send(double            vou,
                  int   type,
                  double            price=0,
                  string            sym=NULL,
                  double            sl=0,
                  double            tp=0,
                  string            com="",
                  int              slip=100,
                  datetime          exptime=0,
                  color             orderclr=clrNONE
                 )
  {
   Voulme=LotsSpecs(vou,sym);
   Type=type;
   Price=price==0?Close[0]:price;
   Sym=sym==NULL?_Symbol:sym;
   Sl=sl==0?0:sl;
   Tp=tp==0?0:tp;
   Com=com==""?"":com;
   Slip=slip;
   ExpTime=exptime==0?0:exptime;
   Oclr=orderclr;
   int ticcnt=OrderSend(Sym,Type,Voulme,price,Slip,Sl,Tp,Com,Omaigc);
   if(OrderSelect(ticcnt,SELECT_BY_TICKET))
     {
      return true;
     }
   else
     {
      printf("ERROR:"+IntegerToString(GetLastError()));
     }
   return false;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Ctrade::LotsSpecs(double lotscnt,string sym=NULL)
  {
   sym=sym==NULL?_Symbol:sym;
   double minlots=MarketInfo(sym,MODE_MINLOT);
//   double cnt=int(lotscnt/minlots)*minlots;
   double cnt=NormalizeDouble(lotscnt,2);
   cnt=(cnt<MarketInfo(sym,MODE_MINLOT))?(MarketInfo(sym,MODE_MINLOT)):(cnt);
   cnt=(cnt>MarketInfo(sym,MODE_MAXLOT))?(MarketInfo(sym,MODE_MAXLOT)):(cnt);
   return cnt;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Ctrade::Closeall(int ordertype =0, string ts="0:市场价+挂单,1:市场价,2:挂单")
  {
   int closecnt=0;
   int tick[200];
   int type[200];
   int total=OrdersTotal();
   ArrayInitialize(tick,0);
   ArrayInitialize(type,-1);
   for(int x=0; x<total; x++)
     {
      if(!OrderSelect(x,SELECT_BY_POS))
         continue;
      switch(ordertype)
        {
         case 0:
            tick[closecnt]=OrderTicket();
            type[closecnt]=OrderType();
            closecnt++;
            break;
         case 1:
            if(OrderType()<=1)
              {
               tick[closecnt]=OrderTicket();
               type[closecnt]=OrderType();
               closecnt++;
              }
            break;
         case 2:
            if(OrderType()>1)
              {
               tick[closecnt]=OrderTicket();
               type[closecnt]=OrderType();
               closecnt++;
              }
            break;
        }

     }
   while(closecnt)
     {
      double lcnt=ArrayRange(tick,0);
      for(int i=0; i<lcnt; i++)
        {
         if(!OrderSelect(tick[i],SELECT_BY_TICKET))
            continue;
         switch(type[i])
           {
            case  OP_BUY:
               if(OrderSelect(tick[i],SELECT_BY_TICKET))
                 {
                  if(OrderClose(tick[i],OrderLots(),OrderClosePrice(),100,clrAliceBlue))
                     OrderPrint();
                 }
               closecnt--;
               break;
            case  OP_SELL:
               if(OrderSelect(tick[i],SELECT_BY_TICKET))
                 {
                  if(OrderClose(tick[i],OrderLots(),OrderClosePrice(),100,clrAliceBlue))
                     OrderPrint();
                 }
               closecnt--;
               break;
            case  OP_SELLLIMIT:
               if(OrderSelect(tick[i],SELECT_BY_TICKET))
                 {
                  if(OrderDelete(tick[i],clrAliceBlue))
                     OrderPrint();
                 }
               closecnt--;
               break;
            case  OP_SELLSTOP:
               if(OrderSelect(tick[i],SELECT_BY_TICKET))
                 {
                  if(OrderDelete(tick[i],clrAliceBlue))
                     OrderPrint();
                 }
               closecnt--;
               break;
            case  OP_BUYLIMIT:
               if(OrderSelect(tick[i],SELECT_BY_TICKET))
                 {
                  if(OrderDelete(tick[i],clrAliceBlue))
                     OrderPrint();
                 }
               closecnt--;
               break;
            case  OP_BUYSTOP:
               if(OrderSelect(tick[i],SELECT_BY_TICKET))
                 {
                  if(OrderDelete(tick[i],clrAliceBlue))
                     OrderPrint();
                 }
               closecnt--;
               break;
           }
         if(OrdersTotal()==0||closecnt==0)
            return false;
         Sleep(10);
        }

     }
   return (bool)closecnt;
  }
//+------------------------------------------------------------------+
bool Ctrade::CloseTic(int tic,double lot=0,int slippage=100)
  {
   if(!OrderSelect(tic,SELECT_BY_TICKET))
      return true;
   return(OrderClose(OrderTicket(),lot==0?OrderLots():lot,OrderClosePrice(),slippage,Red));
  }
//+------------------------------------------------------------------+
bool Ctrade::CloseType(int type)
  {
   if(type>1)
     {
      printf("订单类型错误,此函数只平已成交单");
      return false;
     }
   type=type<0?0:type;
   int cnt=0;
   int tot=OrdersTotal();
   int tic[200];
   ArrayInitialize(tic,0);
   for(int i=0; i<tot; i++)
     {
      if(!OrderSelect(i,0,0))
         continue;
      if(OrderSymbol()!=_Symbol||OrderType()!=type||OrderMagicNumber()!=Omaigc)
         continue;
      tic[cnt]=OrderTicket();
      cnt++;
     }
   int cnt0=cnt;
   for(int x=0; x<5; x++)
     {
      if(cnt0==0)
         break;
      for(int y=0; y<cnt; y++)
        {
         if(!OrderSelect(tic[y],1))
            continue;
         int tc=OrderClose(OrderTicket(),OrderLots(),Close[0],100,Red);
         if(tc)
            cnt0--;
        }
      Sleep(100);
     }
   return true;
  }
//+------------------------------------------------------------------+
bool Ctrade::DelType(int type)
  {
   if(type<2||type>5)
     {
      printf("订单类型错误,此函数只删除挂单");
      return false;
     }
   int cnt=0;
   int tot=OrdersTotal();
   int tic[200];
   ArrayInitialize(tic,0);
   for(int i=0; i<tot; i++)
     {
      if(!OrderSelect(i,0,0))
         continue;
      if(OrderSymbol()!=_Symbol||OrderType()!=type||OrderMagicNumber()!=Omaigc)
         continue;
      tic[cnt]=OrderTicket();
      cnt++;
     }
   int cnt0=cnt;
   for(int x=0; x<5; x++)
     {
      if(cnt0==0)
         break;
      for(int y=0; y<cnt; y++)
        {
         if(!OrderSelect(tic[y],1))
            continue;
         int tc=OrderDelete(OrderTicket());
         if(tc)
            cnt0--;
        }
      Sleep(100);
     }
   return true;
  }

 

Omaigc;   

订单的Maigc魔术号;int类型


 LotsSpecs(double lotscnt,string sym=NULL);

手数处理函数,解决手数不规范,或者超出最小、最大下单范围的情况。

返回值 规范后的浮点数手数。小于最小手数返回平台允许最小值,超过最大手数返回平台允许最大。

参数说明:

lotscnt  输入的原始手数

sym      计算的交易品种,可以不设(默认当前)。


Send(double vou,int type,double price,string sym=NULL,double sl=0,double tp=0,string com="",int slip=100,datetime exptime=0,color orderclr=clrNONE);

市价单提交函数,成功返回true,失败返回false。其实就是再次包装的OrderSend,方便class里面其他函数调用的公共函数,有也可以单独使用。

vou;                   

开仓手数,类似浮点数(必须输入);

 type                         

开仓类型,可以是 ENUM_ORDER_TYPE枚举类型,也可以是整数型。

ID

Value

Description

OP_BUY

0

多单

OP_SELL

1

空单

OP_BUYLIMIT

2

在当前价格下方挂多单

OP_SELLLIMIT

3

在当前价格上方挂空单

OP_BUYSTOP

4

在当前价格上方挂多单

OP_SELLSTOP

5

在当前价格下方挂多单

price     

开仓价格(市场价单可以不设置,挂单必须设置)。

下面的函数都带有默认参数,根据需求可以不设。

 sym

交易品种。

sl

止损价格。

tp

止盈价格。

com

订单注释。

slip

接受滑点最大值。

exptime

到期时间

orderclr

标记颜色

 

bool buy(double vou,string sym=NULL,double sl=0,double tp=0,string com="",int slip=100,datetime exptime=0,color orderclr=clrNONE);

提交市场价多单,成功后返回true,失败返回false。除了第一个参数vou, 后面的参数都可以根据需要省略不设置。

vou

开仓手数,

 sym

交易品种。

sl

止损价格。

tp

止盈价格。

com

订单注释。

slip

接受滑点最大值。

exptime

到期时间

orderclr

标记颜色

 

bool sell(double vou,string sym=NULL,double sl=0,double tp=0,string com="",int slip=100,datetime exptime=0,color orderclr=clrNONE);

提交市场价空单,成功后返回true,失败返回false。除了第一个参数vou, 后面的参数都可以根据需要省略不设置。

vou

开仓手数,

 sym

交易品种。

sl

止损价格。

tp

止盈价格。

com

订单注释。

slip

接受滑点最大值。

exptime

到期时间

orderclr

标记颜色

 

bool buylimit(double vou,double price,string sym=NULL,double sl=0,double tp=0,string com="",int slip=0,datetime exptime=0,color orderclr=clrNONE);

提交在当前价格下方的多单挂单,成功后返回true,失败返回false。前两个参数vou、price必须设置, 后面的参数都可以根据需要省略不设置。

vou

开仓手数,

 sym

交易品种。

sl

止损价格。

tp

止盈价格。

com

订单注释。

slip

接受滑点最大值。

exptime

到期时间

orderclr

标记颜色

 

bool selllimit(double vou,double price,string sym=NULL,double sl=0,double tp=0,string com="",int slip=0,datetime exptime=0,color orderclr=clrNONE);

提交在当前价格上方的空单挂单,成功后返回true,失败返回false。前两个参数vou、price必须设置, 后面的参数都可以根据需要省略不设置。

vou

开仓手数,

 sym

交易品种。

sl

止损价格。

tp

止盈价格。

com

订单注释。

slip

接受滑点最大值。

exptime

到期时间

orderclr

标记颜色

 


bool buystop(double vou,double price,string sym=NULL,double sl=0,double tp=0,string com="",int slip=100,datetime exptime=0,color orderclr=clrNONE);

提交在当前价格上方的多单挂单,成功后返回true,失败返回false。前两个参数vou、price必须设置, 后面的参数都可以根据需要省略不设置。

vou

开仓手数,

 sym

交易品种。

sl

止损价格。

tp

止盈价格。

com

订单注释。

slip

接受滑点最大值。

exptime

到期时间

orderclr

标记颜色

 


bool sellstop(double vou,double price,string sym=NULL,double sl=0,double tp=0,string com="",int slip=100,datetime exptime=0,color orderclr=clrNONE);

提交在当前价格下方的空单挂单,成功后返回true,失败返回false。前两个参数vou、price必须设置, 后面的参数都可以根据需要省略不设置。

vou

开仓手数,

 sym

交易品种。

sl

止损价格。

tp

止盈价格。

com

订单注释。

slip

接受滑点最大值。

exptime

到期时间

orderclr

标记颜色

 

bool Closeall(int ordertype =0, string ts="0:市场价+挂单,1:市场价,2:挂单");

所有订单全部平仓,成功返回true,失败返回false。

ordertype

设置平仓的类型。

0表示市场价单和挂单全部清仓。

1表示只清仓已经成交的单子挂单保留。

2表示只删除挂单,已经成交的单子保留


bool CloseTic(int tic,double lot=0,int slipage=100);

平仓指定编号单,成功后返回true,失败返回false。

tic

要平仓的单号

slipage

平仓接受的挂单最大范围


bool CloseType(int type);

平当前品种当前EA的指定类型市场价单,成功后返回true,失败返回false。

type

平仓类型,OP_BUY表示多,OP_SELL表示空。

 

bool DelType(int type);

删除当前品种当前EA的指定类型挂单,成功后返回true,失败返回false。

type

平仓类型,OP_BUY表示多,OP_SELL表示空。


bool Closebuy() {return this.CloseType(ORDER_TYPE_BUY);};

平当前品种当前EA的多单。


bool Closesell(){return this.CloseType(ORDER_TYPE_SELL);};

平当前品种当前EA的空单。

 

里面有默认定义的类trade, 也可以用Ctrade来实例。建议保存成mqh类模板方便调用

MT4脚本Srcitpt调用dome:

#include <trade/trade.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 设置Magic为123456,只需要设置一次。如果是EA使用,放在OnInit()函数里面调用一次,后面通过trade的方法开仓的订单都是使用此Magic
   trade.Omaigc=123456;
//---当前品种多单手数0.1,不设止盈止损
   trade.buy(0.1);
//--- EURUSD 0.01手多单,止损价格1.1000,止盈价格1.2000
   trade.buy(0.01,"EURUSD",1.1000,1.2000);
//---XAUUSD 0.01手多单,止损价格1900,止盈价格2500,订单注释为"黄金多单"
   trade.buy(0.01,"XAUUSD",1900,2500,"黄金多单");
//定义bool类型的变量cnt来接收订单提交结果,运行图表对应的品种 0.01手 空单 止损0 止盈1.5 订单注释‘order’ 接受滑点数100 标记颜色 绿色
   bool cnt= trade.sell(0.01,0,0,1.5,"order",100,0,clrGreen);
   trade.buylimit(0.11,1.0000,"EURUSD",0.9,1.3000,"EURUSD_BUYLIMIT");
   trade.buystop(0.11,1.2000,"EURUSD",1.1000,1.3000,"EURUSD_BUYSTOP");
   trade.selllimit(0.11,1.0000,"EURUSD",0.9,1.3000,"EURUSD_SELLLIMIT");
   trade.sellstop(0.11,1.0000,"EURUSD",0.9,1.3000,"EURUSD_SELLSTOP");
//--- 平仓 订单号为 16060387 的订单
   trade.CloseTic(16060387);
//下面3个函数都是平仓多单
   trade.CloseType(0);
   trade.CloseType(ORDER_TYPE_BUY);
   trade.Closebuy();
//---所有订单全部平仓,包括其他图表品种、其他EA、手动开仓,已成交单、未成交挂单全平。
   trade.Closeall();
//---所有的已成交单全平,包括图表品种、其他EA、手动开仓,挂单继续保留;
   trade.Closeall(1);
//---所有的挂单全部删除,包括图表品种、其他EA、手动开仓,已成交单继续保留;
   trade.Closeall(1);

//---用CTrade类定义新方法Tr, 此次Tr等同于前面的trade。前面直接使用trade,是因为匿名定义在class里面了
   Ctrade Tr;
//---注意此处定义的Tr所开的单和前面trade可以使用不同的Magic,比如前面trade开的单Magic都是123456,使用Tr开的单经过此次设置后都是789
   Tr.Omaigc=789;
   cnt=Tr.sell(Tr.LotsSpecs(0.111111111111111111111111111111),NULL,0,0);
   if(!cnt)
     {
      printf("开仓失败,对应错误编号%d",GetLastError());
     }
  }
//+------------------------------------------------------------------+

 

 

上面示例中将最上面class代码保存为trade.mqh, 结构路径是 \MQL4\Include\trade,对应如下图所示:

 

 
 
false
posted @ 2023-04-28 23:23  jasson-gu  阅读(282)  评论(0)    收藏  举报