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,对应如下图所示:


浙公网安备 33010602011771号