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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 请教版主sub参数为对象的问题

   

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


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

主题:请教版主sub参数为对象的问题

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


加好友 发短信
等级:论坛游侠 帖子:109 积分:764 威望:0 精华:0 注册:2010/6/27 14:04:16
[求助]请问金字塔系统可以实现A股跟股指期货的套利吗?  发帖心情 Post By:2010/6/30 22:12:12 [只看该作者]

在框架的原码里面我调用了一个很简单的sub(Grid),Grid做为对象传递的
如果在框架内部的自选股切换品种,没有任何问题,但我使用键盘精灵打来不是自选股的股票时,马上卡死然后不响应。
我查了下,vb里sub为对象,有sub(xx as object),在金的vba里,sub(Grid)应该怎么调用。谢谢!
因为我想框架内的窗格进行处理,所以定了个sub过程。
代码如下:
Sub kp_Paint()
set Grid30=kp.GetGridByName("Win30")
DrawHH(Grid30)
End Sub




Sub DrawHH(Grid)
Set History =Grid.GetHistoryData()
...(我在论坛上发的十多句数学运算)
end sub
按照贵公司提供的说明:
调用 Sub 过程时,只需输入过程名及所有参数值,参数值之间使用逗号分隔。不需使用 Call 语句,但如果使用了此语句,则必须将所有参数包含在括号之中。 下面的示例显示了调用 MyProc 过程的两种方式。一种使用 Call 语句;另一种则不使用。两种方式效果相同。

Call MyProc(firstarg, secondarg)
MyProc firstarg, secondarg

请注意当不使用 Call 语句进行调用时,括号被省略。

我分别采用了这两种调用方式,结果更不理想,只要一翻页,不会超过两次,马上卡死。
也就是,只要本框架内的报表里面的自选股切换一点问题都没有,但是只要不是报表里的自选股,一换就卡死。恳请版主帮帮忙解答下,万分期待,谢谢了!
[此贴子已经被作者于2010-6-30 22:35:03编辑过]

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


加好友 发短信
等级:论坛游侠 帖子:232 积分:1256 威望:0 精华:0 注册:2010/4/24 21:58:28
  发帖心情 Post By:2010/6/30 23:31:29 [只看该作者]

虽然,觉得你这种用法没什么必要,但是,你提出的这个问题,很好,就是,自定义函数的参数,能不能是Grid对象?

 

你有没有打开作为参数传递的这个GRID呢?


 回到顶部
帅哥,在线噢!
admin
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2010/7/1 10:26:22 [只看该作者]

可否将代码贴出来,我们帮你仔细看看


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


加好友 发短信
等级:论坛游侠 帖子:109 积分:764 威望:0 精华:0 注册:2010/6/27 14:04:16
  发帖心情 Post By:2010/7/1 10:53:51 [只看该作者]

再次谢谢管理员谢谢版主
因为你们的backset不支持嵌套,然后自定义公式会不断的重画,有循环,实盘根本不能用。如果你们把backset搞好后,我也不想麻烦。
我把sub子程序贴出来,请大大帮我分析下:
Sub kp_Paint()
set Grid30=kp.GetGridByName("Win30")
DrawQSX(Grid30)
End Sub


Sub DrawQSX(Grid)
Set History =Grid.GetHistoryData()
DataCount = 0
rTime=0
lTime=0
i=history.Count-4
spaceNumber=Grid.ShowLastCyc
CS=0
do
boolH=history.high(i)>history.high(i-1) and history.high(i)>=history.high(i-2) and history.high(i)>=history.high(i-3) _
and history.high(i)>=history.high(i+1) and history.high(i)>=history.high(i+2) and history.high(i)>=history.high(i+3)
if boolH then
DataCount=DataCount+1
if DataCount=1 then
RTime=i

end if


if DataCount=2 then
LTime=i
exit do
end if
end if
i=i-1
loop



hLeftPrice=history.high(LTime)
hRightPrice=history.high(RTime)

xhLeft=Grid.PelsByPos(LTime,false)
xhRight=Grid.PelsByPos(RTime,false)

yhLeft=Grid.PriceToPels(hLeftPrice)
yhRight=Grid.PriceToPels(hRightPrice)

xhLastPos=Grid.PelsByPos(history.Count+spaceNumber,false)

CS1=FormatNumber(CDbl((hleftPrice-hRightPrice)/(Rtime-Ltime)),2)
CS=(yhleft-yhright)/(xhRight-xhLeft)


ZhuLi=HLeftPrice-CS1*(History.Count-Ltime-1)
Grid.drawtext 0,20,"zhuli:"+Cstr(Zhuli),rgb(0,255,0)

yhLastPos=yhRight+(xhright-xhLastPos)*CS

Grid.drawline xhleft,yhleft,xhLastPos,yhlastPos,rgb(255,0,0),3

End Sub


原码就这样了,在框架内的自选股一点问题都没有,速度也很理想,但在框架上调自选股以外的,马上卡死!
请管理员和版主教我,谢谢!
再补充下,断线处理中,反正不管你如果操作,只要不小心切到自选股以外的,直接卡死!这样处理,实盘速度很快!
再补充下,刚测试的,实盘中,用鼠标点击自选股切换也会卡死!
[此贴子已经被作者于2010-7-1 11:05:37编辑过]

 回到顶部
帅哥,在线噢!
admin
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2010/7/3 15:55:00 [只看该作者]

请加我QQ442902994, 然后将框架也拷贝给我,否则我这里无法复现你的机器运行状态


 回到顶部
帅哥,在线噢!
admin
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:7302 积分:32559 威望:1000 精华:45 注册:2003/12/30 16:34:32
  发帖心情 Post By:2010/7/4 17:30:23 [只看该作者]

初步运行了你的例子,然后发现你的死机情况主要是你的LOOP循环的位置会出现死循环导致,因为你的循环的唯一终止点是一个DataCount变量,但是很不明确,这种代码编写极易导致因为DataCount计算不当导致死循环无法推出,导致金字塔停止相应,我在你的循环地方加了MAXLOOP循环判断,就是到了10000次就强行终止退出,但治标不治本,这个地方还得靠你自己去完善改写

 

Sub kp_Paint()
     set Grid=kp.GetGridByName("Win30")
   
    Set History =Grid.GetHistoryData()
  
 DataCount = 0
 rTime=0
 lTime=0
 i=history.Count-4
    spaceNumber=Grid.ShowLastCyc
    CS=0
    MaxLoop = 0
 
 do
    boolH=history.high(i)>history.high(i-1) and history.high(i)>=history.high(i-2) and history.high(i)>=history.high(i-3) _
           and history.high(i)>=history.high(i+1) and history.high(i)>=history.high(i+2) and history.high(i)>=history.high(i+3)
'       boolL=history.Low(i)<history.Low(i-1) and history.Low(i)<=history.Low(i-2) and history.Low(i)<=history.Low(i-3) _
 '          and history.Low(i)<=history.Low(i+1) and history.Low(i)<=history.Low(i+2) and history.Low(i)<=history.Low(i+3)
     if boolH then
           DataCount=DataCount+1
           if DataCount=1 then
             RTime=i
           
           end if
    
           if DataCount=2 then
             LTime=i
             
             exit do
           end if 
     end if
     i=i-1 
     MaxLoop = MaxLoop + 1
     if MaxLoop > 10000 then
        exit do
     end if
 loop
 
    hLeftPrice=history.high(LTime)
    hRightPrice=history.high(RTime)
   
    xhLeft=Grid.PelsByPos(LTime,false)
    xhRight=Grid.PelsByPos(RTime,false)
   
    yhLeft=Grid.PriceToPels(hLeftPrice)  
    yhRight=Grid.PriceToPels(hRightPrice)
   
    xhLastPos=Grid.PelsByPos(history.Count+spaceNumber,false)  
    

   '小心除零错误
    if Rtime-Ltime <= 0 then
       exit sub
    end if

   
    CS1=FormatNumber(CDbl((hleftPrice-hRightPrice)/(Rtime-Ltime)),2)
    CS=(yhleft-yhright)/(xhRight-xhLeft)
   
    ZhuLi=HLeftPrice-CS1*(History.Count-Ltime-1)
    Grid.drawtext 0,20,"阻力值:"+Cstr(Zhuli),rgb(0,255,0)
   
    yhLastPos=yhRight+(xhright-xhLastPos)*CS
      
   
    Grid.drawline xhleft,yhleft,xhLastPos,yhlastPos,rgb(255,0,0),3
   
End Sub


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


加好友 发短信
等级:论坛游侠 帖子:109 积分:764 威望:0 精华:0 注册:2010/6/27 14:04:16
  发帖心情 Post By:2010/7/4 18:47:31 [只看该作者]

非常admin的热心帮助,调试了下,确实是我的算法有问题!
[此贴子已经被作者于2010-7-4 18:58:07编辑过]

 回到顶部