以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 高级功能研发区 (http://weistock.com/bbs/list.asp?boardid=5) ---- 金字塔vba获取公式值错误的问题 (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=97571) |
|
-- 作者:bage -- 发布时间:2016/5/18 14:51:12 -- 金字塔vba获取公式值错误的问题 以前就反映过,vba调用formula。getbufData调用公式,计算指标值的时候,会发生跟图表上的公式指标值不一致的情况 就是图表上公式的值发生了变化,但是vba调用还没有发生变化。 后来发现,调用application.ActiveFrameWithCode后,再调用formula。getbufData获取公式的指标值,就能正确了 这个bug,麻烦赶紧处理下呢 夜盘的时候,我这边已经出现很多次图表与vba策略值不一致的情况了 |
|
-- 作者:王锋 -- 发布时间:2016/5/18 15:26:37 -- 这个不是BUG,你用marketdata.stkindi调用的公式,本身就会因为参数设置和加载数据的不同而造成不同结果,因为marketdata.stkindi的运行途径和图表上加载公式是分别运行的,只有你直接读取图表的formula才是你图表的实际计算的结果,他们才是完全一致的结果 |
|
-- 作者:bage -- 发布时间:2016/5/18 16:04:51 -- 你用marketdata.stkindi调用的公式,本身就会因为参数设置和加载数据的不同而造成不同结果 --在vba和图表中,参数是设置成一样的。。你说的加载数据的不同,这个vba中如何设置?? |
|
-- 作者:bage -- 发布时间:2016/5/18 16:08:00 -- 你用marketdata.stkindi调用的公式,本身就会因为参数设置和加载数据的不同而造成不同结果 --在vba和图表中,参数是设置成一样的。。你说的加载数据的不同,这个vba中如何设置?? 直接读取图表的formula,这个肯定不行的,这样还要marketdata.stkindi意义何在? 现在我这里出现的情况就是,图表上公式的值发生了变化,vba中调用相同的公式相同的参数,结果却没有变化。。 然后我在另外一个地方调用下application.ActiveFrameWithCode,这个时候vba中调用的公式的值立即发生了变化,跟图表上成一样的了。 所以我认定,这个中间金字塔肯定有处理不对的地方 |
|
-- 作者:yukizzc -- 发布时间:2016/5/18 16:25:54 -- 你在所引用的公式里输出下 a:barpos,k数据量 然后vba后台输出下看下这个值和图表上的是否一致 |
|
-- 作者:王锋 -- 发布时间:2016/5/18 17:35:30 -- marketdata.stkindi 这个需要你刷新的,并不表示你调用一次以后他就会随着图表而去刷新了,一般需要你用定时器来定时刷新这样才能不断根据最新的数据计算 |
|
-- 作者:bage -- 发布时间:2016/5/18 18:03:56 -- 公式输出a:barpos,k数据量,这个明天我测试下。 但是这个说法也没法解释,调用下application.ActiveFrameWithCode,vba和图表就能得到相同的公式指标值。 这个希望检查下呢。
|
|
-- 作者:bage -- 发布时间:2016/5/20 9:24:14 --
|
|
-- 作者:yukizzc -- 发布时间:2016/5/20 9:28:46 -- 把你代码贴下 另外formula的公式对象放在计时器里了么??? |
|
-- 作者:bage -- 发布时间:2016/5/20 11:27:09 --
If nHold<>0 Then iZhibiaoCCNew = nHold ElseIf sCode<>"" and sMarket<>"" and isNumeric(iPeriod) and nHold=0 Then Set Formula = marketdata.STKINDI(sCode,sMarket,sPolicy,0,iPeriod) \'取策略 iZhibiaoCCNew=Formula.GetBufData(sHoldingZhibiao,Formula.DataSize-1) \'取指标的返回值 iEnterPrice=Formula.GetBufData(sEnterPriceZhibiao,Formula.DataSize-1) \'取的返回值 iExitPrice=Formula.GetBufData(sExitPriceZhibiao,Formula.DataSize-1) \'取指标的返回值 sLogLine = "sCode=" & sCode & ",sMarket=" & sMarket & ",sPolicy=" & sPolicy & ",iPeriod=" & iPeriod logFs.writeLine(sLogLine) sLogLine = "time=" & Now & ",iZhibiaoCCNew=" &iZhibiaoCCNew& ",iEnterPrice=" &iEnterPrice& ",iExitPrice=" & iExitPrice logFs.writeLine(sLogLine) Else WriteLog "存在参数不符合条件的情况,请检查。code=[" & sCode & "],market=[: [" & sMarket & "],period=[" & iPeriod & "]." Exit For End If 上面就是调用formula的代码,这段代码是放在一个函数中的。。 Sub Application_Timer(ID) \'数据导出导入部分删掉 If ID=2 Then \'将行情信息输出到文件中,方便监控程序监控是否一直在刷新行情 getOutInfo \'iRunStatus的赋值由界面进行控制 If iRunStatus=1 Then DebugLog("=====Start====") Call Application.KillTimer(2) \'读取第一个tick,当第一个tick处于9:00-15:00,21:00-23:59的时候,修改市场的启动状态。当有一个市场启动的时候,就执行策略检查;在策略检查的时候,处理交易的状态,还有市场的启动标记 nRet = CheckMarketFlag() if nRet=1 then ReadPubPara \'读入公共参数 tYcTime=gettime(sYcTime) If tYcTime=true Then \'移仓判断 \'在移仓时间段内,首先判断是否已经移仓判断过。如果没有判断过,则循环账户持仓列表,只要不是主力合约的,则直接用市价移仓。 DoYc Else bYcRun=0 End If \'tYcTime=true If CDate(time) >CDate("14:50:00") and CDate(time)<CDate("15:00:00") Then \'快收盘的时候,再次判断下移仓到预先判断的主力合约品种的成交量 CheckMainCode End If \'如果到了日内平仓时间且日内点了勾,则进行平仓判断 If CDate(time)>CDate(sPingTimeSP) and CDate(time)<=CDate("15:00:00") Then \'商品日内平仓 If Instr(sPingMarket,"SQ,ZQ,DQ")=0 Then sPingMarket = sPingMarket&"SQ,ZQ,DQ" End If RiNeiPingCang "SQ,ZQ,DQ" End If If CDate(time)>CDate(sPingTimeZJ) and CDate(time)<=CDate("15:15:00") Then \'股指日内平仓 If Instr(sPingMarket,"ZJ")=0 Then sPingMarket = sPingMarket&"ZJ" End If RiNeiPingCang "ZJ" End If \'检查策略是否发单 CheckPolicy \'待移仓结束后 \'If bYcRun=0 and bReleaseRun=0 Then \' \'循环发单列表,对能够发单的进行发单 \' SendOrder \'End If \'判断账户是否存在锁仓,有的话需要用对手价进行解锁 If nJieSuo=1 Then ReleaseCapital End If \'If sCSGZ="1" or sCSSP="1" or sCJGZ="1" or sCJSP="1" Then \' CancelAndReOrder \'撤单逻辑 \'End If ShouPanClear end if Call Application.SetTimer(2,1000) \'交易计时器 DebugLog("=====End====") End If End If End Sub 这段代码就是定时器的调用。。其中CheckPolicy 这个函数中就调用了formula。 我只能贴到这个程度了,代码量太大,而且不方便完全放出来。。
|