以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (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
--  
marketdata.stkindi 这个需要你刷新的,并不表示你调用一次以后他就会随着图表而去刷新了,一般需要你用定时器来定时刷新这样才能不断根据最新的数据计算


--这个肯定是在定时器中循环刷新的。昨晚又出现了情况,21:00:00的时候,图表和vba计算出来的公式结果不一致。

--  作者: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。


我只能贴到这个程度了,代码量太大,而且不方便完全放出来。。