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

标题: 福利 跨周期的傻瓜式解决方案 [打印本页]

作者: 读书山林    时间: 2015-5-8 23:29:31     标题: 福利 跨周期的傻瓜式解决方案

         TB的跨周期调用,论坛以前已经有一些解决方案。但对很多人来说不够方便 ,本方案主要参考了追涨杀跌的一些基础函数,兼顾了使用方便、运算性能速度、精确,在具体的算法上如 均线ma 标准差std 等不用因为数据源的变化而重新编写算法函数。
      
        比如close 的ma  myValue 的ma 都可以用一个 iMA函数解决。iMA的形式之所以不用  iMA(iPrice 数据源,TimeFrame 时间周期,Length 算法参数) 而是选择  iMA((iPrice 数据源,mtBarCnt ,Length1);是为了运算速度,否则如果一个策略多次用到跨周期的算法 函数内部会多次重复计算mtBarCnt值 ,  会影响运算速度。
作者: 读书山林    时间: 2015-5-8 23:31:36

本帖最后由 读书山林 于 2018-3-7 13:10 编辑

此函数是追涨杀跌的MtBar 函数 为了和后面函数包的美观 修改了函数名
  1. //------------------------------------------------------------------------
  2. // 简称: iBar
  3. // 名称:
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

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

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

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

  113.         // 最后将相应的K线数据作为引用参数返回
  114.         oCurBar = CurBar;
  115.         oOpenHT = OpenHT[barCntSum];
  116.         oHighHT = HighHT[barCntSum];
  117.         oLowHT = LowHT[barCntSum];
  118.         oCloseHT = CloseHT[barCntSum];
  119.         oVolHT = VolHT[barCntSum];
  120.         oOpenIntHT = OpenIntHT[barCntSum];
  121.         Return barCnt;
  122. End
复制代码

作者: 读书山林    时间: 2015-5-8 23:33:39

iBar 参数太多 调用声明参数太麻烦 以下为简便写法
  1. //------------------------------------------------------------------------
  2. // 简称: inBar
  3. // 名称: 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------
  8. Params
  9.         Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  10.         Numeric BarsBack(1);                // 目标时间周期BAR偏移参数,说明见MtBar函数
  11. Vars
  12.         NumericSeries mtBarCnt;
  13.         Numeric refCurBar;
  14.         Numeric refOpen;
  15.         Numeric refHigh;
  16.         Numeric refLow;
  17.         Numeric refClose;
  18.         Numeric refVol;
  19.         Numeric refOpenInt;
  20.         
  21.         Numeric SumValue(0);
  22.         Numeric i;
  23.         Numeric j(0);
  24. Begin
  25.         mtBarCnt=iBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);

  26.         Return mtBarCnt;
  27. End
复制代码

作者: 读书山林    时间: 2015-5-8 23:36:04

本帖最后由 读书山林 于 2015-5-21 02:19 编辑

跨周期求和函数
  1. //------------------------------------------------------------------------
  2. // 简称: iSum
  3. // 名称: 跨周期求和函数 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params
  9.         NumericSeries iPrice(1);
  10.         NumericSeries BarCnt(0);
  11.         Numeric Length(10);
  12. Vars
  13.         NumericSeries SumValue(0);
  14.         Numeric i;
  15.         Numeric j(0);
  16. Begin
  17.        If(Length==0)
  18.        {
  19.             Return iPrice;           
  20.        }Else
  21.        {
  22.             j=0;
  23.             SumValue = 0;
  24.             For i = 1 to Length
  25.             {
  26.                 If (iPrice[j] <> InvalidNumeric)
  27.                 {
  28.                         SumValue = SumValue + iPrice[j];
  29.                         j = j + BarCnt[j];
  30.                 }
  31.                 else Break;
  32.             }
  33.        }
  34.         Return SumValue;
  35. End
复制代码

作者: 读书山林    时间: 2015-5-8 23:37:59

本帖最后由 读书山林 于 2015-5-9 00:28 编辑
  1. //------------------------------------------------------------------------
  2. // 简称: iMA
  3. // 名称: 跨周期求均值 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------
  8. Params
  9.         NumericSeries iPrice(1); //数据源必须为跨周期的值 否则不能返回正确值
  10.         NumericSeries mtBarCnt(1) ;  
  11.         Numeric Length(10);                           
  12. Vars
  13.         Numeric SumValue(0);
  14.         Numeric i;
  15.         Numeric oMA;      
  16. Begin
  17.         SumValue = iSum(iPrice,mtBarCnt,Length);
  18.         oMA = SumValue/Length;
  19.         Return oMA;
  20. End
复制代码
iMA  可求任意数据源


作者: 读书山林    时间: 2015-5-8 23:41:17

iVariancePS 跨周期求方差   iStandardDev 跨周期求标准差 可求任意数据源
  1. //------------------------------------------------------------------------
  2. // 简称: iStandardDev
  3. // 名称: 跨周期求标准差 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params
  9.         NumericSeries iPrice(1);
  10.         NumericSeries BarCnt(0);               
  11.         Numeric Length(10);
  12.         Numeric DataType(1);
  13. Vars
  14.         Numeric VarPSValue;
  15. Begin
  16.         VarPSValue = iVariancePS(iPrice,BarCnt, Length, DataType);
  17.         If (VarPSValue > 0)
  18.         {
  19.                 Return Sqrt(VarPSValue);
  20.         }Else
  21.         {
  22.                 Return 0;
  23.         }
  24. End
复制代码

作者: 读书山林    时间: 2015-5-8 23:42:14

  1. //------------------------------------------------------------------------
  2. // 简称: iVariancePS
  3. // 名称: 跨周期求方差 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8.    
  9. Params
  10.         NumericSeries iPrice(1);//数据源必须为跨周期的值 否则不能返回正确值
  11.         NumericSeries BarCnt(0);       
  12.         Numeric Length(10);
  13.         Numeric DataType(1);
  14. Vars
  15.         Numeric Divisor;
  16.         Numeric SumSqr(0);
  17.         Numeric Mean;       
  18.         Numeric i;
  19.         Numeric j(0);       
  20. Begin
  21.         Mean = iMA(iPrice, BarCnt,Length);
  22.         Divisor = Length-1;
  23.         If(DataType==1)
  24.                 Divisor = Length;
  25.         If(Divisor > 0)
  26.         {
  27.                 for i = 0 to Length - 1
  28.                 {
  29.                         SumSqr = SumSqr + Sqr( iPrice[j] - Mean ) ;
  30.                         j = j + BarCnt[j];
  31.                 }
  32.                 Return SumSqr / Divisor ;
  33.         }Else
  34.         {
  35.                 Return 0;
  36.         }
  37. End
复制代码

作者: 读书山林    时间: 2015-5-8 23:45:30

本帖最后由 读书山林 于 2015-5-9 00:33 编辑

iPrice0  跨周期数据源转换
  1. //------------------------------------------------------------------------
  2. // 简称: iPrice0
  3. // 名称: 跨周期数据源转换 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------
  8. Params
  9.         String iPriceType("close");     // 转换的类型,分为High,Low,Open,Close,Vol,OpenInt,BarCnt refCurBar 八种类型
  10.                 Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
  11.                 Numeric BarsBack(1);              // 目标时间周期BAR偏移参数,说明见MtBar函数
  12. Vars
  13.         String strTmp1("close");
  14.         NumericSeries mtBarCnt;
  15.         NumericSeries  mtValue ;               
  16.         Numeric refCurBar;
  17.         Numeric refOpen;
  18.         Numeric refHigh;
  19.         Numeric refLow;
  20.         Numeric refClose;
  21.         Numeric refVol;
  22.         Numeric refOpenInt;
  23.         
  24.         Numeric SumValue(0);
  25.         Numeric i;
  26.         Numeric j(0);
  27. Begin

  28.         strTmp1 = Lower(iPriceType);
  29.        
  30.         If ( strTmp1 != "BarCnt" && strTmp1 != "CurBar" &&strTmp1 != "open" && strTmp1 != "high" && strTmp1 != "low" && strTmp1 != "close" && strTmp1 != "vol" && strTmp1 != "openint")
  31.                 Return -1;       
  32.                
  33.                
  34.         mtBarCnt=iBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  35.         if(strTmp1 =="high")
  36.                 {
  37.                                 mtValue = refHigh;
  38.                 }Else if(strTmp1 =="low")
  39.                 {
  40.                                 mtValue = refLow;
  41.                 }Else if(strTmp1 =="close" )
  42.                 {
  43.                                 mtValue = refClose;
  44.                 }Else if(strTmp1 =="vol")
  45.                 {
  46.                                 mtValue = refVol;
  47.                 }Else if(strTmp1 == "openInt")
  48.                 {
  49.                                 mtValue = refOpenInt;
  50.                 }Else if(strTmp1 =="BarCnt")
  51.                 {
  52.                                 mtValue = mtBarCnt;
  53.                 }Else if(strTmp1 =="CurBar")
  54.                 {
  55.                                 mtValue = refCurBar;
  56.                 }
  57.                
  58.         Return mtValue;
  59. End
复制代码

作者: 读书山林    时间: 2015-5-8 23:47:12

本帖最后由 读书山林 于 2015-5-9 00:09 编辑

使用方法举例
  1. //------------------------------------------------------------------------
  2. // 简称: TesiMa
  3. // 名称: 读书山林
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. // 输出:
  7. //------------------------------------------------------------------------

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

  11.         Numeric Length1(10);                // 大周期的短期均线周期               
  12.         Numeric Length2(20);                // 大周期的长期均线周期
  13.         Numeric Length3(10);                // 小周期的短期均线周期
  14.         Numeric Length4(20);                // 小周期的长期均线周期
  15.         Numeric Lots(1);
  16. Vars
  17.         NumericSeries closeX;
  18.         NumericSeries mtBarCnt;               
  19.         NumericSeries MA1;
  20.         NumericSeries MA2;

  21.         NumericSeries MA3;
  22.         NumericSeries MA4;
  23.         NumericSeries Mean;               
  24. Begin
  25.         closeX=iPrice0("Close",TimeFrame,BarsBack);//跨周期的数据源
  26.         mtBarCnt=inBar(TimeFrame,BarsBack);       // 跨周期的inBar
  27.         //只要得知了以上两个数据就可以求任意算法的 跨周期值
  28.                
  29.         MA1 = iMA(closeX,mtBarCnt,Length1);
  30.         PlotNumeric("MA1",MA1);

  31.         MA2 = iMA(closeX,mtBarCnt,Length2);
  32.         PlotNumeric("MA2",MA2);
  33.                
  34.         //可以把任意正确的数据源带入算法函数,不用因为数据源的变化 重新写算法函数
  35.         Mean = iMA(MA1,mtBarCnt,Length2);// 以跨周期均线ma1为数据源的移动平均
  36.         PlotNumeric("Mean",Mean);               
  37.                
  38.         MA3 = AverageFC(Close,Length3);
  39.         MA4 = AverageFC(Close,Length4);
  40.         PlotNumeric("MA3",MA3);
  41.         PlotNumeric("MA4",MA4);
  42.         
  43.         
  44.         If (MA1>MA2)                // 大周期均线金叉,多头趋势
  45.         {
  46.                 if (MarketPosition!=1 and MA3[1]>MA4[1])
  47.                 {
  48.                         Buy(Lots,Open);
  49.                 }
  50.                 if (MarketPosition==1 and MA3[1]<MA4[1])
  51.                 {
  52.                         Sell(Lots,Open);
  53.                 }
  54.         }
  55.         If (MA1<MA2)                // 大周期均线死叉,空头趋势
  56.         {
  57.                 if (MarketPosition!=-1 and MA3[1]<MA4[1])
  58.                 {
  59.                         SellShort(Lots,Open);
  60.                 }
  61.                 if (MarketPosition==-1 and MA3[1]>MA4[1])
  62.                 {
  63.                         BuyToCover(Lots,Open);
  64.                 }
  65.         }
  66. End
复制代码

作者: 读书山林    时间: 2015-5-8 23:52:50

[attach]31455[/attach]

白线就是Mean  自定义的数据源的跨周期值
作者: 读书山林    时间: 2015-5-9 00:18:49

本帖最后由 读书山林 于 2015-5-9 00:23 编辑

大周期上回溯[N]怎么办 很重要的函数iRef  很多童鞋改写一些算法不正确就是因为忽视了算法内部的回溯值
  1. //------------------------------------------------------------------------
  2. // 简称: iRef
  3. // 名称: 跨周期求回溯值 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params

  9.         NumericSeries mtBarCnt(0);        // MtBar函数返回的mtBarCnt值
  10.         Numeric Length(10);         // 目标周期下的回溯周期
  11. Vars
  12.         Numeric Length0(2);   
  13.         Numeric i;
  14.         Numeric j(0); // 与目标周期下的回溯周期 等值的小周期回溯周期值
  15. Begin
  16.         If(Length==0)
  17.         {
  18.           Return 0;          
  19.         }Else   If(Length==1)
  20.         {
  21.           Return mtBarCnt;       
  22.         }Else
  23.         {
  24.           j=0;
  25.           Length0=Length;

  26.           For i = 1 to Length0
  27.           {
  28.                 If (mtBarCnt[j] <> InvalidNumeric)
  29.                 {
  30.                         j = j + mtBarCnt[j];
  31.                 }
  32.                 else Break;
  33.          }
  34.          Return j;
  35.         }
  36. End
复制代码

作者: 读书山林    时间: 2015-5-9 00:37:55

本帖最后由 读书山林 于 2015-5-13 09:03 编辑

iEMA
  1. //------------------------------------------------------------------------
  2. // 简称: iEMA
  3. // 名称: 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------
  8. Params
  9.         NumericSeries iPrice;
  10.         NumericSeries mtBarCnt;
  11.         Numeric Length(10);
  12. Vars
  13.         Numeric sFcactor;
  14.         NumericSeries XAvgValue;
  15.         
  16. Begin
  17.                 sFcactor = 2 / ( Length + 1 );
  18.                 if ( XAvgValue[mtBarCnt] == InvalidNumeric)
  19.                 {
  20.                         XAvgValue = iPrice;
  21.                 }else
  22.                 {
  23.                         XAvgValue = XAvgValue[mtBarCnt] + sFcactor * ( iPrice - XAvgValue[mtBarCnt] ) ;
  24.                 }        
  25.                 Return XAvgValue;
  26. End
复制代码

作者: feiniulala0723    时间: 2015-5-10 08:44:16

好东西,谢谢分享!
作者: 读书山林    时间: 2015-5-10 22:33:13

iAMA   跨周期求考夫曼
  1. //------------------------------------------------------------------------
  2. // 简称: iAMA
  3. // 名称: 跨周期求考夫曼 读书山林
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------


  8. Params
  9.         NumericSeries Price(1);
  10.         NumericSeries mtBarCnt(1);       
  11.         Numeric EffRatioLength(10);
  12.         Numeric FastAvgLength(2);
  13.         Numeric SlowAvgLength(30);
  14. Vars
  15.         Numeric oEffRatioLength(10);
  16.         Numeric NetChg(0);
  17.         Numeric TotChg(0);
  18.         Numeric EffRatio(0);
  19.         Numeric ScaledSFSqr(0);
  20.         NumericSeries AMAValue;       
  21.         Numeric SFDiff;
  22.         NumericSeries sumx;       
  23. Begin
  24.               if ( AMAValue[mtBarCnt] == InvalidNumeric)
  25.               {
  26.                   AMAValue = Price;
  27.                   Return AMAValue;
  28.                }
  29.                
  30.                oEffRatioLength=iRef(mtBarCnt,EffRatioLength);
  31.                
  32.                 NetChg = Abs( Price - Price[oEffRatioLength] );
  33.                 sumx = Abs( Price - Price[mtBarCnt] );
  34.                 TotChg = iSum(sumx ,mtBarCnt ,EffRatioLength );               
  35.                 EffRatio = IIF(TotChg > 0, NetChg / TotChg, 0);
  36.                 SFDiff = 2 / ( FastAvgLength + 1 ) - 2 / ( SlowAvgLength + 1 );               
  37.                 ScaledSFSqr = Sqr( 2 / ( SlowAvgLength + 1 ) + EffRatio * SFDiff );               
  38.                 AMAValue = AMAValue[mtBarCnt] + ScaledSFSqr * ( Price - AMAValue[mtBarCnt] );

  39.                Return AMAValue;
  40. End
复制代码

作者: 读书山林    时间: 2015-5-10 22:36:03

再举个调用实例
  1. //------------------------------------------------------------------------
  2. // 简称: testAMA
  3. // 名称:
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. // 输出:
  7. //------------------------------------------------------------------------
  8. Params  
  9.         Numeric TimeFrame(30);        // 目标时间周期参数,参数说明参见iBar
  10.         Numeric BarsBack(1);          // 目标时间周期BAR偏移参数,说明见MtBar函数
  11.         Numeric EffRatioLength(10);
  12.         Numeric FastAvgLength(2);
  13.         Numeric SlowAvgLength(30);
  14. Vars
  15.         Numeric closeX(1);  
  16.         Numeric AMAValue(1);
  17.         NumericSeries mtBarCnt(1);        
  18. Begin
  19.         closeX=iPrice0("Close",TimeFrame,BarsBack);//跨周期的数据源
  20.         mtBarCnt=inBar(TimeFrame,BarsBack);       // 跨周期的inBar
  21.        
  22.         AMAValue=iAMA(closeX,mtBarCnt,EffRatioLength,FastAvgLength,SlowAvgLength);
  23.         PlotNumeric("AdpMa",AMAValue);       
  24. End
复制代码

作者: 读书山林    时间: 2015-5-10 22:55:35

本帖最后由 读书山林 于 2015-5-10 22:57 编辑
  1. //------------------------------------------------------------------------
  2. // 简称: iHHV
  3. // 名称: 跨期求Highest
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params
  9.         NumericSeries Price(0);
  10.         NumericSeries mtBarCnt(0);        
  11.         Numeric Length(5);
  12. Vars
  13.         Numeric HighestValue;
  14.         Numeric i;
  15.         Numeric j;       
  16. Begin                       
  17.         HighestValue = Price;               
  18.         for i=1 to Length - 1
  19.        {
  20.                 j=iRef(mtBarCnt,i);
  21.                 If(Price[j] > HighestValue)
  22.                         HighestValue = Price[j];
  23.         }
  24.         Return HighestValue;
  25. End
复制代码

作者: 读书山林    时间: 2015-5-10 22:56:27

  1. //------------------------------------------------------------------------
  2. // 简称: iLLV
  3. // 名称: 跨期求Lowest
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params
  9.         NumericSeries Price(0);
  10.         NumericSeries mtBarCnt(0);                
  11.         Numeric Length(5);
  12. Vars
  13.         Numeric LowestValue;
  14.         Numeric i;
  15.         Numeric j;               
  16. Begin
  17.         LowestValue = Price;       
  18.         for i=1 to Length - 1
  19.        {
  20.                 j=iRef(mtBarCnt,i);       
  21.                 If(Price[j] < LowestValue)
  22.                         LowestValue = Price[j];
  23.         }
  24.         Return LowestValue;

  25. End
复制代码

作者: glaceage    时间: 2015-5-10 22:58:01

还没完全看懂 谢谢山林老师 留着细细看
作者: 读书山林    时间: 2015-5-10 23:12:19

glaceage 发表于 2015-5-10 22:58
还没完全看懂 谢谢山林老师 留着细细看

会用调用就行,调用已经很方便了
作者: tsbftwo    时间: 2015-5-11 10:17:27

非常感谢!
作者: jeehuat    时间: 2015-5-12 00:35:46

谢谢!
求iEMA程序里少了“Vars”。
作者: fatstar    时间: 2015-5-12 21:20:54

大神啊~
作者: 读书山林    时间: 2015-5-13 09:04:22

jeehuat 发表于 2015-5-12 00:35
谢谢!
求iEMA程序里少了“Vars”。

谢谢 已修正
作者: 读书山林    时间: 2015-5-13 09:27:17

看了下V5 的数组功能,用v5的数组解决跨周期应该能提高很大的运算速度
作者: 趋势跟踪    时间: 2015-5-15 17:57:38

强烈支持读书山林老师!
作者: glaceage    时间: 2015-5-17 22:56:09

山林老师 我要在1分钟k线里引用大前天的收盘价,在barsback=1的条件下,

closex=Mtclose[iref(mtbarcnt,1)]

这样写对么
作者: glaceage    时间: 2015-5-17 23:26:09

山林老师 我要在1分钟k线里引用大前天的收盘价,在barsback=1的条件下,

closex=Mtclose[iref(mtbarcnt,1)]

这样写对么
作者: 读书山林    时间: 2015-5-18 13:33:06

glaceage 发表于 2015-5-17 23:26
山林老师 我要在1分钟k线里引用大前天的收盘价,在barsback=1的条件下,

closex=Mtclose

你写的莫名其妙啊
日线数据可以直接写
closex=CloseD(3) ;//
作者: 读书山林    时间: 2015-5-18 13:38:34

glaceage 发表于 2015-5-17 23:26
山林老师 我要在1分钟k线里引用大前天的收盘价,在barsback=1的条件下,

closex=Mtclose

如果Mtclose指的是日线收盘价
应该是closex=Mtclose[iref(mtbarcnt,2)]
作者: glaceage    时间: 2015-5-18 22:43:07

读书山林 发表于 2015-5-18 13:38
如果Mtclose指的是日线收盘价
应该是closex=Mtclose

谢谢山林老师 另外您的qq群加不进去啊 如果还有位置的话请加我进去学习 谢谢
作者: y_xzhy    时间: 2015-6-7 07:48:35

请教大神,跨周期调用大周期的ATR如何实现
作者: wawe58    时间: 2015-6-10 21:48:11

大侠,能否搞一个iSMA,我看过你 的和追涨杀跌的讨论,你提到了sma的数据源的问题,或许你大概用i的方法解决。想看看isma的写法
作者: LEXUSNX200T    时间: 2015-6-22 00:30:59

本帖最后由 LEXUSNX200T 于 2015-6-22 00:35 编辑
读书山林 发表于 2015-5-8 23:33
iBar 参数太多 调用声明参数太麻烦 以下为简便写法


山林老师,V5版不能编译。

mtBarCnt=iBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);

提示:函数的调用的参数数目与声明不符和(太多的调用参数)
作者: glaceage    时间: 2015-6-23 10:06:43

是不是TB改变算法了 怎么mtbar函数失效了
作者: wawe58    时间: 2015-6-26 17:43:42

读书山林实际是把追涨杀跌的理念进行了推进,解决许多复杂的问题。我来贡献一个isma
//------------------------------------------------------------------------
// 简称: iSma
// 名称:
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------


Params
     
        NumericSeries iPrice;
        NumericSeries mtBarCnt;
        Numeric Length(14);
        Numeric  weight(1);
Vars
        NumericSeries Smavalue;
Begin
        If(Smavalue[mtBarCnt]==InvalidNumeric)
        {
          Smavalue=iPrice;
        }Else
        {
        Smavalue=(Smavalue[mtBarCnt]*(Length-weight)+iPrice*weight)/Length;
        }
       
       
        Return Smavalue;
End

//------------------------------------------------------------------------
// 编译版本        GS2010.12.08
// 用户版本        2015-06-26 11:04:50
// 版权所有        xhqh10101395
// 更改声明        TradeBlazer Software保留对TradeBlazer平台
//                        每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
作者: glaceage    时间: 2015-7-1 11:58:22

我照猫画虎做了个iATR,数据对不上,不知道哪里有问题。
Params
        Numeric TimeFrame(1440);        // 目标时间周期参数,参数说明参见MtBar
        Numeric BarsBack(1);         // 目标时间周期BAR偏移参数,说明见MtBar函数
        Numeric Length(10);                 // ATR周期
        
Vars
        NumericSeries mtBarCnt;
                NumericSeries closex;
                NumericSeries highx;
                NumericSeries lowx;
                NumericSeries openx;
                NumericSeries CurBarX;
                NumericSeries TR;
                NumericSeries ATR;
                Numeric                  SumValue;
Begin
        mtBarCnt = inbar(timeframe,barsback);
                closex=iprice0("close",timeframe,barsback);
                highx=iprice0("high",timeframe,barsback);
                lowx=iprice0("low",timeframe,barsback);
                openx=iprice0("open",timeframe,barsback);
                CurBarX=iprice0("curbar",timeframe,barsback);
        if (CurBarX <= 1) TR = Highx - Lowx;
        else TR = Max(Highx,Closex[mtBarCnt]) - Min(Lowx,Closex[mtBarCnt]);
                SumValue = isum(TR,mtBarCnt,Length);
                ATR = SumValue / Length;
        return ATR;
End
作者: kemp123    时间: 2015-7-1 17:11:00

可以生成公式就好了,手动编译老是函数没声明

      
      


      
               
   

      
      
作者: zzh    时间: 2015-8-2 10:50:44

在分钟线上,显示日线均线时,日期切换点有点问题。夜盘支持方面可能需要调整一下
作者: lianghua001    时间: 2015-8-3 14:19:30

学习了,牛人

作者: lfbear    时间: 2015-8-12 15:20:45

菜鸟级新手表示不会调用咋整额
作者: lfbear    时间: 2015-8-12 15:32:21

有没有像文华一样跨周期调用呀。
作者: 小米    时间: 2015-8-12 16:08:24

lfbear 发表于 2015-8-12 15:32
有没有像文华一样跨周期调用呀。

抱歉,对于跨周期调用,没什么特别简单的方式。
相对简单的就是使用读写数据库的方式了。。可先试试啊
作者: charles6060    时间: 2015-8-22 21:42:45

有夜盘后调用日线,设1440,好像不正确,这个怎么处理?
作者: jinshuangfu    时间: 2015-10-19 16:10:05

顶一个
作者: fatstar    时间: 2015-12-2 10:49:09

顶一个,这帖子有非常好的参考价值!有空研究一下~
作者: hs838633    时间: 2016-2-22 14:21:48

读书山林 发表于 2015-5-8 23:47
使用方法举例

我收了没法通过编译
作者: luisinscut    时间: 2016-2-25 17:05:10

好好学习一下,顶起来
作者: sswywangyun    时间: 2016-9-4 21:12:39

不错不错,分开取,速度快
作者: BennyHuang    时间: 2016-11-24 22:47:16

山林老师,你好;我也参照“追涨杀跌”的MtBAR造了一系列和你一样的轮子;
问题是,这个MtBar在日内调用日间时有问题;

对于有夜盘的品种,调取的Close会是夜盘收盘的价格;夜盘跨夜的话,就会是当天24:00的价格;
这个历史遗留问题弄得我很头疼,请问现在有没有相应的解决方案了吗?

祝好!
作者: gbasp1qq    时间: 2017-6-11 20:32:03

楼主好棒啊如果以后有时间,可以试试做跨周期的SAR指标造福大众吗
作者: coolyks    时间: 2017-7-17 09:34:25

山林大神你好,请问一下你的解决方案是否解决了夜盘归属到第二天日K线的问题?如果没解决的话,应该从什么思路去解决呢?
作者: wwq1989    时间: 2017-11-4 21:08:23

比如我的策略运行在1小时K线周期里面,但是我想调用日线周期里面的5日、10日、20日均线,代码怎么写
作者: wwq1989    时间: 2017-11-4 21:08:55

比如我的策略运行在1小时K线周期里面,但是我想调用日线周期里面的5日、10日、20日均线,代码怎么写
作者: 读书山林    时间: 2017-11-24 11:28:30

coolyks 发表于 2017-7-17 09:34
山林大神你好,请问一下你的解决方案是否解决了夜盘归属到第二天日K线的问题?如果没解决的话,应该从什么 ...
  1. //------------------------------------------------------------------------
  2. // 简称: iBar
  3. // 名称:
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

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

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

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

  113.         // 最后将相应的K线数据作为引用参数返回
  114.         oCurBar = CurBar;
  115.         oOpenHT = OpenHT[barCntSum];
  116.         oHighHT = HighHT[barCntSum];
  117.         oLowHT = LowHT[barCntSum];
  118.         oCloseHT = CloseHT[barCntSum];
  119.         oVolHT = VolHT[barCntSum];
  120.         oOpenIntHT = OpenIntHT[barCntSum];
  121.         Return barCnt;
  122. End
复制代码
把基础函数更新下就好
把Date函数替换为TrueDate 其他函数不变
作者: 读书山林    时间: 2017-11-24 11:37:09

本帖最后由 读书山林 于 2018-3-5 09:49 编辑

......
作者: lkcxhhj    时间: 2017-12-16 08:34:25

谢谢读书山林。
不过群还是加不上。
作者: TBzhanghu888    时间: 2018-7-31 11:38:53

读书山林 发表于 2015-5-8 23:52
白线就是Mean  自定义的数据源的跨周期值

山林老师,为什么小周期上(比如1分钟)显示的大周期均线数值和目标周期(比如日线图)数值不一样?
作者: qdq333    时间: 2019-5-18 00:40:14

看不到啊
作者: wanygqh    时间: 2021-1-17 17:13:35

请问ihhv如何调用,谢谢





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