貌似不错,列入几个EA幻数,可实现同品多策略下单及分类管理。
.
由于挂单有几种到期模式的执行命令。个人觉得,手动挂单无论哪种模式均可 ,但EA自动化挂单若非锁仓,则务必指定到期时间更好了。
为此,则需先确定命令模式是否适合自己的策略,然后再加挂。
因此,挂单的下单函数与现价单下单函数分开,也许更好了。
还望路过的高手指点,给予宝贵意见,谢谢。
ENUM_ORDER_TYPE_TIME Type_time, Type_T; //================================================================================= void OnTick(void) { // 查看该品的订单到期模式可否指定到期时间 bool Time_gtc=false, Time_day=false, specified_T=false, specified_D=false; long tmp_long; int flags=0; if(SymbolInfoInteger(_Symbol,SYMBOL_EXPIRATION_MODE,tmp_long)) flags=(int)tmp_long; if(Type_time==ORDER_TIME_GTC && (flags&SYMBOL_EXPIRATION_GTC)!=0) Time_gtc=true; if(Type_time==ORDER_TIME_DAY && (flags&SYMBOL_EXPIRATION_DAY)!=0) Time_day=true; if(Type_time==ORDER_TIME_SPECIFIED && (flags&SYMBOL_EXPIRATION_SPECIFIED)!=0) specified_T=true; if(Type_time==ORDER_TIME_SPECIFIED_DAY && (flags&SYMBOL_EXPIRATION_SPECIFIED_DAY)!=0) specified_D=true; if(Time_gtc) Type_T=ORDER_TIME_GTC; if(Time_day) Type_T=ORDER_TIME_DAY; if(specified_D) Type_T=ORDER_TIME_SPECIFIED_DAY; if(specified_T) { Type_T=ORDER_TIME_SPECIFIED; idisplay("B", "挂单可指定到期时间", 520,2,10, Clr); } else idisplay("B", "挂单不可指定到期时间", 520,2,10, Clr); datetime miao=0; if(... ) miao=10000; else miao=3000; if(... && specified_T) { if(gua<1) reg=OrderSendg( ...... ,TimeCurrent()+miao, ....); } //================================================================================= // 挂单 bool OrderSendg(ENUM_ORDER_TYPE type, double Lot, double price, double sL, datetime expiration, string com, ulong Magic) { bool eg=false; //--- 声明并初始化交易请求和交易请求结果 MqlTradeRequest request={}; MqlTradeResult result={}; //--- 请求参数 request.action =TRADE_ACTION_PENDING;// 操作类型 request.symbol =_Symbol; // 品种为本图表打开的品种 request.type =type; // 订单类型 request.volume =Lot; // 手数 request.price =price; // 价格 request.sl =sL; // 止损位 request.tp =0; // 0 即未设置止赢位 request.deviation =0; // 价格允许偏差为0点 (挂单可设为0) request.type_filling =ORDER_FILLING_RETURN; request.type_time = Type_T; request.expiration =expiration; request.comment =com; // 注释 request.magic =Magic; // EA交易 ID (幻数) //--- 发送请求 eg=OrderSend(request,result); //--- 若请求失败 输出错误代码 if(!eg) PrintFormat("OrderSend error %d",GetLastError()); //--- 返回eg值 return(eg); }
试了试很多平台, 暂不能直接用EA指定 ORDER_TYPE_TIME为ORDER_TIME_SPECIFIED ,即不能在设置挂单时指定挂单的到期时间。
还是该用楼主的OrderSends函数设置挂单,再按老办法来删除自定义过时的挂单,举例如下:
//-------------------------------------------------------- // 删除过时挂单 int barN=3; for(i=0;i<OrdersTotal();i++) { bool Del=false; int Kn=0; if(OrderGetTicket(i)>0) { if(OrderGetString(ORDER_SYMBOL)==_Symbol) { if(OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY_LIMIT || OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL_LIMIT) { if(OrderGetInteger(ORDER_MAGIC)==MagicH) { Kn=Bars(_Symbol,PERIOD_H1,OrderGetInteger(ORDER_TIME_SETUP),TimeCurrent()); //加挂时间在现时的K线序号 if(Kn>=barN ) Del=OrderRemove(OrderGetInteger(ORDER_TICKET)); } if(OrderGetInteger(ORDER_MAGIC)==MagicM15) { Kn=Bars(_Symbol,PERIOD_M15,OrderGetInteger(ORDER_TIME_SETUP),TimeCurrent()); if(Kn>=barN*3) Del=OrderRemove(OrderGetInteger(ORDER_TICKET)); } } } } } //--------------------------------------------------------
手法细腻
适合mql5编程新人参考
waihui1001:
这些代码官方手册都有的复制黏贴,还高手,付费的,感觉你被坑了