欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 金字塔vba获取公式值错误的问题

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有4980人关注过本帖树形打印复制链接

主题:金字塔vba获取公式值错误的问题

帅哥哟,离线,有人找我吗?
bage
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:46 积分:0 威望:0 精华:0 注册:2015/12/10 13:37:45
金字塔vba获取公式值错误的问题  发帖心情 Post By:2016/5/18 14:51:12 [只看该作者]

 以前就反映过,vba调用formula。getbufData调用公式,计算指标值的时候,会发生跟图表上的公式指标值不一致的情况
就是图表上公式的值发生了变化,但是vba调用还没有发生变化。

后来发现,调用application.ActiveFrameWithCode后,再调用formula。getbufData获取公式的指标值,就能正确了
 这个bug,麻烦赶紧处理下呢
夜盘的时候,我这边已经出现很多次图表与vba策略值不一致的情况了

 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2016/5/18 15:26:37 [只看该作者]

这个不是BUG,你用marketdata.stkindi调用的公式,本身就会因为参数设置和加载数据的不同而造成不同结果,因为marketdata.stkindi的运行途径和图表上加载公式是分别运行的,只有你直接读取图表的formula才是你图表的实际计算的结果,他们才是完全一致的结果



金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
bage
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:46 积分:0 威望:0 精华:0 注册:2015/12/10 13:37:45
  发帖心情 Post By:2016/5/18 16:04:51 [只看该作者]

你用marketdata.stkindi调用的公式,本身就会因为参数设置和加载数据的不同而造成不同结果

--在vba和图表中,参数是设置成一样的。。你说的加载数据的不同,这个vba中如何设置??



 回到顶部
帅哥哟,离线,有人找我吗?
bage
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:46 积分:0 威望:0 精华:0 注册:2015/12/10 13:37:45
  发帖心情 Post By:2016/5/18 16:08:00 [只看该作者]

你用marketdata.stkindi调用的公式,本身就会因为参数设置和加载数据的不同而造成不同结果

--在vba和图表中,参数是设置成一样的。。你说的加载数据的不同,这个vba中如何设置??

直接读取图表的formula,这个肯定不行的,这样还要marketdata.stkindi意义何在?    

现在我这里出现的情况就是,图表上公式的值发生了变化,vba中调用相同的公式相同的参数,结果却没有变化。。 然后我在另外一个地方调用下application.ActiveFrameWithCode,这个时候vba中调用的公式的值立即发生了变化,跟图表上成一样的了。

所以我认定,这个中间金字塔肯定有处理不对的地方


 回到顶部
帅哥哟,离线,有人找我吗?
yukizzc
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2016/5/18 16:25:54 [只看该作者]

你在所引用的公式里输出下

a:barpos,k数据量

然后vba后台输出下看下这个值和图表上的是否一致


 回到顶部
帅哥哟,离线,有人找我吗?
王锋
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:罗宾汉 帖子:11808 积分:20695 威望:0 精华:10 注册:2009/8/18 8:15:13
  发帖心情 Post By:2016/5/18 17:35:30 [只看该作者]

marketdata.stkindi 这个需要你刷新的,并不表示你调用一次以后他就会随着图表而去刷新了,一般需要你用定时器来定时刷新这样才能不断根据最新的数据计算


金字塔—专业程序化软件提供商

金字塔-技术部

-----------------------------------------------------------------------------------------------------

工作时间:周一至周五 08:30 - 17:30   周末及法定节假日休息

Email:service@weistock.com
 回到顶部
帅哥哟,离线,有人找我吗?
bage
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:46 积分:0 威望:0 精华:0 注册:2015/12/10 13:37:45
  发帖心情 Post By:2016/5/18 18:03:56 [只看该作者]

公式输出a:barpos,k数据量,这个明天我测试下。

但是这个说法也没法解释,调用下application.ActiveFrameWithCode,vba和图表就能得到相同的公式指标值。
这个希望检查下呢。

 回到顶部
帅哥哟,离线,有人找我吗?
bage
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:46 积分:0 威望:0 精华:0 注册:2015/12/10 13:37:45
  发帖心情 Post By:2016/5/20 9:24:14 [只看该作者]

marketdata.stkindi 这个需要你刷新的,并不表示你调用一次以后他就会随着图表而去刷新了,一般需要你用定时器来定时刷新这样才能不断根据最新的数据计算


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

 回到顶部
帅哥哟,离线,有人找我吗?
yukizzc
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2016/5/20 9:28:46 [只看该作者]

把你代码贴下

另外formula的公式对象放在计时器里了么???


 回到顶部
帅哥哟,离线,有人找我吗?
bage
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:46 积分:0 威望:0 精华:0 注册:2015/12/10 13:37:45
  发帖心情 Post By: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。


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

 回到顶部
总数 13 1 2 下一页