以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  [求助]stkindi的参数传送问题  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=172272)

--  作者:mcza30
--  发布时间:2019/10/2 23:16:01
--  [求助]stkindi的参数传送问题
我在测试stkindi的参数传送,代码如下

//tp:=12345678;//ok
tp:=c;               //error

m1:=NUMTOSTR(tp,0);
y:=stkindi(\'\',\'sub02.aa(\'&m1&\')\',0,1,0);

当tp为常数时传送正常,tp为c时报错“公式过多,超过50个”

请教如何理解“公式过多,超过50个”这个信息?
这里“公式”是指什么?






--  作者:FireScript
--  发布时间:2019/10/8 9:01:30
--  
就是指跨周期调用的那个公式 ,大致意思就是进行的跨周期调用的次数太多了。
你这里是个特殊情况。系统序列变量如 O H L C 不能这样作为参数传递进去,否则K线数多了就会出现这个报错。序列变量是特殊的变量,差不多相当于一个数组,一组数据,这就会导致在每个K上都会被视作参数不一样的跨周期调用了。从而导致上面的报错。 

--  作者:mcza30
--  发布时间:2019/10/9 9:41:03
--  
谢谢超级版主FireScript!

我想跨周期引用交易系统函数,公式2引用公式1。
程序如下,但是没有结果。请版主帮我看看有什么问题。谢谢


//------sub1008公式1
input: cmd(0,0,10,1);
if cmd=1 then  sell(1,0,marketr);     //平多
if cmd=2 then  sellshort(1,0,marketr);//平空
aa:=holding;


//------------公式2
T1:=TIME>=140000 and TIME<141000;//开多时间
T2:=TIME>=142000;                //平多时间
T3:=TIME>=143000 and TIME<144000;//开空时间
T4:=TIME>=145000;                //平多时间

buy(T1 and holding=0,1,MARKETR);
if T2 then y1:stkindi(\'\',\'sub1008.aa(1)\',0,0,0);

buyshort(T3 and holding=0,1,MARKETR);
if T4 then y2:stkindi(\'\',\'sub1008.aa(2)\',0,0,0);


--  作者:FireScript
--  发布时间:2019/10/9 9:49:12
--  
 第一个公式有问题。holding是虚拟持仓,在图表策略里面如果没有开仓语句,这个holding初始是0. 你公式1只有平仓语句,holding只会是0

此外还需要注意的就是 一般被引用的变量 最好用 “:” 定义 而不是用“:=”定义。

--  作者:FireScript
--  发布时间:2019/10/9 9:56:19
--  
然后就是第二个公式里面:
T1:=TIME>=140000 and TIME<141000;//开多时间
T2:=TIME>=142000;                //平多时间
T3:=TIME>=143000 and TIME<144000;//开空时间
T4:=TIME>=145000;                //平多时间

time返回的一般默认是金字塔时间:

图片点击可在新窗口打开查看此主题相关图片如下:temp.png
图片点击可在新窗口打开查看

你上面代码里面 如果你想表达北京时间的这个区间,你可能要改成金字塔时间的表达方式,也就是加上四个小时。


--  作者:mcza30
--  发布时间:2019/10/9 11:28:49
--  
lk:time;
显示时间,返回结果与金字塔时间是一致的。
我的电脑上没有你图片上括号显示部分,仅显示北京时间



--  作者:mcza30
--  发布时间:2019/10/9 13:02:13
--  
我作了修改,不用时间函数,如下:

//------sub1008公式1
aa:sell(1,0,marketr);     //平多


//------------公式2
T1:=count(c>o,2)=2;
buy(T1 and holding=0,1,MARKETR);  //开多

T2:=count(c<o,2)=2;
//sell(T2 and holding>0,0,marketr); //ok
if T2 then y1:stkindi(\'\',\'sub1008.aa\',0,0,0);  //跨周期引用没有反应

不知哪里出错,请版主指教,谢谢。




--  作者:FireScript
--  发布时间:2019/10/9 13:10:44
--  
能引用过来,但是值应该恒为0。


图片点击可在新窗口打开查看此主题相关图片如下:temp.png
图片点击可在新窗口打开查看


这句代码 你直接加载看下就知道了。恒为0的。
aa:sell(1,0,marketr);     //平多

就光裸一个平仓语句 aa只会是0.
[此贴子已经被作者于2019/10/9 13:12:16编辑过]

--  作者:mcza30
--  发布时间:2019/10/9 13:45:50
--  
aa我是作为一个引用标号,没有指定意义。

问题主要是sell(1,0,marketr); 没有平多操作,实盘和回测都没有动作。



--  作者:FireScript
--  发布时间:2019/10/9 14:00:51
--  
 图表策略 上没有开仓语句,这个平多是无论如何都不会触发的。图表策略加载在图表上,有开才能有平。图表策略在K线图上的信号是基于K线数据 和策略代码逻辑 进行的模拟下单 所产生的。你如果只写一个平仓语句是不行的。