以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://www.weistock.com/bbs/index.asp) -- 高级功能研发区 (http://www.weistock.com/bbs/list.asp?boardid=5) ---- 请教版主sub参数为对象的问题 (http://www.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() \'小心除零错误 |
-- 作者:volersky -- 发布时间:2010/7/4 18:47:31 -- 非常admin的热心帮助,调试了下,确实是我的算法有问题! [此贴子已经被作者于2010-7-4 18:58:07编辑过]
|