以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  [求助]下面的代码怎么没能找出目前螺纹成交量最大的合约?  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=104)

--  作者:bhwhui
--  发布时间:2009/10/20 0:51:27
--  [求助]下面的代码怎么没能找出目前螺纹成交量最大的合约?

如题:

代码如下

 

variable:rb_label=\'\',rb_vol_max:=0;

for i=1 to 12 do
begin
    ii:=strright(\'0\'+numtostr(i,0),2);
    rb_ii:="rb"+ii;
    rb_vol:=stkindi(rb_ii,\'vol.volume\',0,5,0);
    if rb_vol>rb_vol_max then rb_label=rb_ii;
end;
 
合约:rb_label;
成交量:rb_vol_max;

标题rb_label一直为空,成交量为0哦,不解!

谢谢

[此贴子已经被作者于2009-10-20 0:54:03编辑过]

--  作者:bhwhui
--  发布时间:2009/10/20 1:05:34
--  

程序修改了一下,还不行、、、

 

variable:rb_label=\'\',rb_vol_max:=0;

for i=1 to 12 do
begin
    ii:=strright(\'0\'+numtostr(i,0),2);
    rb_ii:="rb"+ii;
    rb_vol:=stkindi(rb_ii,\'vol.volume\',0,5,0);
    if rb_vol>rb_vol_max then
       begin
       rb_label=rb_ii;
       rb_vol_max=rb_vol;
       end;
end;
 
合约:rb_label;
成交量:rb_vol_max;


--  作者:admin
--  发布时间:2009/10/20 9:42:50
--  

variable:rb_vol=0,rb_vol_max:=0;

for i=1 to 12 do
begin
    ii:=strright(\'0\'+numtostr(i,0),2);
    rb_ii:\'rb\'+ii,linethick0;
    rbvol:=stkindi(rb_ii,\'vol.volume\',0,6,0);
    if rbvol>rb_vol_max then
    begin
     rb_vol_max:= rbvol;
     rb_vol:= rbvol;
    end
end
 
成交量:rb_vol_max;

 

金字塔的公式不支持字符串的变量输出,所以rb_label只能返回0

这样基本搞定,你上面的公式问题太多了。

 


--  作者:bhwhui
--  发布时间:2009/10/20 12:48:11
--  

仔细比对,您改了3个地方。

1:周期为日线,我需要用到60min,所以用参数5没错。

2:去掉rb_label定义。程序中我需要知道是哪各个合约,多处用到它,所以不能去掉。

3:增加rb_vol定义,设为初值0 ,按程序设计原理,我有傅值语句rb_vol:=stkindi(rb_ii,\'vol.volume\',0,5,0);
     所以个人觉得没必要,当然这样更规整些。

 

最大的问题:程序计算结果不对,看下面截图。。。


--  作者:bhwhui
--  发布时间:2009/10/20 12:53:34
--  

图片点击可在新窗口打开查看

 

就看最后的vol值,计算不对。。。。

目前rb1001的成交量最大,按照程序原意,数值就应该是316.7万,谢谢

[此贴子已经被作者于2009-10-20 12:54:25编辑过]

--  作者:bhwhui
--  发布时间:2009/10/20 23:49:35
--  

经管理员帮助,搞清楚了问题所在。

在fxj,fh中variable 的定义是为了让程序在默认循环中保存数值,如果没有这个定义,那么下个bars 变量的初值将会是null.导致不可预计的后果。

 

而在金字塔中variable 的作用是定义全局变量,与周期有关。变量如果没有variabl定义,数值一样保存。。有区别的。。。。

[此贴子已经被作者于2009-10-20 23:51:21编辑过]

--  作者:bhwhui
--  发布时间:2009/10/20 23:55:06
--  

最终代码可以如下:不用variable 定义

 

rb_label:=0;
rb_vol_max:= 0;
rb_vol:=0;
 
for i=1 to 12 do
begin
    ii:=strright(\'0\'+numtostr(i,0),2);
    rb_ii:\'rb\'+ii,linethick0;
    rb_vol:=stkindi(rb_ii,\'vol.volume\',0,6,0);
    if rb_vol>rb_vol_max then
    begin
     rb_vol_max:= rb_vol;
     rb_label:=i;
    end
end
 
rb合约月份:rb_label;
成交量:rb_vol_max;

 

 


--  作者:admin
--  发布时间:2009/10/20 23:56:25
--  

那是Varable变量声明作用域的问题。

用Varable声明的变量是跨所有周期的变量。

下面公式将解决你前面的问题

 

//variable:rb_vol=0,rb_vol_max:=0;

rb_vol:=0;
rb_vol_max:=0;
for i=1 to 12 do
begin
    ii:=strright(\'0\'+numtostr(i,0),2);
    rb_ii:\'rb\'+ii,linethick0;
    rbvol:=stkindi(rb_ii,\'vol.volume\',0,6,0);
    if rbvol>rb_vol_max then
    begin
     rb_vol_max:= rbvol;
     rb_vol:= rbvol;
    end
end

成交量:rb_vol_max;

 


--  作者:金骄
--  发布时间:2009/10/27 7:53:12
--  

这样的公式,放在高速行情上面,机子能吃得消吗?

 

 


--  作者:bhwhui
--  发布时间:2009/10/28 22:40:09
--  

楼上说的有道理。

讨论才能提高自己(我自己),呵呵呵。楼上,如果此程序只是某个系统的控制部分,每天8:58定时运行一次,还会影响速度么?系统最终的目的是无人值守。这只是程序控制部分一段程序,最终目标是无人值守。。。