设为首页收藏本站

 找回密码
 注册
查看: 38469|回复: 58
打印 上一主题 下一主题

福利 跨周期的傻瓜式解决方案 [复制链接]

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
跳转到指定楼层
1#
发表于 2015-5-8 23:29:31 |只看该作者 |倒序浏览
         TB的跨周期调用,论坛以前已经有一些解决方案。但对很多人来说不够方便 ,本方案主要参考了追涨杀跌的一些基础函数,兼顾了使用方便、运算性能速度、精确,在具体的算法上如 均线ma 标准差std 等不用因为数据源的变化而重新编写算法函数。
      
        比如close 的ma  myValue 的ma 都可以用一个 iMA函数解决。iMA的形式之所以不用  iMA(iPrice 数据源,TimeFrame 时间周期,Length 算法参数) 而是选择  iMA((iPrice 数据源,mtBarCnt ,Length1);是为了运算速度,否则如果一个策略多次用到跨周期的算法 函数内部会多次重复计算mtBarCnt值 ,  会影响运算速度。

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
2#
发表于 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
复制代码

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
3#
发表于 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
复制代码

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
4#
发表于 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
复制代码

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
5#
发表于 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  可求任意数据源

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
6#
发表于 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
复制代码

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
7#
发表于 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
复制代码

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
8#
发表于 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
复制代码

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
9#
发表于 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
复制代码

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
30159
积分
1116
帖子
280
主题
23
阅读权限
60
注册时间
2011-3-23
最后登录
2019-3-21
10#
发表于 2015-5-8 23:52:50 |只看该作者


白线就是Mean  自定义的数据源的跨周期值
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

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

bottom

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

GMT+8, 2024-5-4 07:40

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部