设为首页收藏本站

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

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

Rank: 10Rank: 10Rank: 10

精华
0
UID
20842
积分
931
帖子
382
主题
2
阅读权限
255
注册时间
2010-12-3
最后登录
2022-2-15
跳转到指定楼层
1#
发表于 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
复制代码
已有 31 人评分威望 收起 理由
milier45 + 2
mashaobin + 2
scqh10700621 + 2
qq17373132105 + 2
tangwen831 + 2 很给力!

总评分: 威望 + 71   查看全部评分

Rank: 1

精华
0
UID
294246
积分
13
帖子
5
主题
3
阅读权限
10
注册时间
2020-7-27
最后登录
2020-8-27
301#
发表于 2020-8-16 00:40:15 |只看该作者
太有用了!感谢楼主分享!!

使用道具 举报

Rank: 1

精华
0
UID
243398
积分
9
帖子
5
主题
4
阅读权限
10
注册时间
2016-11-21
最后登录
2020-9-28
300#
发表于 2020-8-15 07:56:10 |只看该作者
很好的贴子

使用道具 举报

Rank: 1

精华
0
UID
270013
积分
12
帖子
2
主题
0
阅读权限
10
注册时间
2018-9-13
最后登录
2020-1-16
299#
发表于 2020-1-9 21:00:39 |只看该作者
追涨杀跌 发表于 2011-6-13 01:40
谢谢道勤的鼓励! 继续把其他几个常用指标的跨周期函数贴出来。
新建MtMacd函数,代码如下: ...

为何在TB极速版里编译结果是:返回值类型与声明类型不匹配呢?  问题在最后一行:return mtBarCnt;

使用道具 举报

Rank: 1

精华
0
UID
277808
积分
1
帖子
1
主题
0
阅读权限
10
注册时间
2019-4-13
最后登录
2021-6-10
298#
发表于 2019-12-7 02:27:03 |只看该作者
分钟调用日线似乎会遇到夜盘问题,似乎需要稍加修改。

使用道具 举报

Rank: 2

精华
0
UID
165827
积分
60
帖子
21
主题
7
阅读权限
30
注册时间
2011-10-10
最后登录
2023-11-10
297#
发表于 2019-11-7 23:15:06 |只看该作者
请教楼主老师,各位大神,请帮忙写一个mtAvgDeviation 跨周期平均背离,谢谢!

使用道具 举报

Rank: 1

精华
0
UID
282352
积分
42
帖子
26
主题
12
阅读权限
10
注册时间
2019-8-7
最后登录
2021-5-24
296#
发表于 2019-9-9 16:27:17 |只看该作者
太复杂了, SubscribeBar  一个函数解决问题

使用道具 举报

Rank: 1

精华
0
UID
1816
积分
13
帖子
2
主题
0
阅读权限
10
注册时间
2008-7-1
最后登录
2019-9-4
295#
发表于 2019-9-4 01:03:14 |只看该作者
Numeric BarsBack(1);
// 后面的代码来看,BarsBack只是设置出来的,不是计算出来的?

If(BarsBack == 0)
        // 如果Bar偏移参数为0,则取每根小周期K线上保留的大时间周期截止到这根小周期K线为止的BAR数据
        {
                barCntSum = 0 ;
        }Else If(BarsBack == 1)
        // 如果Bar偏移参数为1,则取大时间周期的上一根K线的BAr数据
        {
                barCntSum = barCnt ;
        }Else
        // 如果BAR偏移参数为其他,则取大时间周期的指定偏移后的那根K线的BAR数据
        {
                For i = 2 To BarsBack
                {
                        barCntSum = barCntSum + barCnt[barCntSum];
                }
        }

使用道具 举报

Rank: 1

精华
0
UID
258801
积分
37
帖子
21
主题
10
阅读权限
10
注册时间
2017-11-6
最后登录
2023-8-30
294#
发表于 2019-5-28 13:50:00 |只看该作者
留个脚印

使用道具 举报

Rank: 1

精华
0
UID
277309
积分
1
帖子
1
主题
0
阅读权限
10
注册时间
2019-3-29
最后登录
2022-1-18
293#
发表于 2019-4-28 17:07:57 |只看该作者
追涨杀跌 发表于 2011-6-8 17:51
现在可以举个例子来说明,怎么用上面的几个函数来做交易策略了。假如我们的策略如下:
1、我们以日线的均线 ...

这个跟DataConvert的效果的差异什么?刚接触TB,不太懂这里边的编程逻辑。

使用道具 举报

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

bottom

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

GMT+8, 2024-4-23 22:30

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部