结合网上找的内容和阿火,写了以下代码(后台持仓同步加下单):
问题1:AC后面引号,默认采用空值,机构版测试能通过,没有问题。但是如果里面填写了下单组名称,比如22,houtai这种,然后把某个账户编辑到后台下单组里面,发现tbuyholdingex 和 tsellholdingex 始终读出来的都是没有持仓。
问题2:如果AC用空值,在后台交易界面,设置打钩账户,这样也可以交易,那么和把打钩账户归类到下单组 然后填写交易组名称,这两种方式在最后效果上有啥区别吗?
问题3:allowrepeat,如果只允许重复3次,以下代码如何修改?
cc:=holding;
drawtextex(1,1,800,0,'虚拟持仓为:'+numtostr(cc,0));//在图表上输入虚拟持仓以便监控
ac:='';//把800988改成自己的下单账户
buyhold:=tbuyholdingex(ac,stklabel,1);
sellhold:=tsellholdingex(ac,stklabel,1);
if cc>0 then BEGIN
if SELLHOLD>0 then tsellshort(1,0,mkt,0,0,ac),allowrepeat;
if CC>BUYHOLD then tbuy(1,CC-BUYHOLD,mkt,0,0,ac),ALLOWREPEAT;
if CC<BUYHOLD then TSELL(1,BUYHOLD-CC,mkt,0,0,ac),ALLOWREPEAT;
end
if cc<0 then BEGIN
if BUYHOLD>0 then TSELL(1,0,mkt,0,0,ac),ALLOWREPEAT;
if -CC>SELLHOLD then TBUYSHORT(1,-CC-SELLHOLD,mkt,0,0,ac),ALLOWREPEAT;
if -CC<SELLHOLD then TSELLSHORT(1,SELLHOLD+CC,mkt,0,0,ac),ALLOWREPEAT;
end
if cc=0 then BEGIN
if BUYHOLD>0 then TSELL(1,0,mkt,0,0,ac),allowrepeat;
if SELLHOLD>0 then TSELLSHORT(1,0,mkt,0,0,ac),ALLOWREPEAT;
MSGOUT(1,STKLABEL&'无仓');
end
thold:=BUYHOLD-SELLHOLD;
MSGOUT(thold<>cc,STKLABEL&'实际持仓,buyhold多:'&NUMTOSTR(BUYHOLD,0)&' sellhold空:'&NUMTOSTR(SELLHOLD,0)&' 虚拟持仓cc88:'&NUMTOSTR(cc,0));
另外,云端连续测试时发现,有时明明账户有持仓,输出结果确是没有持仓,然后系统就纠正加1手。过一会发现持仓又多了,再平掉!这种情况发生在今天上午10点02分。如何避免?是否账户很容易读错?

如上,虚拟持仓的数据很稳定,实际持仓为何老是读不准确?
[此贴子已经被作者于2020/9/21 10:20:51编辑过]
1.tbuyholdingex 这种肯定没办法读取账户组的持仓啊。它只能读取账户。
2.如果只是下单,没什么区别其实。但是你如果要取一些数据,均价,持仓数量等等,写账户组的方式自然就不行了。
3.allowrepeat 这个没办法设置重复的次数。你只能在条件里面去控制,比如从持仓数量或者下单次数角度去限制下。
那么有好几个账户要读的话,TBUYHOLDINGEX,要怎么写呢?还是就写成空值,直接在后台交易的设置里给账户打钩?
另外,写成空值后,为何老是出现读账户持仓不准确?(见3楼贴图)
[此贴子已经被作者于2020/9/21 11:04:41编辑过]
tbuyholdingex(ac,stklabel,1); 这里是不包含未成交平仓单的。
你改成2试试呢。
改成2 好像也不好用,还是经常读成0,然后不停下单,测试时,有一次连续下了13单,忽然又读出来了,再自动平掉12单。
tbuyholdingex函数是返回当前账户持仓的状态过程,如果你是开仓过程,通过它们限制没有任何意义。开仓过程的限制需要结合使用未成交函数作为条件进行限制。才能有效避免多次开仓。
必将委托到成交是需要时间的。而策略执行的效率远远过于这个时间。
我将轮询时间开到15秒了,还是会出现啊,但AC不用空值,直接用指定账户,好像就可以。不知是何原因
[此贴子已经被作者于2020/9/22 9:09:26编辑过]