我用VBA监控某帐户的实际持仓的时候~
经常有帐户掉线重连后持仓返回出错的问题~
实盘中帐户掉线重连是个小概率事件~(比如说出金后金字塔显示交易成功~你点确定然后帐户就自动掉线重连)
但是还是需要考虑到这种情况~
Sub Application_VBAStart()
Call Application.SetTimer(0,500) '设置一个0号计时器
End Sub
Sub Application_Timer(ID)
dim acfl
acfl="800052"'跟踪帐户
call Document.SetExtData("ACFL1_isac1",order.IsAccount(acfl))'这个是跟踪帐户
If ID=0 and order.IsAccount(acfl) then
call Order.HoldingInfoByCode2("if09","zj",BuyHolding,BuyCost,BuyTodayHolding,SellHolding,SellCost,SellTodayHolding,PNL,UseMargin,acfl)
call Document.SetExtData("ACFL1_thold_if",BuyHolding-SellHolding)
end if
End Sub
====================
以上代码在帐户800052登录的状态下把IF09上的持仓导出为一个外生全局变量~
但是会出现这种情况~
如果800052帐户持有1手IF09多单~然后退出帐户~
这时候ACFL1_thold_if返回的还是1手多单没错~
重连后~按道理ACFL1_thold_if不会变成0~而应该还是直接为1~
但是我用后台监控这个全局变量~
在800052这个帐户登录后ACFL1_thold_if这个全局变量会自动初始化一次~
先变成0然后变成1~
我想问一下金字塔的设计师这是为什么?
因为这个变动~我的另外一个帐户会多出一次开平操作...
我以为是帐户重连后持仓暂时刷新不出来~先会显示帐户登录
然后帐户持仓再显示出来~中间可能差个几秒
于是我用后台监控里写上一段~
800052帐户掉线重连后先sleep 20秒~
然后再记录ACFL1_thold_if这个全局变量
谁知道~ACFL1_thold_if在20秒后还是先变成0再变成1~
请问一下这是怎么回事?
使用2.93版,
Account2 方法
返回255表示当前是无效状态
2012-09-03 15:43:37.936 跟踪帐户真实持仓=6.00000
2012-09-03 15:43:38.927 =======
2012-09-03 15:43:38.928 跟踪帐户真实持仓=6.00000
2012-09-03 15:43:39.948 =======
2012-09-03 15:43:39.949 跟踪帐户真实持仓=0.00000
2012-09-03 15:43:40.962 =======
2012-09-03 15:43:40.963 跟踪帐户真实持仓=0.00000
2012-09-03 15:43:41.969 =======
2012-09-03 15:43:41.970 跟踪帐户真实持仓=6.00000
2012-09-03 15:43:42.995 =======
2012-09-03 15:43:42.996 跟踪帐户真实持仓=6.00000
2012-09-03 15:43:44.004 =======
2012-09-03 15:43:44.005 跟踪帐户真实持仓=6.00000
2012-09-03 15:43:45.022 =======
2012-09-03 15:43:45.023 跟踪帐户真实持仓=6.00000
2012-09-03 15:43:46.030 =======
==============================
FILEPATH:='C:\debug\t3.TXT'; DEBUGFILE(FILEPATH,'=======',0);
DEBUGFILE(FILEPATH,'跟踪帐户真实持仓=%.5f',extgbdata('ACFL1_thold_if'));
用这个代码再监控一下
不间断监控(无论有无新行情...)
先手动退出那个目标帐户~再然后登录
我监控的结果是全局变量会变成0再变成6
我断线后全局变量是没有变化的
是重新登录之后全局变量会先变成0再变成6...
为什么他会先变成0~我一直搞不清这个问题~所以才发帖
使用2.93版,
Account2 方法
返回255表示当前是无效状态
我这里不是有个order.IsAccount来防止帐户掉线吗?
干嘛还要用那个Account2返回225呢?
我是不明白为什么帐户重连后那个全局变量会先变成0再变成真实持仓~
能否帮我调试一下?
我非常确定不是我某段代码写错了...
我用的是2.93版
使用2.93版,
Account2 方法
返回255表示当前是无效状态
If ID=0 and order.Account2(2,acfl)<255 then
我改成这样的确没出现全局变量变成0的情况了~
明天交易时间我再测试一下...
谢谢啦
Sub Application_VBAStart()
Call Application.SetTimer(0,500) '设置一个0号计时器
End Sub
Sub Application_Timer(ID)
dim acfl
acfl="80008"'跟踪帐户
call Document.SetExtData("ACFL1_isac1",order.IsAccount(acfl))'这个是跟踪帐户
If ID=0 and order.Account(2)<>"255" then
call Order.HoldingInfoByCode2("if09","zj",BuyHolding,BuyCost,BuyTodayHolding,SellHolding,SellCost,SellTodayHolding,PNL,UseMargin,acfl)
call Document.SetExtData("ACFL1_thold_if",BuyHolding-SellHolding)
end if
End Sub
sub vbaend()
call application.KillTimer(0)
end sub
代码改下 我这里测了 用上面的vba就没你那问题了