我做了个mt5的EA,但是发现真实账户会连续开仓2笔,同样的设置在demo和回测中都是只开一笔的,不知道有没有大神碰到过?
chnp:
我做了个mt5的EA,但是发现真实账户会连续开仓2笔,同样的设置在demo和回测中都是只开一笔的,不知道有没有大神碰到过?
能加一下qq,讨论下怎么写EA程序和跑程序吗?球球:499602353
我做了个mt5的EA,但是发现真实账户会连续开仓2笔,同样的设置在demo和回测中都是只开一笔的,不知道有没有大神碰到过?
if(时间限制交易()) //if(iTime(Symbol(),K线监控时间轴,0)==iTime(Symbol(),PERIOD_D1,0)) // if(iBarShift(Symbol(),PERIOD_D1,iTime(Symbol(),K线监控时间轴,0))==0) if(分项单据统计(-100,magic,"主")<可同时持有N组) if(ObjectFind(0,(string)iTime(Symbol(),K线监控时间轴,0))==-1) { if(做单方向选择==1 || 做单方向选择==3) if(做多) { //laber(iBarShift(Symbol(),PERIOD_D1,iTime(Symbol(),K线监控时间轴,0)),clrAliceBlue,3); int t1=建立单据(Symbol(),0,开仓手数,0,0,止损,0,time+"主"+备注,magic); if(PositionSelectByTicket(t1)) { int TICKET=(int)t1; string SYMBOL=PositionGetString(POSITION_SYMBOL); double CLOSE=PositionGetDouble(POSITION_PRICE_CURRENT); double OPEN=PositionGetDouble(POSITION_PRICE_OPEN); ulong TYPE=PositionGetInteger(POSITION_TYPE); double SL=PositionGetDouble(POSITION_SL); double TP=PositionGetDouble(POSITION_TP); double POINT=SymbolInfoDouble(SYMBOL,SYMBOL_POINT); int DIGITS=(int)SymbolInfoInteger(SYMBOL,SYMBOL_DIGITS); int MAGIC=(int)PositionGetInteger(POSITION_MAGIC); string COMM=PositionGetString(POSITION_COMMENT); double LOTS=PositionGetDouble(POSITION_VOLUME); double SWAP=PositionGetDouble(POSITION_SWAP); double PROFIT=PositionGetDouble(POSITION_PROFIT); datetime OPENTIME=(datetime)PositionGetInteger(POSITION_TIME); laber0((string)iTime(Symbol(),K线监控时间轴,0),"",clrYellow,0,0,8,ANCHOR_LEFT_UPPER,0); double stop=iLow(Symbol(),K线监控时间轴,止损K位置)-止损退出策略止损点设置*POINT*系数(Symbol()); double take=OPEN+(OPEN-stop)*风险收益比; laber0("做单组"+time,time,clrYellow,0,0,8,ANCHOR_LEFT_UPPER,0); if(平仓策略==1) { ZeroMemory(request); ZeroMemory(result); if(错误调试1==1)request.type_filling=ORDER_FILLING_FOK; if(错误调试1==2)request.type_filling=ORDER_FILLING_IOC; if(错误调试1==3)request.type_filling=ORDER_FILLING_RETURN; request.action=TRADE_ACTION_SLTP; request.position=TICKET; request.sl=NormalizeDouble(stop,DIGITS); request.tp=NormalizeDouble(take,DIGITS); request.deviation=(ulong)(滑点*系数(SYMBOL)); check=OrderSend(request,result); } //check=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(stop,Digits),NormalizeDouble(take,Digits),0); } }
做单代码如上,我实在找不到问题
chnp:
用两个个变量分别接收多、空订单号每次开仓先查找订单号,找不到再开仓
没有那个方向的单子时把接收单号对应的变量归0
这样就可以保证每个方向只有1单
非常感谢!我开单前判断加一个条件看看是不是可以在实际中有效。估计实际交易服务器中tick变化和demo不同
if(分项单据统计(-100,magic,"主")<可同时持有N组 & 分项单据统计(-100,magic,time+"主")<1)
1. 如果策略允许一个K线上只能有一次持仓,则检查当前K线时间点之后,有没有持仓单子。
2. 如果某次信号只能有一个持仓,则只能依据开仓时写入到单子中的注释。
3. 开仓后不能立即PositionSelectByTicket(x),因为本地持仓数据可能还没有更新,简单解决办法是开仓后,Sleep(1000),这种解决办法有时候不凑效,那就用while(),
但别弄成了死循环。
Ziheng Zhuang:
1. 如果策略允许一个K线上只能有一次持仓,则检查当前K线时间点之后,有没有持仓单子。
2. 如果某次信号只能有一个持仓,则只能依据开仓时写入到单子中的注释。
3. 开仓后不能立即PositionSelectByTicket(x),因为本地持仓数据可能还没有更新,简单解决办法是开仓后,Sleep(1000),这种解决办法有时候不凑效,那就用while(),
但别弄成了死循环。
非常感谢!
chnp:
在交易函数加一个return语句就好了,在你的代码中出现这么多中文(非注释部分)尽量避免,为了走的更远。
测试的时候正常开单,实盘的时候重复开单,在MT5上比较容易出现,MT5的客户比较少,经纪商的服务通常情况下要比MT4差很多,因而容易导致你提交的订单迟迟不能成交,当程序检测到没有单的时候,就会再次提交订单,当两个订单提交到服务器上后,就导致了一个位置开2单的情况。
IC的MT5经常能给你延迟1分钟之久不成交,写EA的时候可以做一个变量来保存当前这个品种的最后一次提交订单时间,此后的3分钟内都不再提交订单,如果出现订单报错:OrderSend Error 4756再提交新订单,这样就能避免这个问题。
代写EA需要的联系我