设为首页收藏本站

 找回密码
 注册
楼主: 追涨杀跌
打印 上一主题 下一主题

跨周期数据转换函数以及跨周期技术指标调用的实现 [复制链接]

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
21#
发表于 2011-6-23 22:45:16 |只看该作者
最后一个跨周期RSI指标,新建函数MtRSI,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(14) ;
  5.         NumericRef oRSIValue;
  6. Vars
  7.         NumericSeries mtBarCnt;
  8.         NumericSeries mtClose;
  9.         Numeric refCurBar;
  10.         Numeric refOpen;
  11.         Numeric refHigh;
  12.         Numeric refLow;
  13.         Numeric refClose;
  14.         Numeric refVol;
  15.         Numeric refOpenInt;

  16.         NumericSeries NetChgAvg( 0 );
  17.         NumericSeries TotChgAvg( 0 );
  18.         Numeric Change( 0 );
  19.         Numeric SF( 0 );
  20.         Numeric ChgRatio( 0 ) ;
  21.         Numeric RSIValue;
  22.         BoolSeries bStopLoop;
  23.         Numeric i;
  24.         Numeric j(0);
  25.         Numeric K;
  26.         Numeric nbClose;
  27.         Numeric nbClose1;
  28. Begin
  29.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  30.         mtClose = refClose;

  31.         SF = 1/Length;
  32.         bStopLoop = bStopLoop[1];
  33.         If (bStopLoop!=true)
  34.         {
  35.                 j = 0;
  36.                 For i = 0 to Length
  37.                 {
  38.                         If (mtClose[j] == InvalidNumeric)
  39.                         {
  40.                                 nbClose = InvalidNumeric;
  41.                                 i = Length + 1;
  42.                         }
  43.                         Else
  44.                         {
  45.                                 nbClose = mtClose[j];
  46.                                 j = j + mtBarCnt[j];
  47.                         }
  48.                 }
  49.                 if(nbClose!=InvalidNumeric and mtClose[j] != InvalidNumeric) bStopLoop = true;
  50.         }

  51.         If(nbClose == InvalidNumeric)
  52.         {
  53.                 RSIValue = InvalidNumeric;
  54.         }Else
  55.         {
  56.                 If(bStopLoop !=true)
  57.                 {
  58.                         NetChgAvg = ( mtClose - nbClose ) / Length ;
  59.                         j = 0;
  60.                         K = 0;
  61.                         For i = 1 To Length
  62.                         {
  63.                                 j = K + mtBarCnt[K];
  64.                                 TotChgAvg = TotChgAvg+Abs(mtClose[K] - mtClose[j]);
  65.                                 K = j ;
  66.                         }
  67.                         TotChgAvg = TotChgAvg / Length;
  68.                 }
  69.                 Else
  70.                 {
  71.                         Change = mtClose - mtClose[mtBarCnt] ;
  72.                         NetChgAvg = NetChgAvg[mtBarCnt] + SF * ( Change - NetChgAvg[mtBarCnt] ) ;
  73.                         TotChgAvg = TotChgAvg[mtBarCnt] + SF * ( Abs( Change ) - TotChgAvg[mtBarCnt] ) ;
  74.                 }
  75.                
  76.                 If( TotChgAvg <> 0 )
  77.                 {
  78.                         ChgRatio = NetChgAvg / TotChgAvg ;
  79.                 }else
  80.                 {
  81.                         ChgRatio = 0 ;
  82.                 }
  83.                
  84.                 RSIValue = 50 * ( ChgRatio + 1 ) ;
  85.         }
  86.        
  87.         oRSIValue = RSIValue;
  88.         return mtBarCnt;
  89. End
复制代码
再新建公式应用TestMtRsi,把传统的RSI使用方法改了一下,RSI大于50做多,小于50做空。
  1. Params
  2.         Numeric TimeFrame(1440);        // 日线
  3.         Numeric BarsBack(1);                // 求前一日的值
  4.         Numeric Length(14) ;
  5.         Numeric OverSold(30) ;
  6.         Numeric OverBought(70) ;
  7.         Numeric Lots(1);
  8. Vars
  9.         NumericSeries RSIValue;
  10.         Numeric oRSIValue;
  11.         Numeric PreBar;
  12. Begin
  13.         PreBar = MtRSI(TimeFrame,BarsBack,Length,oRSIValue);
  14.         RSIValue = oRSIValue;

  15.         PlotNumeric("RSI",RSIValue);
  16.         PlotNumeric("超买",OverBought);
  17.         PlotNumeric("超卖",OverSold);

  18.         If (RSIValue>50)
  19.         {
  20.                 Buy(Lots,Open);
  21.         }
  22.         If (RSIValue<50)
  23.         {
  24.                 SellShort(Lots,Open);
  25.         }
  26. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
22#
发表于 2011-6-23 23:17:38 |只看该作者
本帖最后由 追涨杀跌 于 2011-6-23 23:18 编辑

至此,我已经做好的几个跨周期的指标,已经全部发表完毕。接下来,试着完成致富朋友的要求。其实有了前面的例子,要实现同时读取多个周期的MACD和KDJ值不是什么难事,就是同样的代码复制黏贴,多写几遍就是了。这里我只以MACD为例子,在1分钟图上使用,KDJ的部分致富可以自己完成。计算出来的指标我就不显示了,太多了。我只把提示买入卖出的信息作为注释信息输出了,供你参考吧。
  1. Params
  2.         Numeric FastLength(12);
  3.         Numeric SlowLength(26);
  4.         Numeric MACDLength(9);
  5. Vars
  6.         Numeric PreBar60;
  7.         Numeric ooMACDValue60;
  8.         Numeric ooAvgMACD60;
  9.         NumericSeries MACDVAlue60;
  10.         NumericSeries AvgMACD60;
  11.         NumericSeries MACDDiff60;
  12.        
  13.         Numeric PreBar30;
  14.         Numeric ooMACDValue30;
  15.         Numeric ooAvgMACD30;
  16.         NumericSeries MACDVAlue30;
  17.         NumericSeries AvgMACD30;
  18.         NumericSeries MACDDiff30;

  19.         Numeric PreBar15;
  20.         Numeric ooMACDValue15;
  21.         Numeric ooAvgMACD15;
  22.         NumericSeries MACDVAlue15;
  23.         NumericSeries AvgMACD15;
  24.         NumericSeries MACDDiff15;
  25.        
  26.         Numeric PreBar5;
  27.         Numeric ooMACDValue5;
  28.         Numeric ooAvgMACD5;
  29.         NumericSeries MACDVAlue5;
  30.         NumericSeries AvgMACD5;
  31.         NumericSeries MACDDiff5;

  32.         Numeric PreBar3;
  33.         Numeric ooMACDValue3;
  34.         Numeric ooAvgMACD3;
  35.         NumericSeries MACDVAlue3;
  36.         NumericSeries AvgMACD3;
  37.         NumericSeries MACDDiff3;

  38. Begin
  39.         PreBar60 = MtMACD(60,1,FastLength,SlowLength,MACDLength,ooMACDValue60,ooAvgMACD60);
  40.         MACDVAlue60 = ooMACDValue60;
  41.         AvgMACD60 = ooAvgMACD60;
  42.         MACDDiff60 = MACDValue60 - AvgMACD60;

  43.         If (MacdDiff60[PreBar60]<0 and MacdDiff60>0)
  44.                 Commentary("60分钟MACD买入信号");
  45.         If (MacdDiff60[PreBar60]>0 and MacdDiff60<0)
  46.                 Commentary("60分钟MACD卖出信号");

  47.         PreBar30 = MtMACD(30,1,FastLength,SlowLength,MACDLength,ooMACDValue30,ooAvgMACD30);
  48.         MACDVAlue30 = ooMACDValue30;
  49.         AvgMACD30 = ooAvgMACD30;
  50.         MACDDiff30 = MACDValue30 - AvgMACD30;

  51.         If (MacdDiff30[PreBar30]<0 and MacdDiff30>0)
  52.                 Commentary("30分钟MACD买入信号");
  53.         If (MacdDiff30[PreBar30]>0 and MacdDiff30<0)
  54.                 Commentary("30分钟MACD卖出信号");

  55.         PreBar15 = MtMACD(15,1,FastLength,SlowLength,MACDLength,ooMACDValue15,ooAvgMACD15);
  56.         MACDVAlue15 = ooMACDValue15;
  57.         AvgMACD15 = ooAvgMACD15;
  58.         MACDDiff15 = MACDValue15 - AvgMACD15;

  59.         If (MacdDiff15[PreBar15]<0 and MacdDiff15>0)
  60.                 Commentary("15分钟MACD买入信号");
  61.         If (MacdDiff15[PreBar15]>0 and MacdDiff15<0)
  62.                 Commentary("15分钟MACD卖出信号");

  63.         PreBar5 = MtMACD(5,1,FastLength,SlowLength,MACDLength,ooMACDValue5,ooAvgMACD5);
  64.         MACDVAlue5 = ooMACDValue5;
  65.         AvgMACD5 = ooAvgMACD5;
  66.         MACDDiff5 = MACDValue5 - AvgMACD5;

  67.         If (MacdDiff5[PreBar5]<0 and MacdDiff5>0)
  68.                 Commentary("5分钟MACD买入信号");
  69.         If (MacdDiff5[PreBar5]>0 and MacdDiff5<0)
  70.                 Commentary("5分钟MACD卖出信号");

  71.         PreBar3 = MtMACD(3,1,FastLength,SlowLength,MACDLength,ooMACDValue3,ooAvgMACD3);
  72.         MACDVAlue3 = ooMACDValue3;
  73.         AvgMACD3 = ooAvgMACD3;
  74.         MACDDiff3 = MACDValue3 - AvgMACD3;

  75.         If (MacdDiff3[PreBar3]<0 and MacdDiff3>0)
  76.                 Commentary("3分钟MACD买入信号");
  77.         If (MacdDiff3[PreBar3]>0 and MacdDiff3<0)
  78.                 Commentary("3分钟MACD卖出信号");
  79. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
23#
发表于 2011-6-24 17:11:50 |只看该作者
TB没有在屏幕右上角显示内容的函数。您可以用plotString在当前BAr输出字符串,但要显示您说的那么多,呵呵,恐怕效果非常恐怖。对于程序化交易来说,我倒不认为需要显示那么多指标的信息,直接根据这些信息发出买卖指令不是更直接吗

使用道具 举报

Rank: 4

精华
0
UID
5754
积分
531
帖子
115
主题
57
阅读权限
50
注册时间
2009-10-27
最后登录
2023-11-3
24#
发表于 2011-6-25 12:39:30 |只看该作者
请问能不能再帮忙再写个跨周期的ATR,另外系统内置的ATR真实区间跟海龟的描述是不一样的,系统内置的是H-L,没有包括跳空,而海龟是取MAX(H-L,H-REFC,REFC-L)

使用道具 举报

Rank: 4

精华
0
UID
31858
积分
516
帖子
115
主题
34
阅读权限
50
注册时间
2011-4-9
最后登录
2020-11-29
25#
发表于 2011-6-27 10:55:33 |只看该作者
大侠啊,真是强
收藏了
杂多沽空

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
26#
发表于 2011-6-27 14:29:02 |只看该作者
回复 29# haomai01

回haomai01朋友。这两天忙,回复晚了点。其实TB中的ATR指标也是计算了跳空的,您可以仔细看一下指标代码。另外,您希望写的跨周期的ATR指标,我写了一下,供您参考。还是类似的做法,先把计算跨周期ATR的代码写成一个函数MtATR,然后新建一个公式应用调用这个函数显示指标或进行交易。
MtATR代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(14);                 // ATR周期
  5.         NumericRef oATR;                // 目标时间周期下的ATR值
  6. Vars
  7.         NumericSeries mtBarCnt;
  8.         NumericSeries mtCurBar;
  9.         NumericSeries mtHigh;
  10.         NumericSeries mtLow;
  11.         NumericSeries mtClose;
  12.         Numeric refCurBar;
  13.         Numeric refOpen;
  14.         Numeric refHigh;
  15.         Numeric refLow;
  16.         Numeric refClose;
  17.         Numeric refVol;
  18.         Numeric refOpenInt;
  19.         NumericSeries TR;
  20.         Numeric SumValue;
  21. Begin
  22.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  23.         mtCurBar = refCurBar;
  24.         mtHigh = refHigh;
  25.         mtLow = refLow;
  26.         mtClose = refClose;

  27.         if (mtCurBar <= 1) TR = MtHigh - MtLow;
  28.         else TR = Max(MtHigh,MtClose[mtBarCnt]) - Min(MtLow,MtClose[mtBarCnt]);

  29.         SumValue = MtSummation(TR,mtBarCnt,Length);

  30.         oATR = SumValue / Length;
  31.         return mtBarCnt;
  32. End
复制代码
公式应用TestMtATR代码如下;
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(14);                 // ATR周期
  5. Vars
  6.         NumericSeries ATRValue;
  7.         Numeric oATR;
  8. Begin
  9.         MtATR(TimeFrame,BarsBack,Length,oATR);
  10.         ATRValue = oATR;
  11.         PlotNumeric("ATR",ATRValue);
  12. End
复制代码

使用道具 举报

Rank: 4

精华
0
UID
39798
积分
251
帖子
34
主题
7
阅读权限
50
注册时间
2011-5-14
最后登录
2018-8-27
27#
发表于 2011-7-2 22:30:11 |只看该作者
本帖最后由 a_gou 于 2011-7-2 22:38 编辑

你好,追涨杀跌朋友,看了你的关于跨周期数据转换和技术指标调用的文章,有几个问题想请教下的。


1、nopain的跨周期例子需要打开不同周期窗口,你的案例主要目的是把大周期固定化,增加数据调用,而且做成用户函数的方式,对吗?


2、关于思路2中,你说用小周期的数据来推算大周期的数据,再用回到小周期里面去。这个目的是什么?是为了实时引用数据吗?比如你后面说的,要在日线是金叉的条件下发生5分钟金叉才会进入市场,而日线金叉也是实时变化的,在未收盘之际,日线发生金叉,5分钟会不会入市?还是5分钟取的是上一日的日线数据?如果是等日线结束或者取上一日的收据,那5分钟入市也没用了。


3、你说的“目标周期”,没有说是大周期还是小周期,不过你赋值的是月线,那就认为是大周期吧。barcnt和curbar是分别指小周期的索引和大周期的索引吗?在2楼的程序里,第75行-83行,说的是月线周期下,如果小周期在大周期里面,则最高最低还有成交量都会受到实时数据的影响,是这个意思吗?但66行-74行我就看不懂了。注释说,“如果在目标周期下,属于另一根K线”,这个是说小周期不在大周期内吗?小周期应该一直都是和大周期同步的啊。比如当前的5分钟K线怎么都是在当前的30分钟之内的啊!

请指教!

使用道具 举报

Rank: 1

精华
0
UID
38025
积分
32
帖子
7
主题
1
阅读权限
10
注册时间
2011-5-6
最后登录
2021-10-8
28#
发表于 2011-7-4 10:32:34 |只看该作者
老师,你好,我根据你写的小周期数据换成大周期数据测试了下,编译不通过啊。
  Return barCnt;

显示 Return 语句的返回类型与公式定义的返回类型值类型不符。
请教下,是什么问题啊。
程序化交易

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
29#
发表于 2011-7-4 18:17:33 |只看该作者
1、nopain的跨周期例子需要打开不同周期窗口,你的案例主要目的是把大周期固定化,增加数据调用,而且做成用户函数的方式,对吗?

我的目标就是在只开一个小周期窗口的情况下,能通过调用用户函数计算出相应的大周期的数据,然后再根据大周期的数据计算相应的大周期的技术指标,进而根据这些指标值来进行交易。当然由于大周期的滞后性(举例来说,就是当前5分钟线收盘了,但这个5分钟所对应的小时线还不一定收盘了),所以我们函数中,有个参数BarsBack,如果BarsBack=1,就是说计算大周期的K线数据时,用的是当前小周期所对应大周期的前一根K线的值,以5分钟算小时线来举例,10点10分的5分钟线,对应的小时线,为9点开始的小时线。如果BarsBack=2,计算的则是对应大周期的前2根K线的值,还是刚才那个例子,10点10分的5分钟线,对应的小时线,就是前一天的下午2点开始的小时线。如果BarsBack=0,则计算时,大周期的值是到这个小周期线结束时,对应的大周期的K线数据,还举刚才那个例子,10点10分的5分钟线,对应的是10点开始,到10点14分59秒结束时的小时线;10点30分的5分钟线,对应的则是10点开始,到10点34分59秒结束的小时线。

2、关于思路2中,你说用小周期的数据来推算大周期的数据,再用回到小周期里面去。这个目的是什么?是为了实时引用数据吗?比如你后面说的,要在日线是金叉的条件下发生5分钟金叉才会进入市场,而日线金叉也是实时变化的,在未收盘之际,日线发生金叉,5分钟会不会入市?还是5分钟取的是上一日的日线数据?如果是等日线结束或者取上一日的收据,那5分钟入市也没用了。

这就是为了实现很多朋友喜欢的多周期共振系统。以大周期来确定趋势,然后在小周期中寻找合适的进场点。如果BarsBack按照默认值设为1的话,计算的就是上一日的日线数据。这样信号更确定,不会闪烁。确定趋势后,再根据5分钟合适的时机入市,还是有一定意义的,既然是做大趋势,就是要在趋势确定的时候再进场,这并不矛盾。
3、你说的“目标周期”,没有说是大周期还是小周期,不过你赋值的是月线,那就认为是大周期吧。barcnt和curbar是分别指小周期的索引和大周期的索引吗?在2楼的程序里,第75行-83行,说的是月线周期下,如果小周期在大周期里面,则最高最低还有成交量都会受到实时数据的影响,是这个意思吗?但66行-74行我就看不懂了。注释说,“如果在目标周期下,属于另一根K线”,这个是说小周期不在大周期内吗?小周期应该一直都是和大周期同步的啊。比如当前的5分钟K线怎么都是在当前的30分钟之内的啊!

目标周期,就是大周期。先跟您解释一下函数的算法,然后Barcnt和CurBar的意思就能清楚了。在小周期的每根Bar调用函数时,会做一个判断,判断它在大周期上是否是一根新的K线。如果是就是执行66-73行之间的代码,我们还是举例来说,以小周期1分钟大周期5分钟举例,小周期上,9:00, 9:05,9:10。。。。这些时点的1分钟线就属于相应5分钟周期的一根新的K线,所以CurBar要加1,CurBar就是相应的大周期的索引。而9:01,9:06,9:11分。。。这些时点的1分钟线,它和前一个1分钟线,都是属于同一根5分钟线的,所以CurBar保持不变。而Barcnt表示的是从当前小周期的Bar到对应的大周期的Bar需要回溯的BAR数。还是上面的例子,9:00,9:01,9:02,9:03,9:04这五根1分钟K线上面都会计算到自己为止的5分钟的数据,只有9:04分的上面的5分钟数据是真正准确的,所以,9:05的1分钟k线上对应的应该的大周期K线应该是前一个5分钟线也就是9:04分计算出来的值,因此,在9:05的1分钟线上只需要回溯1根BAR,依此类推,9:06的1分钟线应该回溯2根,直到9:09分Barcnt变成5,然后9:10的应该读取9:09这根线上的5分钟数据,所以Barcnt=1,以此类推。。。这个确实需要一个图表来说明。改天吧

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
30#
发表于 2011-7-4 18:21:59 |只看该作者
老师,你好,我根据你写的小周期数据换成大周期数据测试了下,编译不通过啊。
  Return barCnt;

显示 Return 语句的返回类型与公式定义的返回类型值类型不符。
请教下,是什么问题啊。

函数的返回值类型为数值型,在模板选择时,选“数值型”

使用道具 举报

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

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-4-24 05:40

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部