以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  请教版主sub参数为对象的问题  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=1998)

--  作者:volersky
--  发布时间:2010/6/30 22:12:12
--  [求助]请问金字塔系统可以实现A股跟股指期货的套利吗?
在框架的原码里面我调用了一个很简单的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
--  发布时间:2010/6/30 23:31:29
--  

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

 

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


--  作者:admin
--  发布时间:2010/7/1 10:26:22
--  

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


--  作者:volersky
--  发布时间: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
--  发布时间:2010/7/3 15:55:00
--  

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


--  作者:admin
--  发布时间: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
--  发布时间:2010/7/4 18:47:31
--  
非常admin的热心帮助,调试了下,确实是我的算法有问题!
[此贴子已经被作者于2010-7-4 18:58:07编辑过]