ptLibert 发表于 2012-12-3 09:41:09

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

本帖最后由 ptLibert 于 2012-12-5 20:18 编辑

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

cc:=c;
hh:=ma(c,5);
ll:=ma(c,10);
ss:=0;
for i=n+1 to DATACOUNT do begin
IF 2*cc<c+hh then ss:=1;
else
IF 2*cc>c+ll then ss:=-1;
else
ss:=ss;
end;

buySignal:= ss=1;
sellSignal := ss=-1;

{开多}ENTERLONG:buySignal,TFILTER;
{平多}EXITLONG:SellSignal,TFILTER;
改为智能交易公式之后,是这样的
//数组教程 SH600000 P_DAY
#trade
input:
  n(0);
cc:=c;
hh:=ma(c,5);
ll:=ma(c,10);
if( BarPos<n) then
    ss:=invalid;
else
    ss:=0;
if( BarPos>n) then  
begin
    if 2*cc<c+hh then
        ss:=1;
    else  if 2*cc>c+ll then
        ss:=-1;
    else
        ss:=ss;
end;

buySignal:= ss=1;
sellSignal := ss=-1;

{开多}if buySignal then buy;
{平多}if sellSignal then sell;

ptLibert 发表于 2012-12-3 09:41:10

本帖最后由 ptLibert 于 2012-12-3 09:42 编辑

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

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

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

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

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

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

lwx007 发表于 2013-6-26 22:27:35

ss和ref(ss,1)有区别吗??照这样看是不是一样了?

ptLibert 发表于 2013-6-27 08:17:27

lwx007 发表于 2013-6-26 22:27 static/image/common/back.gif
ss和ref(ss,1)有区别吗??照这样看是不是一样了?

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

tulong12 发表于 2013-12-3 14:08:52

ptLibert 发表于 2013-6-27 08:17 static/image/common/back.gif
多数情况下没区别。
但是在概念上,更明确的是单值,而ref是序列。

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

ptLibert 发表于 2013-12-3 17:51:22

tulong12 发表于 2013-12-3 14:08 static/image/common/back.gif
请教老师   如何表达自动交易连续亏损两笔后终止交易n分钟呢?

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

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

duanqs 发表于 2014-3-9 17:15:28

ptLibert 发表于 2012-12-3 09:41 static/image/common/back.gif
让我们看一下其中的不同
1,我们在前面加了一行#trade。这行其实可以不加,如果公式存放在公式树的“智能交 ...

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

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

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

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

ptLibert 发表于 2014-3-9 17:35:06

duanqs 发表于 2014-3-9 17:15 static/image/common/back.gif
尊敬的ptLibert:
你好! 俺也是分析家和飞狐的老用户了, 刚接触金魔方不久,
觉得它在量化投资的功能上(增 ...

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

duanqs 发表于 2014-3-9 20:56:00

ptLibert 发表于 2014-3-9 17:35 static/image/common/back.gif
由于逐根运算,假设当时运算至barpos,那么hh,对应的是第barpos根的hh,而hh,就是第barpos-1根的 ...

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

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

duanqs 发表于 2014-3-9 21:49:50

想尝试一下如何粘贴代码: 点击发帖窗口右上角的高级按钮,
会出现<>这个图标, 它代表"添加代码文字",
点击之.粘贴之.提交之.

#SubChart
#Run_By_Bar

input:
  n(0);
cc:=c;
hh:=ma(c,5);
ll:=ma(c,10);
if( BarPos<n) then
    ss:=invalid;
else
    ss:=0;
if( BarPos>n) then  
begin
//    if 2*cc<c+hh then
    if cc<hh then
        ss:=1;
    //else  if 2*cc>c+ll then
    else  if cc>ll then
        ss:=-1;
    else
        ss:=ss;
end;

buySignal:= ss=-1    ; //1;
sellSignal := ss=1;  //-1;

//{开多}if buySignal then buy;
//{平多}if sellSignal then sell;  
  
//Asset1 :Asset,NoAxis,ColorYellow;

//cccc:c, PointDot, linethick2;
Plot(c,'theClose',ColorRed,Colorblack,5,PointDot);
Plot(c,'',ColorGray,Colorblack,1,LineSolid);
bs: buySignal,NoAxis;
KLine(o,h,l,c,0);
  




页: [1] 2
查看完整版本: 怎样把一个用数组和for实现的逐行交易系统公式改为逐根的