欢迎您光临博庭社区!

 找回密码
 立即注册
查看: 7024|回复: 14

怎样把一个用数组和for实现的逐行交易系统公式改为逐根的 [复制链接]

Rank: 8Rank: 8

发表于 2012-12-3 09:41:09 |显示全部楼层
本帖最后由 ptLibert 于 2012-12-5 20:18 编辑

让我们把一个原飞狐上的交易系统公式转换为金语言的智能交易公式
原交易系统公式是这样的:
  1. input:
  2.   n(0);

  3. cc:=c;
  4. hh:=ma(c,5);
  5. ll:=ma(c,10);
  6. ss[n]:=0;
  7. for i=n+1 to DATACOUNT do begin
  8. IF 2*cc[i]<c[i]+hh[i-1] then ss[i]:=1;
  9. else
  10. IF 2*cc[i]>c[i]+ll[i-1] then ss[i]:=-1;
  11. else
  12. ss[i]:=ss[i-1];
  13. end;

  14. buySignal:= ss=1;
  15. sellSignal := ss=-1;

  16. {开多}ENTERLONG:buySignal,TFILTER;
  17. {平多}EXITLONG:SellSignal,TFILTER;
复制代码
改为智能交易公式之后,是这样的
  1. //数组教程 SH600000 P_DAY
  2. #trade
  3. input:
  4.   n(0);
  5. cc:=c;
  6. hh:=ma(c,5);
  7. ll:=ma(c,10);
  8. if( BarPos<n) then
  9.     ss:=invalid;
  10. else
  11.     ss[0]:=0;
  12. if( BarPos>n) then  
  13. begin
  14.     if 2*cc<c+hh[1] then
  15.         ss:=1;
  16.     else  if 2*cc>c+ll[1] then
  17.         ss:=-1;
  18.     else
  19.         ss:=ss[1];
  20. end;

  21. buySignal:= ss=1;
  22. sellSignal := ss=-1;

  23. {开多}if buySignal then buy;
  24. {平多}if sellSignal then sell;
复制代码

使用道具 举报

Rank: 8Rank: 8

发表于 2012-12-3 09:41:10 |显示全部楼层
本帖最后由 ptLibert 于 2012-12-3 09:42 编辑

让我们看一下其中的不同
1,我们在前面加了一行#trade。这行其实可以不加,如果公式存放在公式树的“智能交易”目录下。但加上这行代码,自己以后看代码的时候会更清楚的提醒自己:这个公式是个智能交易公式。
智能交易公式都是逐根的。

2.原公式第7行,ss[n] := 0;
原来的意图是,k线图的前n根k线都不需要计算,从第n根开始算。并且第n根的hld赋值为零。
改为
if barPos<n then ss := invalid then ss:=0; 更清晰的反映这个意图。

3.把for循环去掉
在逐行下,每次都要返回去处理之前的值,所以需要一个for循环。
逐根模式下,以前的值不再处理,只处理当前一根,所以不需要for

4.hh[i-1]改为了hh[1]。
在逐行中,i-1代表的是i的前一根。而逐根计算中,[1]代表当前根的前一根。

5.把enterlong: 改为了buy
我想这个不需要解释了。

6.把tFilter去掉了。在金语言中,buy默认就是配对的,要等到原仓位清仓后,才生效。所以tFilter就不需要了。

使用道具 举报

Rank: 2

发表于 2013-6-26 22:27:35 |显示全部楼层
ss[1]和ref(ss,1)有区别吗??照这样看是不是一样了?

使用道具 举报

Rank: 8Rank: 8

发表于 2013-6-27 08:17:27 |显示全部楼层
lwx007 发表于 2013-6-26 22:27
ss[1]和ref(ss,1)有区别吗??照这样看是不是一样了?

多数情况下没区别。
但是在概念上,[1]更明确的是单值,而ref是序列。

使用道具 举报

Rank: 3Rank: 3

发表于 2013-12-3 14:08:52 |显示全部楼层
ptLibert 发表于 2013-6-27 08:17
多数情况下没区别。
但是在概念上,[1]更明确的是单值,而ref是序列。

请教老师   如何表达自动交易连续亏损两笔后终止交易n分钟呢?

使用道具 举报

Rank: 8Rank: 8

发表于 2013-12-3 17:51:22 |显示全部楼层
tulong12 发表于 2013-12-3 14:08
请教老师   如何表达自动交易连续亏损两笔后终止交易n分钟呢?

首先,有一个系统函数可以利用:NumConsecLosers(),这个返回连亏的次数。

至于终止n分钟,你需要用一个变量记录发现连亏两笔的时间,然后之后的交易都判断这个时间。这个变量最好声明为单值类型,也就是numericSimple

使用道具 举报

Rank: 2

发表于 2014-3-9 17:15:28 |显示全部楼层
ptLibert 发表于 2012-12-3 09:41
让我们看一下其中的不同
1,我们在前面加了一行#trade。这行其实可以不加,如果公式存放在公式树的“智能交 ...

尊敬的ptLibert:
你好! 俺也是分析家和飞狐的老用户了, 刚接触金魔方不久,
觉得它在量化投资的功能上(增添了很多交易类的函数)比之前者有了革命性的变化.

由于引入了逐根k线的运行模式的设计架构, 使得编程能够做更精细的控制. 很好的设计理念.
但是也让俺在对待序列变量的操作上产生了混淆: 比如你的例子里面的:

hh[1]
它表示hh序列的当前的k线之前一根的k线的hh的值呢, 还是表示hh序列的最新一根k线之前一根bar的hh值呢?
如果是前者的意思,                    也就是表示:  hh[BarPos-1]
如果是后者的意思的话, 则: hh[1] 表示的是:    hh[BarPos-1] when BarPos=datacount

烦请您耐心解释解释, 多谢.

使用道具 举报

Rank: 8Rank: 8

发表于 2014-3-9 17:35:06 |显示全部楼层
duanqs 发表于 2014-3-9 17:15
尊敬的ptLibert:
你好! 俺也是分析家和飞狐的老用户了, 刚接触金魔方不久,
觉得它在量化投资的功能上(增 ...

由于逐根运算,假设当时运算至barpos,那么hh[0],对应的是第barpos根的hh,而hh[1],就是第barpos-1根的hh

使用道具 举报

Rank: 2

发表于 2014-3-9 20:56:00 |显示全部楼层
ptLibert 发表于 2014-3-9 17:35
由于逐根运算,假设当时运算至barpos,那么hh[0],对应的是第barpos根的hh,而hh[1],就是第barpos-1根的 ...

再次感谢ptLibert.
俺基本上明白了, 但是7楼帖子里的对序列下标的表达的方式依旧延续了老的数组的下标方式.
看来还得洗洗脑子.

是不是在金魔方的公式里面, 在run_by_bar模式下, 序列变量可以不用事先声明, 直接就可以被赋值了?

使用道具 举报

Rank: 2

发表于 2014-3-9 21:49:50 |显示全部楼层
想尝试一下如何粘贴代码: 点击发帖窗口右上角的高级按钮,
会出现<>这个图标, 它代表"添加代码文字",
点击之.粘贴之.提交之.
  1. #SubChart
  2. #Run_By_Bar

  3. input:
  4.   n(0);
  5. cc:=c;
  6. hh:=ma(c,5);
  7. ll:=ma(c,10);
  8. if( BarPos<n) then
  9.     ss:=invalid;
  10. else
  11.     ss[0]:=0;
  12. if( BarPos>n) then  
  13. begin
  14. //    if 2*cc<c+hh[1] then
  15.     if cc<hh[1] then
  16.         ss:=1;
  17.     //else  if 2*cc>c+ll[1] then
  18.     else  if cc>ll[1] then
  19.         ss:=-1;
  20.     else
  21.         ss:=ss[1];
  22. end;

  23. buySignal:= ss=-1    ; //1;
  24. sellSignal := ss=1;  //-1;

  25. //{开多}if buySignal then buy;
  26. //{平多}if sellSignal then sell;  
  27.   
  28. //Asset1 :Asset,NoAxis,ColorYellow;

  29. //cccc:c, PointDot, linethick2;
  30. Plot(c,'theClose',ColorRed,Colorblack,5,PointDot);
  31. Plot(c,'',ColorGray,Colorblack,1,LineSolid);
  32. bs: buySignal,NoAxis;
  33. KLine(o,h,l,c,0);
  34.   
复制代码





使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

bottom

Archiver|http://www.patiosoft.com

GMT+8, 2017-12-17 03:03 , Processed in 0.120020 second(s), 11 queries .

花生网 Copyrigh©2012

和讯信息科技有限公司 ALL Rights Reserved 版权所有 复制必究

回顶部