开拓者期货期权程序化系统交易论坛

标题: 跨周期数据转换函数以及跨周期技术指标调用的实现 [打印本页]

作者: 追涨杀跌    时间: 2011-6-8 16:55:08     标题: 跨周期数据转换函数以及跨周期技术指标调用的实现

本帖最后由 追涨杀跌 于 2011-12-26 14:17 编辑

TB的跨周期调用,以前已经有一些解决方案。但总体来说,使用还不够方便。以前的帖子中Nopain曾提出过一个算法,非常精巧。最近在这个算法的基础上, 把整个实现方法完善了一下。下面把总体思路和函数代码贴出来,请大家试用,也欢迎大家提出修改意见。

总体思路:
1、小周期调用大周期的数据;
2、具体方法是新编一个函数,用来根据小周期下的数据推算出大周期的BAR数据,为了省事,计算时,会将大周期下的开高低收以及成交量和持仓量等数据都算出来,然后将这些数据通过引用参数返回。当然有的朋友可能只需要一个收盘价就可以了,那样的话,可以自行修改这个函数,把多余的数据去掉;
3、返回的大周期数据将以序列变量的形式保留在对应的小周期K线上,以便以后调用;
4、另外为了便于大周期的数据计算出来后的回溯使用,函数会将小周期下当前BAR到大周期下的前一个BAR的最后一个小周期BAR需要回溯的BAR数目,作为函数的结果返回。这句话,不容易描述清楚,估计大家听起来也费力,但没关系,后面用例子来解释,知道这回事就行了。
5、另外还增加了一个返回值(也是通过引用参数返回),表示的是当前小周期K线对应的大周期K线在整个大周期中的索引值。举例来说,5分钟图,样本数300,那转换成30分钟周期图,总共应该是50根K线,那最新一根5分钟图对应的30分钟K线在整个30分钟图中的索引值就应该是49(类似CurrentBar 0-49);

好,其他先不废话,把代码贴出来,再举几个例子。

新建用户函数MtBar, 返回值为数值类型,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);   
  3.         // 目标时间周期:月线=40320,周线=10080,日线=1440,4小时线=240
  4.         // 其他1小时内的周期等于相应的分钟数,如:1小时=60, 30分钟=30。。。
  5.         // 支持不规则分钟数,如3分钟,8分钟,之类都行
  6.         
  7.         Numeric BarsBack(1);
  8.         // 目标时间周期BAR偏移:
  9.         // 1--表示将目标时间周期下的前1根K线数据作为与当前Bar对应的目标时间周期下的K线数据
  10.         // 0--表示将目标时间周期下的截止到目前为止的数据转换为与当前BAR对应的目标时间周期下K线数据
  11.         
  12.         NumericRef oCurBar;                 // 目标时间周期下的Bar索引
  13.         NumericRef oOPenHT;         // 目标时间周期下的开盘价
  14.         NumericRef oHighHT;         // 目标时间周期下的最高价
  15.         NumericRef oLowHT;          // 目标时间周期下的最低价
  16.         NumericRef oCloseHT;        // 目标时间周期下的收盘价
  17.         NumericRef oVolHT;          // 目标时间周期下的成交量
  18.         NumericRef oOpenIntHT;      // 目标时间周期下的持仓量

  19. Vars
  20.         NumericSeries barCnt;
  21.         NumericSeries CurBar;
  22.         NumericSeries barCntSum;
  23.         NumericSeries OpenHT;
  24.         NumericSeries HighHT;
  25.         NumericSeries LowHT;
  26.         NumericSeries CloseHT;
  27.         NumericSeries VolHT;
  28.         NumericSeries OpenIntHT;
  29.         Numeric CurTime;
  30.         Numeric PreTime;
  31.         bool condition(false);
  32.         Numeric i;
  33. Begin
  34.         If (TimeFrame == 40320)                 // 月线
  35.         {
  36.                 CurTime = Month;
  37.                 PreTime = Month[1];
  38.         }
  39.         Else If (TimeFrame == 10080)                        // 周线
  40.         {
  41.                 CurTime = IntPart(DateDiff(19700105,Date)/7);
  42.                 PreTime = IntPart(DateDiff(19700105,Date[1])/7);
  43.         }
  44.         Else                                                                        // 其他时间周期
  45.         {
  46.                 CurTime = IntPart((DateDiff(19700105,date)*1440 + Hour*60 + Minute)/TimeFrame);
  47.                 PreTime = IntPart((DateDiff(19700105,date[1])*1440 + Hour[1]*60 + Minute[1])/TimeFrame);
  48.         }
  49.         condition = CurTime != PreTime;

  50.         If (CurrentBar==0)                // 如果是第一根Bar, CurBar=0
  51.         {
  52.                 barCnt = 0;
  53.                 CurBar = 0;
  54.                 OpenHT = Open;
  55.                 HighHT = High;
  56.                 LowHT = Low;
  57.                 CloseHT = Close;
  58.                 VolHT = Vol;
  59.                 OpenIntHT = OpenInt;
  60.         }
  61.         Else
  62.         {
  63.                 If(Condition)               
  64.                 // 如果在目标周期下,属于另一根K线,则CurBar加1
  65.                 {
  66.                         barCnt = 1;
  67.                         CurBar = CurBar[1] + 1;
  68.                         OpenHT = Open;
  69.                         HighHT = High;
  70.                         LowHT = Low;
  71.                         VolHT = Vol;
  72.                 }Else
  73.                 // 如果在目标周期下,属于同一根K线,则CurBar不变,但最高价和最低价要记录价格的变化,成交量要累加
  74.                 {
  75.                         barCnt = barCnt[1] + 1;
  76.                         CurBar = CurBar[1];
  77.                         OpenHT = OpenHT[1];
  78.                         HighHT = Max(HighHT[1],High);
  79.                         LowHT = Min(LowHT[1],Low);
  80.                         VolHT = VolHT[1] + Vol;
  81.                 }
  82.                 // 收盘价和持仓量总是取最新值
  83.                 CloseHT = Close;
  84.                 OpenIntHT = OpenInt;
  85.         }
  86.         
  87.         // 上面的程序,在每根小周期的K线上,记录了它所属的大时间周期下的开高低收等值的变化。
  88.         // 接下来,要把在大的时间周期级别上,属于同一根K线的开高低收这些数据,记录在这一组小周期K线的最后一根上。
  89.         barCntSum = barCnt ;
  90.         If(BarsBack == 0)
  91.         // 如果Bar偏移参数为0,则取每根小周期K线上保留的大时间周期截止到这根小周期K线为止的BAR数据
  92.         {
  93.                 barCntSum = 0 ;
  94.         }Else If(BarsBack == 1)
  95.         // 如果Bar偏移参数为1,则取大时间周期的上一根K线的BAr数据
  96.         {
  97.                 barCntSum = barCnt ;
  98.         }Else
  99.         // 如果BAR偏移参数为其他,则取大时间周期的指定偏移后的那根K线的BAR数据
  100.         {
  101.                 For i = 2 To BarsBack
  102.                 {
  103.                         barCntSum = barCntSum + barCnt[barCntSum];
  104.                 }
  105.         }

  106.         // 最后将相应的K线数据作为引用参数返回
  107.         oCurBar = CurBar;
  108.         oOpenHT = OpenHT[barCntSum];
  109.         oHighHT = HighHT[barCntSum];
  110.         oLowHT = LowHT[barCntSum];
  111.         oCloseHT = CloseHT[barCntSum];
  112.         oVolHT = VolHT[barCntSum];
  113.         oOpenIntHT = OpenIntHT[barCntSum];
  114.         Return barCnt;
  115. End
复制代码

作者: 追涨杀跌    时间: 2011-6-8 17:16:25

忘了说一句,以上代码是在TB V4中编写与调试的。

接下来,我们来实现跨周期的求和函数MtSummation,上面的函数中特地返回了一个值oCurBar,就是我上面提到的大周期下的BAR索引值,就是想为实现MtSummationFC留下的伏笔,等以后有时间再解决。现在先还是用最笨的循环累加的算法。
  1. Params
  2.         NumericSeries Price(1);
  3.         NumericSeries BarCnt(0);
  4.         Numeric Length(10);
  5. Vars
  6.         NumericSeries SumValue(0);
  7.         Numeric i;
  8.         Numeric j(0);
  9. Begin
  10.         SumValue = 0;
  11.         For i = 1 to Length
  12.         {
  13.                 If (Price[j] <> InvalidNumeric)
  14.                 {
  15.                         SumValue = SumValue + Price[j];
  16.                         j = j + BarCnt[j];
  17.                 }
  18.                 else Break;
  19.         }
  20.         Return SumValue;
  21. End
复制代码

作者: 追涨杀跌    时间: 2011-6-8 17:22:36

接下来,就可以实现计算跨周期简单移动平均的函数MtMa。
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(10);                        // 均线周期
  5.         NumericRef oMA;             // 以目标时间周期下的K线数据计算出的移动平均线
  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.        
  17.         Numeric SumValue(0);
  18.         Numeric i;
  19.         Numeric j(0);
  20. Begin
  21.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  22.         mtClose = refClose;

  23.         SumValue = MtSummation(mtClose,mtBarCnt,Length);
  24.         oMA = SumValue/Length;
  25.         Return mtBarCnt;
  26. End
复制代码

作者: 追涨杀跌    时间: 2011-6-8 17:51:14

现在可以举个例子来说明,怎么用上面的几个函数来做交易策略了。假如我们的策略如下:
1、我们以日线的均线交叉来判断大趋势,然后在5分钟图上来做交易;
2、日线的短期均线上穿长期均线,则只做多,不做空;反之只做空,不做多;
3、确定了大趋势后,我们再根据5分钟图来判断小趋势,以决定进场时机。我们仍然用均线来判断,在多头大趋势下,如果5分钟的短期均线上穿长期均线,则进场做多,反穿出场,但不反手做空;在空头大趋势下,类似;
我们在5分钟图上调用刚才的函数的来实现。新建公式应用TestMtMa,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                // 目标时间周期BAR偏移参数,说明见MtBar函数

  4.         Numeric Length1(10);                // 大周期的短期均线周期               
  5.         Numeric Length2(20);                // 大周期的长期均线周期
  6.         Numeric Length3(10);                // 小周期的短期均线周期
  7.         Numeric Length4(20);                // 小周期的长期均线周期
  8.         Numeric Lots(1);
  9. Vars
  10.         NumericSeries MA1;
  11.         NumericSeries MA2;
  12.         Numeric oMA1;
  13.         Numeric oMA2;

  14.         NumericSeries MA3;
  15.         NumericSeries MA4;
  16. Begin
  17.         MtMa(TimeFrame,BarsBack,Length1,oMA1);
  18.         MA1 = oMA1;
  19.         PlotNumeric("MA1",MA1);
  20.         MtMa(TimeFrame,BarsBack,Length2,oMA2);
  21.         MA2 = oMA2;
  22.         PlotNumeric("MA2",MA2);
  23.         MA3 = AverageFC(Close,Length3);
  24.         MA4 = AverageFC(Close,Length4);
  25.         PlotNumeric("MA3",MA3);
  26.         PlotNumeric("MA4",MA4);
  27.        
  28.        
  29.         If (MA1>MA2)                // 大周期均线金叉,多头趋势
  30.         {
  31.                 if (MarketPosition!=1 and MA3[1]>MA4[1])
  32.                 {
  33.                         Buy(Lots,Open);
  34.                 }
  35.                 if (MarketPosition==1 and MA3[1]<MA4[1])
  36.                 {
  37.                         Sell(Lots,Open);
  38.                 }
  39.         }
  40.         If (MA1<MA2)                // 大周期均线死叉,空头趋势
  41.         {
  42.                 if (MarketPosition!=-1 and MA3[1]<MA4[1])
  43.                 {
  44.                         SellShort(Lots,Open);
  45.                 }
  46.                 if (MarketPosition==-1 and MA3[1]>MA4[1])
  47.                 {
  48.                         BuyToCover(Lots,Open);
  49.                 }
  50.         }
  51. End
复制代码

作者: 追涨杀跌    时间: 2011-6-8 17:53:29

如果上面的策略,我们不想用日线均线来判断大趋势,而改用小时线来判断,则只要将参数TimeFrame改为60, 就可以了。
作者: 道勤    时间: 2011-6-12 20:25:09

本帖最后由 道勤 于 2011-6-12 20:58 编辑

很好很强大,慢慢学习。   使用起来非常方便啊,只要修改时间参数就行了,十分感谢!!
作者: haomai01    时间: 2011-6-13 01:23:20

请问怎么在小时K线调用DMI的指标
作者: haomai01    时间: 2011-6-13 01:23:53

请问怎么在小时K线调用日线DMI的指标
作者: 追涨杀跌    时间: 2011-6-13 01:40:52

谢谢道勤的鼓励! 继续把其他几个常用指标的跨周期函数贴出来。
新建MtMacd函数,代码如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric FastLength(12);
  5.         Numeric SlowLength(26);
  6.         Numeric MACDLength(9);
  7.        
  8.         NumericRef oMACDValue;      // 以目标时间周期下的K线数据计算出的MACDValue
  9.         NumericRef oAvgMACD;        // 以目标时间周期下的K线数据计算出的AvgMACD

  10. Vars
  11.         NumericSeries mtBarCnt;
  12.         NumericSeries mtCurBar;
  13.         NumericSeries mtClose;
  14.         Numeric refCurBar;
  15.         Numeric refOpen;
  16.         Numeric refHigh;
  17.         Numeric refLow;
  18.         Numeric refClose;
  19.         Numeric refVol;
  20.         Numeric refOpenInt;
  21.        
  22.         NumericSeries MACDValue;
  23.         NumericSeries AvgMACD;
  24.         Numeric sFcactor;
  25.         NumericSeries XAvgValue1;
  26.         NumericSeries XAvgValue2;
  27.        
  28. Begin

  29.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  30.         mtCurBar = refCurBar;
  31.         mtClose = refClose;
  32.        
  33.         sFcactor = 2 / ( FastLength + 1 );
  34.         if (MtCurBar == 0 || XAvgValue1[mtBarCnt] == InvalidNumeric) XAvgValue1 = mtClose;
  35.         else XAvgValue1 = XAvgValue1[mtBarCnt] + sFcactor * ( mtClose - XAvgValue1[mtBarCnt] ) ;

  36.         sFcactor = 2 / ( SlowLength + 1 );
  37.         if (MtCurBar == 0 || XAvgValue2[mtBarCnt] == InvalidNumeric) XAvgValue2 = mtClose;
  38.         else XAvgValue2 = XAvgValue2[mtBarCnt] + sFcactor * ( mtClose - XAvgValue2[mtBarCnt] ) ;

  39.         MACDValue = XAvgValue1 - XAvgValue2;

  40.         sFcactor = 2 / ( MACDLength + 1 );
  41.         if (MtCurBar == 0 || AvgMACD[mtBarCnt] == InvalidNumeric) AvgMACD = MACDValue;
  42.         else AvgMACD = AvgMACD[mtBarCnt] + sFcactor * ( MACDValue - AvgMACD[mtBarCnt] ) ;

  43.         oMACDValue = MACDValue;
  44.         oAvgMACD = AvgMACD;
  45.         return mtBarCnt;
  46. End
复制代码

作者: 追涨杀跌    时间: 2011-6-13 01:57:13

编译好上面的MtMacd函数后,以后就可以随时通过调用这个函数来显示跨周期的MACD指标,以及在小周期上根据大周期的MACD指标进行交易,下面继续举个例子,也是在V4中实现,把指标和交易指令放在一个公式应用中,注意要在“属性设置”中,设置成“子图显示”。这次简单点,没有做成多周期共振,只是简单地在5分钟图表上,根据30分钟的MACD指标交叉来进行交易,代码如下:
  1. Params
  2.         Numeric TimeFrame(30);                // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                 // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric FastLength(12);
  5.         Numeric SlowLength(26);
  6.         Numeric MACDLength(9);
  7.     Numeric Lots(1);
  8. Vars
  9.         NumericSeries MACDValue;
  10.         NumericSeries AvgMACD;
  11.         NumericSeries MACDDiff;
  12.         Numeric ooMACDValue;
  13.         Numeric ooAvgMACD;
  14.         Numeric PreBar;
  15. Begin
  16.         PreBar = MtMACD(TimeFrame,BarsBack,FastLength,SlowLength,MACDLength,ooMACDValue,ooAvgMACD);
  17.         MACDVAlue = ooMACDValue;
  18.         AvgMACD = ooAvgMACD;
  19.         MACDDiff = MACDValue - AvgMACD;

  20.         PlotNumeric("MACD",MACDValue);
  21.         PlotNumeric("MACDAvg",AvgMACD);
  22.         If (MACDDiff >= 0)       
  23.                 PlotNumeric("MACDDiff",MACDDiff,0,Red);
  24.         Else
  25.                 PlotNumeric("MACDDiff",MACDDiff,0,Green);
  26.         PlotNumeric("零线",0);

  27.         If (MacdDiff[PreBar]<0 and MacdDiff>0)
  28.         {
  29.                 Buy(Lots,Open);
  30.         }
  31.         If (MacdDiff[PreBar]>0 and MacdDiff<0)
  32.         {
  33.                 SellShort(Lots,Open);
  34.         }
  35. End
复制代码

作者: 追涨杀跌    时间: 2011-6-13 01:59:55

回复 9# haomai01

跨周期的DMI指标,我随后就会贴上来,用法类似。按你的需求,只需要在小时图上调用,参数设成1440即可。
作者: 追涨杀跌    时间: 2011-6-13 02:10:32

先满足haomai01朋友的需要, 把跨周期DMI函数先贴出来。函数名MtDMI
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);                 // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(14);
  5.         NumericRef oDMIPlus;
  6.         NumericRef oDMIMinus;
  7.         NumericRef oADX;
  8. Vars
  9.         NumericSeries mtBarCnt;
  10.         NumericSeries mtHigh;
  11.         NumericSeries mtLow;
  12.         NumericSeries mtClose;
  13.         Numeric refCurBar;
  14.         Numeric refOpen;
  15.         Numeric refHigh;
  16.         Numeric refLow;
  17.         Numeric refClose;
  18.         Numeric refVol;
  19.         Numeric refOpenInt;

  20.         NumericSeries DMIPlus;
  21.         NumericSeries DMIMinus;
  22.         NumericSeries DMI;
  23.         NumericSeries ADX;
  24.         NumericSeries ADXR;
  25.         NumericSeries Volty;
  26.         NumericSeries sDMI;
  27.         NumericSeries sADX;
  28.         NumericSeries sVolty;
  29.         Numeric PlusDM;
  30.         Numeric MinusDM;
  31.         Numeric UpperMove;
  32.         Numeric LowerMove;
  33.         Numeric SumPlusDM(0);
  34.         Numeric SumMinusDM(0);
  35.         Numeric SumTR(0);
  36.         NumericSeries AvgPlusDM;
  37.         NumericSeries AvgMinusDM;
  38.         Numeric SF;                        // smoothing factor
  39.         Numeric Divisor;
  40.         BoolSeries bStopLoop;
  41.         Numeric i;
  42.         Numeric j(0);
  43.         Numeric K;
  44.         Numeric nbHigh;
  45.         NumericSeries TRValue;
  46.         Numeric CumValue(0);
  47. Begin
  48.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  49.         mtHigh = refHigh;
  50.         mtLow = refLow;
  51.         mtClose = refClose;
  52.        
  53.         SF = 1/Length;

  54.         TRValue = IIF(mtHigh >= mtClose[mtBarCnt],mtHigh,mtClose[mtBarCnt]) - IIF(mtLow <= mtClose[mtBarCnt],mtLow,mtClose[mtBarCnt]);

  55.         bStopLoop = bStopLoop[1];
  56.         If (bStopLoop!=true)
  57.         {
  58.                 j = 0;
  59.                 For i = 0 to Length
  60.                 {
  61.                         If (mtHigh[j] == InvalidNumeric)
  62.                         {
  63.                                 nbHigh = InvalidNumeric;
  64.                                 i = Length + 1;
  65.                         }
  66.                         Else
  67.                         {
  68.                                 nbHigh = mtHigh[j];
  69.                                 j = j + mtBarCnt[j];
  70.                         }
  71.                 }
  72.                 if(nbHigh!=InvalidNumeric and mtHigh[j] != InvalidNumeric) bStopLoop = true;
  73.         }
  74.         If(nbHigh == InvalidNumeric)
  75.         {
  76.                 DMIPlus = InvalidNumeric;
  77.                 DMIMinus = InvalidNumeric;
  78.                 DMI = InvalidNumeric;
  79.                 ADX = InvalidNumeric;
  80.                 ADXR = InvalidNumeric;
  81.                 Volty = InvalidNumeric;
  82.                 //RSIValue = InvalidNumeric;
  83.         }Else
  84.         {
  85.                 If(bStopLoop !=true)
  86.                 {
  87.                         j = 0;
  88.                         K = 0;
  89.                         For i = 1 To Length
  90.                         {
  91.                                 j = K + mtBarCnt[K];

  92.                                 PlusDM = 0 ;
  93.                                 MinusDM = 0 ;
  94.                                 UpperMove = High[K] - High[j] ;
  95.                                 LowerMove = Low[j] - Low[K] ;
  96.                                 if (UpperMove > LowerMove and UpperMove > 0 )
  97.                                 {
  98.                                         PlusDM = UpperMove;
  99.                                 }else if (LowerMove > UpperMove and LowerMove > 0)
  100.                                 {
  101.                                         MinusDM = LowerMove ;
  102.                                 }
  103.                                 SumPlusDM = SumPlusDM + PlusDM ;
  104.                                 SumMinusDM = SumMinusDM + MinusDM ;
  105.                                 SumTR = SumTR + TRValue[K] ;

  106.                                 K = j ;
  107.                         }
  108.                         AvgPlusDM = SumPlusDM / Length ;
  109.                         AvgMinusDM = SumMinusDM / Length ;
  110.                         sVolty = SumTR / Length ;
  111.                 }
  112.                 Else
  113.                 {
  114.                         PlusDM = 0 ;
  115.                         MinusDM = 0 ;
  116.                         UpperMove = mtHigh - mtHigh[mtBarCnt] ;
  117.                         LowerMove = mtLow[mtBarCnt] - mtLow ;
  118.                         if (UpperMove > LowerMove and UpperMove > 0 )
  119.                         {
  120.                                 PlusDM = UpperMove;
  121.                         }else if (LowerMove > UpperMove and LowerMove > 0 )
  122.                         {
  123.                                 MinusDM = LowerMove ;
  124.                         }
  125.                         AvgPlusDM = AvgPlusDM[mtBarCnt] + SF * ( PlusDM - AvgPlusDM[mtBarCnt] ) ;
  126.                         AvgMinusDM = AvgMinusDM[mtBarCnt] + SF * ( MinusDM - AvgMinusDM[mtBarCnt] ) ;
  127.                         sVolty = sVolty[mtBarCnt] + SF * ( TRValue  - sVolty[mtBarCnt] ) ;
  128.                 }

  129.                 if (sVolty > 0)
  130.                 {
  131.                         DMIPlus = 100 * AvgPlusDM / sVolty ;
  132.                         DMIMinus = 100 * AvgMinusDM / sVolty ;
  133.                 }else
  134.                 {
  135.                         DMIPlus = 0 ;
  136.                         DMIMinus = 0 ;
  137.                 }

  138.                 Divisor = DMIPlus + DMIMinus ;
  139.                 if (Divisor > 0)
  140.                 {
  141.                         sDMI = 100 * Abs( DMIPlus - DMIMinus ) / Divisor;
  142.                 }else
  143.                 {
  144.                         sDMI = 0 ;
  145.                 }

  146.                 if (bStopLoop != true)
  147.                 {
  148.                         K = 0;
  149.                         j = 0;
  150.                         For i = 0 To Length - 1
  151.                         {
  152.                                 CumValue = CumValue + sDMI[K];
  153.                                 j = K + mtBarCnt[K];
  154.                                 If (mtHigh[j] != InvalidNumeric) K = j;
  155.                                 else
  156.                                 {
  157.                                         j = i;
  158.                                         i = Length + 1;
  159.                                 }
  160.                         }
  161.                         sADX = CumValue / j ;
  162.                         ADXR = ( sADX + sADX[ K-1 ] ) * 0.5 ;
  163.                 }else  
  164.                 {
  165.                         sADX = sADX[mtBarCnt] + SF * ( sDMI - sADX[mtBarCnt] ) ;
  166.                         j = 0;
  167.                         For i = 0 To Length-1
  168.                         {
  169.                                 j = j + mtBarCnt[j];
  170.                         }
  171.                         ADXR = ( sADX + sADX[ j ] ) * 0.5 ;
  172.                 }
  173.                 Volty = sVolty;
  174.                 DMI = sDMI;
  175.                 ADX = sADX;

  176.         }
  177.         oDMIPlus = DMIPlus;
  178.         oDMIMinus = DMIMinus;
  179.         oADX = ADX;
  180.         return mtBarCnt;
  181. End
复制代码

作者: 追涨杀跌    时间: 2011-6-13 02:12:39

同样举个例子。公式应用TestMtDMI
  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.        
  8. Vars
  9.         NumericSeries DMIPlus;
  10.         NumericSeries DMIMinus;
  11.         NumericSeries ADX;
  12.         NumericSeries PreBar;

  13.         Numeric DPlus;
  14.         Numeric DMinus;
  15.         Numeric tADX;

  16. Begin
  17.         PreBar = MtDMI(TimeFrame,BarsBack,Length,DPLus,DMinus,tADX);
  18.         DMIPlus = DPlus;
  19.         DMIMinus = DMinus;
  20.         ADX = tADX;

  21.         PlotNumeric( "DMI+" ,DMIPlus);
  22.         PlotNumeric( "DMI-" ,DMIMinus);
  23.         PlotNumeric( "ADX" ,ADX);
  24.        
  25.         If ( MarketPosition != 1 and DMIPlus>DMIMinus and DMIPlus[PreBar]<DMIMinus[PreBar])
  26.         {
  27.                 Buy(Lots,Open);
  28.         }
  29.         If ( MarketPosition !=-1 and DMIPlus<DMIMinus and DMIPlus[PreBar]>DMIMinus[PreBar])
  30.         {
  31.                 SellShort(Lots,Open);
  32.         }
  33. End
复制代码
在小时图上插入该公式应用即可,参数默认我就是日线1440,如需其他周期,直接改参数就可
作者: haomai01    时间: 2011-6-13 12:00:20

绝对的大侠风范,写代码高手啊!崇拜啊!水平高的也许很多,但是难得有追涨杀跌这样急网友所急!谢谢了!
作者: hugh1982    时间: 2011-6-17 13:35:00

给写一个5日交易10的金叉死叉的,调用周线周期,第一要满足5叉10,又要满足在周线的5日均线以上
作者: 追涨杀跌    时间: 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
复制代码

作者: freetiger    时间: 2011-6-20 13:29:38

本帖最后由 freetiger 于 2011-6-20 15:20 编辑

多谢追涨杀跌的分享!
编译TestMtMa时通不过:函数[MtMa]没有被声明,C0134,行26
作者: 追涨杀跌    时间: 2011-6-21 10:12:44

Mtma函数的代码,前面已经提供了。你需要依次编译MtBar、MtMa,然后再编译后面的TestMtMa_V2 。
作者: 追涨杀跌    时间: 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
复制代码

作者: 追涨杀跌    时间: 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
复制代码

作者: 追涨杀跌    时间: 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
复制代码

作者: 追涨杀跌    时间: 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
复制代码

作者: 追涨杀跌    时间: 2011-6-24 17:11:50

TB没有在屏幕右上角显示内容的函数。您可以用plotString在当前BAr输出字符串,但要显示您说的那么多,呵呵,恐怕效果非常恐怖。对于程序化交易来说,我倒不认为需要显示那么多指标的信息,直接根据这些信息发出买卖指令不是更直接吗
作者: haomai01    时间: 2011-6-25 12:39:30

请问能不能再帮忙再写个跨周期的ATR,另外系统内置的ATR真实区间跟海龟的描述是不一样的,系统内置的是H-L,没有包括跳空,而海龟是取MAX(H-L,H-REFC,REFC-L)
作者: beijib    时间: 2011-6-27 10:55:33

大侠啊,真是强
收藏了
作者: 追涨杀跌    时间: 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
复制代码

作者: a_gou    时间: 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分钟之内的啊!

请指教!
作者: kevinwimax    时间: 2011-7-4 10:32:34

老师,你好,我根据你写的小周期数据换成大周期数据测试了下,编译不通过啊。
  Return barCnt;

显示 Return 语句的返回类型与公式定义的返回类型值类型不符。
请教下,是什么问题啊。
作者: 追涨杀跌    时间: 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,以此类推。。。这个确实需要一个图表来说明。改天吧
作者: 追涨杀跌    时间: 2011-7-4 18:21:59

老师,你好,我根据你写的小周期数据换成大周期数据测试了下,编译不通过啊。
  Return barCnt;

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

函数的返回值类型为数值型,在模板选择时,选“数值型”
作者: jesseyoung    时间: 2011-7-4 23:55:32

强烈关注此贴
作者: kevinwimax    时间: 2011-7-5 10:32:24

问题已解决,老师能不能贴个跨周期的SAR计算程序啊。
作者: 追涨杀跌    时间: 2011-7-5 14:04:01

问题已解决,老师能不能贴个跨周期的SAR计算程序啊。


接受你的任务,不过可能需要些时日,耐心等一下
作者: kevinwimax    时间: 2011-7-7 14:14:53

回复 39# 追涨杀跌


    又发现一个问题,我是在5分钟线上调用1小时线,这样一来转换出来的情况是 9点-10点是9根,10-11点是12根,11:00-11:30是6根,1:00-2:00是12根,2:00-3:00是12根, 3:00-3:15是3根
  可我需要根据小时线去做比较,比如这个小时的小时图跟上个小时的小时图的比较,这样的话,很难实现比较啊,而且每个小时的数据量都不同啊
谁能帮我解答下.多谢!
作者: 读书山林    时间: 2011-7-7 15:36:13

比如针对在5分钟取60分钟数据,假设5分钟与60分钟都从第一个bar开始计算:
5分钟的12个bar对应60分钟一个bar;
5分钟的的第一个bar的开盘价对应60分钟第一个bar的开盘价,5分钟第12个bar的收盘价对应60分钟第一个bar的收盘价;
   跨周期的数据处理有两种情况,以5分钟跨期引用60分钟的双均线为例

第一种是:一种函数运算方法和数据库引用类似,在5分钟第一个bar就引用了5分钟第12个bar的收盘价,即对应的60分钟的收盘价,实际上引用了未来数据来判断行情;
以双均线为例,5分钟的12个bar内双均线可能反复交叉,但是只要第12个bar即60分钟的收盘价,使得均线为多头排列,那么中间的交叉在历史测试中式看不出来的,但是实盘中是会存在的。

第二种情况:以5分钟的12个bar中每一个bar的收盘价判断引用的60分钟的均线多空头排列情况,这样即使在这12个bar中,均线会来回交叉,但是可以被记录下来的可以在历史测试中看到,这就相当于以5分钟为一个报价节把60分钟的行情动态化啦,但是被引用的均线的计算周期数如 ma(close,n)这个n应该是指60分钟周期,但是把60分钟的收盘价分解成了12个,但是计算的周期和效果应该是60分钟的均线

请问追涨杀跌老师,第二种处理方法如何实现 ,2,3,4,5楼帖子中的用户函数是用的哪种处理数据方法
作者: 追涨杀跌    时间: 2011-7-7 17:21:31

这就要用到MtBar函数的返回值了, 比如:
mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
如果你的参数TimeFrame=60的话,你就可以通过这个mtBarCnt的值回溯读到上一个小时线的值,然后再根据那根BAR的mtBarCnt找到再上一个小时的值,就像一根链条,一环扣一环,用循环就可以读到所有的小时线。
请仔细研读一下我所贴的MtSummation函数中For循环部分的代码。你就会明白的
作者: kevinwimax    时间: 2011-7-8 10:03:01

问题已经解决了,老师,跨周期SAR出来了吗?
作者: 追涨杀跌    时间: 2011-7-8 10:42:59

回复 43# kevinwimax

这几天没空,我心里记着这事,您放心。
作者: 追涨杀跌    时间: 2011-7-8 10:57:34

比如针对在5分钟取60分钟数据,假设5分钟与60分钟都从第一个bar开始计算:
5分钟的12个bar对应60分钟一个ba ...
读书山林 发表于 2011-7-7 15:36


我给的例子中,都是用大周期的前一根K线来计算指标的。但实际上MtBar函数中的BarsBack参数如果设置为0,调用MtBar后,小周期K线上保留的大周期数据就是你说的第二种情况。但后面的指标函数中,却没有考虑这个参数为0的情况,所以如果设为0,计算出来的指标会不正常。我这两天正好帮客户写代码碰到了这个问题,我准备把这部分完善一下。但最近确实手头还有好多事,所以,请继续关注这个帖子。
作者: 读书山林    时间: 2011-7-8 12:43:44

我给的例子中,都是用大周期的前一根K线来计算指标的。但实际上MtBar函数中的BarsBack参数如果设置为0,调用MtBar后,小周期K线上保留的大周期数据就是你说的第二种情况。但后面的指标函数中,却没有考虑这个参数为0的情况,所以如果设为0,计算出来的指标会不正常。


也就是说老师给出的指标函数实现的是:第三种情况====用大周期的前一根K线来计算指标。这样以来如果引用的周期数比较大比如日线,事实上是延迟了一个交易日即用上一个交易日的数据做判断,这样以来会比较滞后。
MtBar用户函数中的BarsBack参数如果设置为0是第二种情况,设置为1是第三种情况,这样理解对吗?

还请追涨老师把求和函数 和 均线函数,按第二种情况方式做个范例出来,即引用大周期数据不用再返回大周期的上一个bar的数据,而是根据小周期的每个bar的数据来判断大周期的情况。老师辛苦啦
作者: 追涨杀跌    时间: 2011-7-8 13:27:55

回复 46# 读书山林

你理解得完全正确。我明白你说的意思,既然要完成,我会把前面贴出来的所有指标都用新的方法来做,所以,还是需要一些时间的。
作者: 追涨杀跌    时间: 2011-7-10 00:53:50

也就是说老师给出的指标函数实现的是:第三种情况====用大周期的前一根K线来计算指标。这样以来如果引用 ...
读书山林 发表于 2011-7-8 12:43


今天把MtBar函数和MtMa等函数看了一下,发现前面的回答中,有一些不准确之处。其实将BarsBack参数设置为0 ,就可以实现读书山林朋友所说的第二种情况。因为MtBar函数返回mtBarCnt的值仍是正确的,还是到大周期上一根BAR所需回溯的值。
作者: 读书山林    时间: 2011-7-11 10:15:29

老师,前面的三个函数 只要BarsBack参数设置为0都可以用是吧,请老师再编写一下求指数平均XAverage,和SMA求移动平均,的跨周期函数
作者: CrewsHe    时间: 2011-7-11 13:19:13

强烈关注该贴
作者: freetiger    时间: 2011-7-11 16:11:02

追涨老师能抽空解释一下这两句吗?多谢了!
  1. sFcactor = 2 / ( FastLength + 1 );

  2.         if (MtCurBar == 0 || XAvgValue1[mtBarCnt] == InvalidNumeric) XAvgValue1 = mtClose;

  3.         else XAvgValue1 = XAvgValue1[mtBarCnt] + sFcactor * ( mtClose - XAvgValue1[mtBarCnt] ) ;
复制代码

作者: 追涨杀跌    时间: 2011-7-11 20:17:22

追涨老师能抽空解释一下这两句吗?多谢了!
freetiger 发表于 2011-7-11 16:11


这两句是根据xaverage函数的算法改写的。
        sFcactor = 2 / ( Length + 1 );
        if (CurrentBar == 0 )
        {
                XAvgValue = Price;
        }else
        {
                XAvgValue = XAvgValue[1] + sFcactor * ( Price - XAvgValue[1] ) ;
        }       
因为我们现在计算的是跨周期的Xaverage,所以回溯时,我们大周期的前一根K线不是回溯1,而是要回溯mtBarCnt,这才是大周期上一根K线的位置。CurrentBar也是一样,要用mtCurBar来代替。price要用mtClose来代替。
作者: lanshan    时间: 2011-7-11 20:53:45

向楼主学习,向楼主致敬!
学习楼主的技术,向楼主的服务精神致敬!
作者: kevinwimax    时间: 2011-7-11 22:58:25

唉,老师不理我,很伤心:
作者: 追涨杀跌    时间: 2011-7-11 23:56:51

回复 54# kevinwimax

kevinwimax,最对不住的就是您了,我答应你的跨周期SAR函数还没有完成。虽然这些天很忙,我还是抽了些时间来考虑,可能是我水平不够,呵呵,难度不小啊。还请见谅,容我慢慢啃这块硬骨头
作者: 读书山林    时间: 2011-7-12 09:28:30

追涨老师帮写一下 XAverage,和SMA 函数吧,这两个比较简单的吧
作者: 追涨杀跌    时间: 2011-7-12 11:40:04

回复 56# 读书山林

XAverage的其实已经写了,在MtMACD的实现中,就用到了,当时省得函数调用函数,就直接写里面了,您可以参考一下。回头再把它单独写到MtXaverage中。
作者: 读书山林    时间: 2011-7-12 17:24:31

回复 57# 追涨杀跌


   
追涨老师帮看下MtXAverage函数 写的对吗
  1. //------------------------------------------------------------------------
  2. // 简称: MtXAverage
  3. // 名称: 跨期求指数移动平均(EMA)
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------


  8. Params
  9.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  10.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  11.         Numeric Length(10);


  12. Vars
  13.         NumericSeries mtBarCnt;
  14.         NumericSeries mtCurBar;
  15.         NumericSeries mtClose;
  16.                
  17.         Numeric refCurBar;
  18.         Numeric refOpen;
  19.         Numeric refHigh;
  20.         Numeric refLow;
  21.         Numeric refClose;
  22.         Numeric refVol;
  23.         Numeric refOpenInt;
  24.         
  25.         Numeric sFcactor;
  26.         NumericSeries XAvgValue;
  27.         
  28. Begin

  29.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  30.         mtCurBar = refCurBar; // 目标时间周期下的Bar索引
  31.         mtClose = refClose;   // 目标时间周期下的开盘价
  32.                
  33.                 sFcactor = 2 / ( Length + 1 );
  34.                 if (MtCurBar == 0 || XAvgValue1[mtBarCnt] == InvalidNumeric)
  35.                 {
  36.                         XAvgValue = XAvgValue1 = mtClose;
  37.                 }else
  38.                 {
  39.                         XAvgValue = XAvgValue1[mtBarCnt] + sFcactor * ( mtClose - XAvgValue1[mtBarCnt] ) ;
  40.                 }       
  41.                 Return XAvgValue;

  42. End
复制代码

作者: 读书山林    时间: 2011-7-12 17:28:24

回复 57# 追涨杀跌

有点错误 重新整理了一下
  1. //------------------------------------------------------------------------
  2. // 简称: MtXAverage
  3. // 名称: 跨期求指数移动平均(EMA)
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------


  8. Params
  9.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  10.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  11.         Numeric Length(10);


  12. Vars
  13.         NumericSeries mtBarCnt;
  14.         NumericSeries mtCurBar;
  15.         NumericSeries mtClose;
  16.                
  17.         Numeric refCurBar;
  18.         Numeric refOpen;
  19.         Numeric refHigh;
  20.         Numeric refLow;
  21.         Numeric refClose;
  22.         Numeric refVol;
  23.         Numeric refOpenInt;
  24.         
  25.         Numeric sFcactor;
  26.         NumericSeries XAvgValue;
  27.         
  28. Begin

  29.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  30.         mtCurBar = refCurBar; // 目标时间周期下的Bar索引
  31.         mtClose = refClose;   // 目标时间周期下的开盘价
  32.                
  33.                 sFcactor = 2 / ( Length + 1 );
  34.                 if (MtCurBar == 0 || XAvgValue[mtBarCnt] == InvalidNumeric)
  35.                 {
  36.                         XAvgValue = mtClose;
  37.                 }else
  38.                 {
  39.                         XAvgValue = XAvgValue[mtBarCnt] + sFcactor * ( mtClose - XAvgValue[mtBarCnt] ) ;
  40.                 }       
  41.                 Return XAvgValue;

  42. End
复制代码

作者: 追涨杀跌    时间: 2011-7-12 18:27:53

本帖最后由 追涨杀跌 于 2011-7-12 18:29 编辑

回复 59# 读书山林

写得很正确。 SMA也可以尝试写一下,应该可以的。
作者: 读书山林    时间: 2011-7-12 18:39:46

本帖最后由 追涨杀跌 于 2011-7-12 23:31 编辑

回复 60# 追涨杀跌


    恩 再帮我检查下看SMA 有什么错误吗
  1. //------------------------------------------------------------------------
  2. // 简称: MtSMA
  3. // 名称: 跨期求移动平均
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params
  9.     Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  10.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  11.         Numeric Length(10);
  12.         Numeric Weight(1);
  13. Vars
  14.         NumericSeries mtBarCnt;
  15.         NumericSeries mtCurBar;
  16.         NumericSeries mtClose;
  17.                
  18.         Numeric refCurBar;
  19.         Numeric refOpen;
  20.         Numeric refHigh;
  21.         Numeric refLow;
  22.         Numeric refClose;
  23.         Numeric refVol;
  24.         Numeric refOpenInt;
  25.         
  26.             NumericSeries SMAValue;
  27. Begin

  28.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);// 目标时间周期内小周期Bar的索引
  29.         mtCurBar = refCurBar; // 目标时间周期下的Bar索引
  30.         mtClose = refClose;   // 目标时间周期下的收盘价
  31.                
  32.                 if (MtCurBar == 0 || SMAValue[mtBarCnt] == InvalidNumeric)
  33.                 {
  34.                         SMAValue = mtClose;
  35.                 }else
  36.                 {
  37.                         SMAValue = (SMAValue[mtBarCnt]*(Length-Weight)+mtClose*Weight)/Length;
  38.                 }       
  39.                 Return SMAValue;
  40. End
复制代码

作者: 追涨杀跌    时间: 2011-7-13 11:03:17

回复 61# 读书山林

代码没有问题,谢谢读书山林的热心帮助!!
作者: 读书山林    时间: 2011-7-13 14:47:49

可是把自己的策略跨期写了一下,输出值不对
作者: 读书山林    时间: 2011-7-13 15:09:12

回复 62# 追涨杀跌


    追涨老师把 MtXAverage 和MtSMA 函数中的  数据源 mtClose 直接替换为Price,当Price=一个序列变量的时候可以直接调用吗,源码不用做其他的修改吧
作者: 读书山林    时间: 2011-7-13 16:24:16

回复 62# 追涨杀跌


    我检查了一下 还是MtSMA函数的问题,我写的 SMA 函数 求目标周期的收盘价mtClose 的SMA是没问题,可以一把mtClose 替换为其他序列变量就不可以啦 ,请追涨老师写一个数据源为Price,可以替换为任意序列变量的跨期SMA
作者: 追涨杀跌    时间: 2011-7-13 22:30:26

回复 65# 读书山林

我觉得是不可能写一个数据源为Price,然后任何序列数据替换进去都可以的MtSMA,否则就不是跨周期的SMA函数。这里面的原因就在于,mtClose和普通Close的区别。所以处理上是有区别的
作者: cxwh    时间: 2011-7-14 09:16:02

老大,能否把RSI和SAR的跨周期完成,谢谢!
作者: 读书山林    时间: 2011-7-14 13:20:11

回复 66# 追涨杀跌


    恩 那就只能打包写在一起啦
作者: 读书山林    时间: 2011-7-14 13:39:24

发现一个问题,还请老师帮忙解决一下
   mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
// 目标时间周期内小周期Bar个数的索引
        mtCurBar = refCurBar; // 目标时间周期下的Bar索引
        mtClose = refClose; // 目标时间周期下的收盘价


    关于目标周期数据的回溯会出现错误,如果mtclose,为目标周期的收盘价,往前回溯 1 个数据可以写成 mtclose[mtBarCnt],没有问题,但是如果我的回溯周期是 [N] 的话,则非常难以取值,写成
mtclose[mtBarCnt*N]  的形式 经观察比较输出值错误,请追涨老师解决这个问题,因为很多策略都需要用到大于1 的回溯值
作者: 追涨杀跌    时间: 2011-7-14 15:59:25

本帖最后由 追涨杀跌 于 2011-7-14 16:00 编辑

回复 69# 读书山林

这种就要用循环的方式,可以参考 mtSummation的实现部分。
Params
        NumericSeries Price(1);
        NumericSeries BarCnt(0);
        Numeric Length(10);
Vars
        NumericSeries SumValue(0);
        Numeric i;
        Numeric j(0);
Begin
        SumValue = 0;
        For i = 1 to Length
        {
                If (Price[j] <> InvalidNumeric)
                {
                        SumValue = SumValue + Price[j];
                        j = j + BarCnt[j];
                }
                else Break;
        }

        Return SumValue;
End

最关键的一句就是:j = j + BarCnt[j]
作者: 追涨杀跌    时间: 2011-7-14 16:02:01

老大,能否把RSI和SAR的跨周期完成,谢谢!
cxwh 发表于 2011-7-14 09:16


RSI已经完成,请查看前面的帖子。SAR的麻烦点,再等几天吧。
作者: 读书山林    时间: 2011-7-14 17:39:09

老师给解释一下啊,j = j + BarCnt[j]有点看不明白 ,
要回溯的周期n,和j的 关系又是什么呢,老师给写个回溯周期的函数吧  或者写段代码 作为引用参数返回也行啊
作者: 读书山林    时间: 2011-7-15 11:49:03

根据追涨大侠的提示 看了下代码 ,如果Length 为目标周期下的回溯周期[Length ],应该是求  1 to Length 内 barcnt  的 累计相加求和,因为每个目标周期内的barcnt  不相等 否则直接Length *barcnt   就可以啦
  1. //------------------------------------------------------------------------
  2. // 简称: MTRef
  3. // 名称: 跨期求回溯周期
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params

  9.         NumericSeries BarCnt(0);//目标周期内小周期的bar
  10.         Numeric Length(10);// 目标周期下的回溯周期
  11. Vars

  12.                 NumericSeries mtBarCnt(1);

  13.         Numeric i;
  14.         Numeric j(0);// 与目标周期下的回溯周期 等值的小周期回溯周期值
  15. Begin

  16.         For i = 1 to Length
  17.         {
  18.                 If (mtBarCnt[j] <> InvalidNumeric)
  19.                 {

  20.                         j = j + BarCnt[j];
  21.                 }
  22.                 else Break;
  23.         }
  24.         Return J;
  25. End
复制代码
追涨大侠看看这样写对吗,
作者: 读书山林    时间: 2011-7-15 12:04:21

无效值判断有问题 是直接去掉还是怎么修改
作者: 追涨杀跌    时间: 2011-7-18 18:30:40

本帖最后由 追涨杀跌 于 2011-7-18 18:57 编辑

回复 73# 读书山林

我看了一下,觉得还是写得有点问题,我试着改了一下,你测一下看是不是正确?
  1. //------------------------------------------------------------------------
  2. // 简称: MtRef
  3. // 名称: 跨周期求回溯周期
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------


  8. Params

  9.         NumericSeries mtBarCnt(0);        // MtBar函数返回的mtBarCnt值
  10.         Numeric Length(10);              // 目标周期下的回溯周期
  11. Vars
  12.         Numeric i;
  13.         Numeric j(0); // 与目标周期下的回溯周期 等值的小周期回溯周期值
  14. Begin

  15.         For i = 1 to Length
  16.         {
  17.                 If (mtBarCnt[j] <> InvalidNumeric)
  18.                 {

  19.                         j = j + mtBarCnt[j];
  20.                 }
  21.                 else Break;
  22.         }
  23.         Return j;
  24. End
复制代码

作者: 读书山林    时间: 2011-7-19 09:08:05

恩 谢谢老大 ok啦
作者: yuezongqi    时间: 2011-7-19 15:46:45

不想自己写用户函数了,直接该楼主的了
作者: yuezongqi    时间: 2011-7-19 17:28:13

直接调用用户函数就可以了,呵呵 不用自己写了
作者: cxwh    时间: 2011-7-27 20:05:02

期待SAR的放出!!!!!!!
作者: byland    时间: 2011-7-28 18:22:02

本帖最后由 byland 于 2011-7-28 18:24 编辑

我写的 ema ,引用后再超级图表上发现不同周期 数值会差很多  不知道是不是我写错了。


求助
  1.     Params
  2.             Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.             Numeric BarsBack(1);                // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.             Numeric Length(10);          //10周期
  5.             NumericRef oeMA;
  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.     Begin
  17.             mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  18.             mtClose = refClose;

  19.             oema=XAverage(mtClose,length);
  20.             Return mtBarCnt;
  21.     End
复制代码
引用代码
  1.   Params
  2.             Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.             Numeric BarsBack(1);                // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.             Numeric Length1(10);  
  5.                              
  6.      Vars
  7.             NumericSeries mtBarCnt;
  8.             NumericSeries mtClose;
  9.                         NumericSeries ema1;
  10.             Numeric oema1;
  11.            
  12.     Begin
  13.            
  14.         dayema(TimeFrame,BarsBack,Length1,oeMA1);
  15.         emA1 = oeMA1;
  16.         PlotNumeric("MA1",eMA1);
  17.             
  18.     End
复制代码
出现的情况是 在不同的周期   ema的值不一样   

但是我程序里写的是  日ema值

所以,help
作者: byland    时间: 2011-7-28 18:29:09

回复 80# byland


    [attach]4863[/attach][attach]4863[/attach]

[attach]4864[/attach][attach]4864[/attach]


明显可以看出不同周期的 值不一样

日线上现在的价格还在ema之上

5分钟图上 价格已经在ema之下了
作者: 读书山林    时间: 2011-8-1 10:29:30

回复 81# byland


    ema代码请看58楼MtXAverage 函数,跨期ema不能直接用ema函数XAverage;必须ma必须写mtma,sma必须写mtsma,如果明白原理的话可以直接封装到交易代码里面,不明白的话单独写函数。
作者: 读书山林    时间: 2011-8-1 10:32:11

错误代码        oema=XAverage(mtClose,length);
作者: 禁忌石    时间: 2011-8-1 15:42:04

谢谢老师,找到我想要的啦
作者: flyskyson    时间: 2011-8-4 11:14:20

谢谢你,辛苦了,学习中
作者: 趋势跟踪    时间: 2011-8-5 17:04:48

好贴呀,受益匪浅,顶!
作者: lulin168    时间: 2011-8-6 12:08:59

好贴,好人啊
作者: oceanwindtb    时间: 2011-8-7 20:50:27

这个贴要研究下  谢谢LZ老师....
作者: haomai01    时间: 2011-8-8 13:35:05

请老师搞个卡夫曼自适应移动平均吧!
谢谢
作者: 读书山林    时间: 2011-8-8 16:35:06

把楼主的前面的几个帖子搞透,不难写出来 试着写写看
作者: haomai01    时间: 2011-8-8 21:45:00

读书山林 要吗你帮忙写写看,俺现在水平还是有限的。谢谢了!
作者: tif    时间: 2011-8-25 14:16:35

感谢楼主百问不厌的精神,衷心感谢。
作者: 追涨杀跌    时间: 2011-9-2 10:08:56

回复 93# 致富

文华我用得很少,所以理解这段代码的逻辑可能会有偏差,我试着用TB改写成了一个交易系统,您看看是否和原指标的意思一样。
  1. Params
  2.         Numeric N(5);
  3. Vars
  4.         Numeric Todayopen;
  5.         Numeric H1;
  6.         Numeric L1;
  7.         NumericSeries HH1;
  8.         NumericSeries LL1;
  9.         NumericSeries BuyOrSell(0);
  10. Begin
  11.         TodayOpen = Round(OpenD(1),0);
  12.         if (Barstatus == 2)
  13.         {
  14.                 PlotString("todayopen",text(todayopen),High+1,Yellow);
  15.                 Unplot("todayopen",1);
  16.         }
  17.         H1 = HighestFC(Close,N);
  18.         L1 = LowestFC(Close,N);
  19.         //PlotNumeric("H1",H1,0,white);
  20.         //PlotNumeric("L1",L1,0,darkgray);
  21.         HH1 = IIF(close == L1, H1, HH1[1]);
  22.         LL1 = IIF(Close == H1, L1, LL1[1]);
  23.         PlotNumeric("HH1",HH1,0,Yellow);
  24.         PlotNumeric("LL1",LL1,0,blue);
  25.         BuyOrSell = IIF(Close > HH1, 1, iif(close < LL1, -1, 0));
  26.         if (marketposition <> 1 and BuyorSell[1] == 1)
  27.         {
  28.                 Buy(1,Open);
  29.         }
  30.         if (marketPosition <> -1 and BuyorSell[1] == -1)
  31.         {
  32.                 SellShort(1,Open);
  33.         }
  34. End
复制代码

作者: 读书山林    时间: 2011-9-2 11:26:41

追涨杀跌 老师的跨期sar还没搞出来吗
作者: illusion    时间: 2011-9-5 15:45:26

请追涨杀跌老师写个slowkd的跨周期,谢谢!!
作者: illusion    时间: 2011-9-6 10:48:15

回复 96# illusion

slowkd的跨周期
老师,我照着mtkdj依葫芦画瓢,看看对吗?
  1. Params
  2.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  3.         Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
  4.         Numeric Length(9);                        
  5.         Numeric M1(3);        
  6.                 Numeric M2(3);        
  7.                 Numeric M3(3);        
  8.         
  9.         NumericRef oKValue;
  10.         NumericRef oDValue;
  11. Vars
  12.         NumericSeries mtBarCnt;
  13.         NumericSeries mtOpen;
  14.         NumericSeries mtHigh;
  15.         NumericSeries mtLow;
  16.         NumericSeries mtClose;
  17.         NumericSeries mtVol;
  18.         NumericSeries mtOpenInt;
  19.         Numeric refCurBar;
  20.         Numeric refOpen;
  21.         Numeric refHigh;
  22.         Numeric refLow;
  23.         Numeric refClose;
  24.         Numeric refVol;
  25.         Numeric refOpenInt;

  26.         NumericSeries HighestValue;                                
  27.         NumericSeries LowestValue;                                       
  28.         NumericSeries KValue;
  29.         Numeric DValue;
  30.         Numeric i;
  31.         Numeric j(0);
  32.         NumericSeries FASTK;
  33.                 NumericSeries RSV;

  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.                
  51.                 RSV=(Close-LowestValue)/(HighestValue-LowestValue)*100;
  52.                 FASTK=SMA(RSV,M1,1);
  53.                 KValue=SMA(RSV,M2,1);
  54.                 DValue=SMA(KValue,M3,1);
  55.                
  56.                 oKValue = KValue;
  57.         oDValue = DValue;
  58.         return mtBarCnt;
  59. End
复制代码
劳烦老师给改改,谢谢.
作者: 4feet    时间: 2011-9-12 10:33:16

我也想要一个夸周期的SLOWKD,谢谢
作者: liuyzhi    时间: 2011-9-13 15:06:34

如果我想弄三个周期呢,也就是上边的多加一个周期,比如30分钟15分钟和5分钟,那个函数怎么用呢?
作者: 读书山林    时间: 2011-9-15 09:46:24

在一个公式中写上三个周期的代码啊
作者: liuyzhi    时间: 2011-9-16 13:58:27

谁能告诉我 那个MTBAR怎么用啊,我只想调用最高价和最低价,跪求!急!!!
作者: 4feet    时间: 2011-9-19 06:57:05

跪求MtSLKD
作者: xkzr    时间: 2011-9-19 10:54:10

请教老师~!5分钟macd交叉和15分钟macd交叉共振,买卖点交易怎么实现啊?
作者: 追涨杀跌    时间: 2011-9-19 11:46:59

本帖最后由 追涨杀跌 于 2011-9-19 11:48 编辑

回复 103# xkzr

参照以前的帖子,应该不难写出这个公式。我没有使用参数,直接写了一下,供你参考
Params
        Numeric FastLength(12);
        Numeric SlowLength(26);
        Numeric MACDLength(9);
        Numeric Lots(1);
Vars
        Numeric M15_MACDValue;
        Numeric M15_AvgMACD;
        NumericSeries M15_MACDDiff;
        Numeric M15_PreBar;

        Numeric M5_MACDValue;
        Numeric M5_AvgMACD;
        NumericSeries M5_MACDDiff;
        Numeric M5_PreBar;
       
Begin
        M15_PreBar = MtMACD(15,1,FastLength,SlowLength,MACDLength,M15_MACDValue,M15_AvgMACD);
        M15_MACDDiff = M15_MACDValue - M15_AvgMACD;
        PlotNumeric("M15_MACD",M15_MACDValue);
        PlotNumeric("M15_MACDAvg",M15_AvgMACD);
        If (M15_MACDDiff >= 0)       
                PlotNumeric("M15_MACDDiff",M15_MACDDiff,0,Red);
        Else
                PlotNumeric("M15_MACDDiff",M15_MACDDiff,0,Green);
        PlotNumeric("零线",0);

        M5_PreBar = MtMACD(5,1,FastLength,SlowLength,MACDLength,M5_MACDValue,M5_AvgMACD);
        M5_MACDDiff = M5_MACDValue - M5_AvgMACD;
        PlotNumeric("M5_MACD",M5_MACDValue);
        PlotNumeric("M5_MACDAvg",M5_AvgMACD);
        If (M5_MACDDiff >= 0)       
                PlotNumeric("M5_MACDDiff",M5_MACDDiff,0,Red);
        Else
                PlotNumeric("M5_MACDDiff",M5_MACDDiff,0,Green);
        PlotNumeric("零线",0);

        If (M15_MacdDiff[M15_PreBar]<0 and M15_MacdDiff>0 and M5_MacdDiff[M5_PreBar]<0 and M5_MacdDiff>0)
        {
                Buy(Lots,Open);
        }
        If (M15_MacdDiff[M15_PreBar]>0 and M15_MacdDiff<0 and M5_MacdDiff[M5_PreBar]>0 and M5_MacdDiff<0)
        {
                SellShort(Lots,Open);
        }
End
作者: xkzr    时间: 2011-9-19 11:56:57

回复 104# 追涨杀跌


    谢谢楼主~!回的真快啊~!
作者: gefrand    时间: 2011-9-21 21:57:13

首先感谢追涨大侠的无私奉献。
在应用前面MtMA或MtXAverage时,发现一个问题,比如用MtMa(1440,1,10,OMa),即在分钟图上引用10日平均线,用PlotNumeric()指令,发现前面8天没有线(正确),但第九天的值为0,其后阶梯上升,(其值明显的要小于真实的平均值),似乎要到第20天左右计算出的平均值才正常,不知何故?感觉 mtClose = refClose 的取值有点问题,尤其起始几天的值。
作者: 天涯秋雨    时间: 2011-9-28 15:10:45

老师,请帮忙写一个在15分钟周期引用日线的考夫曼自适应均线的程序,谢谢!




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2