设为首页收藏本站

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

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

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
11#
发表于 2011-6-18 11:08:12 |显示全部楼层
回复 16# hugh1982

按照你的意思,大致写了一下,看看是否符合你的要求。
  1. //------------------------------------------------------------------------
  2. // 简称: TestMtMa_V2
  3. // 名称: 周线加日线均线策略
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. // 输出:
  7. //------------------------------------------------------------------------

  8. Params
  9.         Numeric TimeFrame(10080);        // 目标时间周期:周线
  10.         Numeric BarsBack(1);                // 以前一周的均线来判断

  11.         Numeric WeekLength(5);                // 周线的均线周期               
  12.         Numeric Length1(5);                        // 日线的短期均线周期
  13.         Numeric Length2(10);                // 日线的长期均线周期
  14.         Numeric Lots(1);                        // 交易头寸大小
  15. Vars
  16.         NumericSeries WeekMA;
  17.         Numeric oWeekMA;

  18.         NumericSeries MA1;
  19.         NumericSeries MA2;
  20. Begin
  21.         MtMa(TimeFrame,BarsBack,WeekLength,oWeekMA);
  22.         WeekMA = oWeekMA;
  23.         PlotNumeric("WeekMA",WeekMA);

  24.         MA1 = AverageFC(Close,Length1);
  25.         MA2 = AverageFC(Close,Length2);
  26.         PlotNumeric("MA1",MA1);
  27.         PlotNumeric("MA2",MA2);
  28.        
  29.         If (MA1[1]>WeekMA and MA2[1]>WeekMA)                // 日线短期均线和长期均线均再周线5周期均线之上
  30.         {
  31.                 if (MarketPosition!=1 and MA1[1]>MA2[1])
  32.                 {
  33.                         Buy(Lots,Open);
  34.                 }
  35.                 if (MarketPosition==1 and MA1[1]<MA2[1])
  36.                 {
  37.                         Sell(Lots,Open);
  38.                 }
  39.         }
  40.         If (MA1[1]<WeekMA and MA2[1]<WeekMA)                // 日线短期均线和长期均线均再周线5周期均线之下
  41.         {
  42.                 if (MarketPosition!=-1 and MA1[1]<MA2[1])
  43.                 {
  44.                         SellShort(Lots,Open);
  45.                 }
  46.                 if (MarketPosition==-1 and MA1[1]>MA2[1])
  47.                 {
  48.                         BuyToCover(Lots,Open);
  49.                 }
  50.         }
  51. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
12#
发表于 2011-6-21 10:12:44 |显示全部楼层
Mtma函数的代码,前面已经提供了。你需要依次编译MtBar、MtMa,然后再编译后面的TestMtMa_V2 。

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
13#
发表于 2011-6-23 22:12:43 |显示全部楼层
本帖最后由 追涨杀跌 于 2011-6-23 22:33 编辑

拖了好几天了,一直没有把跨周期已经完成的几个指标贴上来。致富网友,也提出了很高的要求,我试着来写一写吧。
首先把跨周期的KDJ指标完成,新建函数MtKDJ,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(14);                       
  5.         Numeric SlowLength(3);       
  6.         Numeric SmoothLength(3);
  7.        
  8.         NumericRef oKValue;
  9.         NumericRef oDValue;
  10. Vars
  11.         NumericSeries mtBarCnt;
  12.         NumericSeries mtOpen;
  13.         NumericSeries mtHigh;
  14.         NumericSeries mtLow;
  15.         NumericSeries mtClose;
  16.         NumericSeries mtVol;
  17.         NumericSeries mtOpenInt;
  18.         Numeric refCurBar;
  19.         Numeric refOpen;
  20.         Numeric refHigh;
  21.         Numeric refLow;
  22.         Numeric refClose;
  23.         Numeric refVol;
  24.         Numeric refOpenInt;

  25.         NumericSeries HighestValue;                               
  26.         NumericSeries LowestValue;                                       
  27.         NumericSeries KValue;
  28.         Numeric DValue;
  29.         Numeric i;
  30.         Numeric j(0);
  31.         Numeric SumHLValue(0);
  32.         Numeric SumCLValue(0);
  33.         Numeric sumValue(0);

  34. Begin
  35.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  36.         mtHigh = refHigh;
  37.         mtLow = refLow;
  38.         mtClose = refClose;
  39.        
  40.         HighestValue = mtHigh;
  41.         LowestValue = mtLow;
  42.         For i = 1 to Length-1
  43.         {
  44.                 j = j + mtBarCnt[j];
  45.                 If (mtHigh[j] == InvalidNumeric) HighestValue = InvalidNumeric;
  46.                 Else If ( mtHigh[j] > HighestValue) HighestValue = mtHigh[j];
  47.                 If (mtLow[j] == InvalidNumeric) LowestValue = InvalidNumeric;
  48.                 Else If ( mtLow[j] < LowestValue) LowestValue = mtLow[j];
  49.         }

  50.         j = 0;
  51.         For i = 1 to SlowLength
  52.         {
  53.                 If (mtClose[j] == InvalidNumeric)
  54.                 {
  55.                         SumHLValue = 0;     //InvalidNumeric;
  56.                         SumCLValue = 0;     //InvalidNumeric;
  57.                 }
  58.                 Else
  59.                 {
  60.                         SumCLValue = SumCLValue + mtClose[j] - LowestValue[j];
  61.                         SumHLValue = SumHLValue + HighestValue[j] - LowestValue[j];
  62.                         j = j + mtBarCnt[j];
  63.                 }
  64.         }

  65.         If (SumHLValue <> 0)
  66.         {
  67.                 KValue = SumCLValue/SumHLValue*100;
  68.         }Else
  69.         {
  70.                 KValue = 0;
  71.         }

  72.         j = 0;
  73.         For i = 1 to SmoothLength
  74.         {
  75.                 If (KValue[j] == InvalidNumeric) SumValue = 0;     //InvalidNumeric;
  76.                 Else
  77.                 {
  78.                         SumValue = SumValue + KValue[j];
  79.                         j = j + mtBarCnt[j];
  80.                 }
  81.         }
  82.         DValue = SumValue/SmoothLength;

  83.         oKValue = KValue;
  84.         oDValue = DValue;
  85.         return mtBarCnt;
  86. End
复制代码
然后和往常一样,写个调用的例子,新建公式应用TestMtKdj,随便在日线以下的时间周期中使用,参数为1440,表示求日线KDJ,根据日线KDJ,金叉买入,死叉卖出,不管交叉发生的位置。代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 日线
  3.         Numeric BarsBack(1);        // 求前一日的值
  4.         Numeric Length(14);                       
  5.         Numeric SlowLength(3);       
  6.         Numeric SmoothLength(3);
  7.         Numeric Lots(1);
  8. Vars
  9.         NumericSeries KValue;
  10.         NumericSeries DValue;
  11.         Numeric ooKValue;
  12.         Numeric ooDValue;
  13.         Numeric PreBar;
  14. Begin
  15.         PreBar = MtKDJ(TimeFrame,BarsBack,Length,SlowLength,SmoothLength,ooKValue,ooDValue);
  16.         KValue = ooKValue;
  17.         DValue = ooDValue;

  18.         PlotNumeric("K",KValue);
  19.         PlotNumeric("D",DValue);
  20.         PlotNumeric("J",3*KValue - 2*DValue);
  21.         PlotNumeric("Ref1",20);
  22.         PlotNumeric("Ref2",80);

  23.         If (KValue[PreBar] < DValue[PreBar] and KValue>DValue)
  24.         {
  25.                 Buy(Lots,Open);
  26.         }
  27.         If (KValue[PreBar] > DValue[PreBar] and KValue<DValue)
  28.         {
  29.                 SellShort(Lots,Open);
  30.         }
  31. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
14#
发表于 2011-6-23 22:40:38 |显示全部楼层
继续。。。跨周期BOLL线指标,新建函数MtBoll,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(20);                       
  5.         Numeric Offset(2);
  6.         NumericRef oUpLine;                        // 上轨
  7.         NumericRef oDownLine;                // 下轨
  8.         NumericRef oMidLine;                // 中轨
  9. Vars
  10.         NumericSeries mtBarCnt;
  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.         Numeric tempBand;

  20.         Numeric SumValue(0);
  21.         Numeric i;
  22.         Numeric j(0);
  23.         Numeric SumSqr(0);
  24.         Numeric VarPSValue;

  25.        
  26. Begin
  27.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  28.         mtClose = refClose;

  29.         For i = 1 to Length
  30.         {
  31.                 If (mtClose[j] == InvalidNumeric) SumValue = InvalidNumeric;
  32.                 Else
  33.                 {
  34.                         SumValue = SumValue + mtClose[j];
  35.                         j = j + mtBarCnt[j];
  36.                 }
  37.         }

  38.         oMidLine = SumValue/Length;

  39.         If(Length > 1)
  40.         {
  41.                 j = 0;
  42.                 for i = 0 to Length - 1
  43.                 {
  44.                         SumSqr = SumSqr + Sqr( mtClose[j] - oMidLine ) ;
  45.                         j = j + mtBarCnt[j];
  46.                 }
  47.                 VarPSValue = SumSqr / (Length - 1) ;
  48.         }Else
  49.         {
  50.                 VarPSValue = 0;
  51.         }

  52.         tempBand = iif(VarPSValue > 0,Sqrt(VarPSValue),0);

  53.         oUpLine = oMidLine + Offset * tempBand;
  54.         oDownLine = oMidLine - Offset * tempBand;
  55.         Return mtBarCnt;
  56. End
复制代码
再写个公式应用的例子,新建公式应用TestMtBoll,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                 // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(20);                       
  5.         Numeric Offset(2);
  6.         Numeric Lots(1);
  7. Vars
  8.         NumericSeries UpLine;                        // 上轨
  9.         NumericSeries DownLine;                        // 下轨
  10.         NumericSeries MidLine;                        // 中轨
  11.         NumericSeries PreBar;
  12.         Numeric UpL;
  13.         Numeric DnL;
  14.         Numeric MdL;
  15. Begin
  16.         PreBar = MtBOLL(TimeFrame,BarsBack,Length,Offset,UpL,DnL,MdL);
  17.         UpLine = UpL;
  18.         DownLine = DnL;
  19.         MidLine = MdL;

  20.         PlotNumeric("UpLine",UpLine);
  21.         PlotNumeric("DownLine",DownLine);
  22.         PlotNumeric("MidLine",MidLine);
  23.        
  24.         If ( MarketPosition != 1 and Close[1]>MidLine[1] and UpLine[1]>UpLine[PreBar] and MidLine[1]>MidLine[PreBar])
  25.         {
  26.                 Buy(Lots,Open);
  27.         }
  28.         If ( MarketPosition !=-1 and Close[1]<MidLine[1] and DownLine[1]<DownLine[PreBar] and MidLine[1]<MidLine[PreBar])
  29.         {
  30.                 SellShort(Lots,Open);
  31.         }
  32. End
复制代码

使用道具 举报

Rank: 10Rank: 10Rank: 10

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

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
18#
发表于 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: 10Rank: 10Rank: 10

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

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

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

使用道具 举报

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

bottom

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

GMT+8, 2024-5-9 06:39

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部