tb跨周期函数

it2022-05-05  141

// ------------------------------------------------------------------------ //  简称: k_Bar //  名称: 跨周期函数--基础BAR数据 //  类别: 用户函数 //  类型: 用户函数 //  输出: 数值型 // ------------------------------------------------------------------------ Params     Numeric TimeFrame( 1440 );             //  目标时间周期:按月线=4周(40320),周线=7天(10080),日线=24小时(1440)         //  其他日内的周期等于相应的分钟数,如:1小时=60, 30分钟=30。。。         //  1分钟图表,支持不规则分钟数,如3分钟、8分钟、14分钟等             Numeric BarsBack( 0 );          //  目标时间周期BAR偏移:         //  1--表示当前周期下的当前BAR对应目标周期的前一根BAR         //  0--表示当前周期下的当前BAR对应目标周期的当前BAR截止到目前为止的BAR数据值 Vars    Numeric TradeDate;                 //  当前K线实际交易日期(主要解决夜盘问题)     Numeric TradeHour;                 //  当前K线实际交易时间(小时)     Numeric TradeMinute;             //  当前K线实际交易时间(分钟)     NumericSeries Index;             //  当前BAR在TimeFrame时间周期下的索引值     Numeric SessionStartHour;         //  当前K线实际的交易日的第一节交易的起始时间(小时)     NumericSeries barCnt;             //  读取目标周期上一根BAR的数据在当前周期下需要回溯的BAR数     NumericSeries Ht_CurBar;         //  当前BAR在目标周期下对应的CurrentBar     Numeric barCntSum;                  //  临时变量,返回目标周期数据需要回溯的BAR数     NumericSeries Ht_Open;             //  目标时间周期的开盘价     NumericSeries Ht_High;             //  目标时间周期的最高价     NumericSeries Ht_Low;             //  目标时间周期的最低价     NumericSeries Ht_Close;             //  目标时间周期的收盘价     NumericSeries Ht_Vol;             //  目标时间周期的成交量     NumericSeries Ht_OpenInt;         //  目标时间周期的持仓量      bool  condition( false );             //  判断在目标时间是否属于不同根BAR     Numeric i;    Begin     TradeDate  =  TrueDate( 0 );          //  取实际交易日期     //  根据TimeFrame分别处理     If(TimeFrame  ==   40320 )             //  月线     {        Index  =  (YearFromDateTime(TradeDate)  -   1970 *   12   +  MonthFromDateTime(TradeDate);    }    Else If(TimeFrame  ==   10080 )         //  周线     {        Index  =  IntPart(DateDiff( 19700105 ,TradeDate) / 7 );    }    Else If(TimeFrame  ==   1440 )         //  日线     {        Index  =  DateDiff( 19700105 ,TradeDate);    }    Else    {        TradeHour  =  HourFromDateTime(Time);        TradeMinute  =  MinuteFromDateTime(Time);         //  取当前品种,第一节交易的开始小时数         SessionStartHour  =  IntPart(GetSessionStartTime( 0 ) * 100 );         //  解决4小时图的时间划分比较特殊问题         If(TimeFrame  ==   240 ) SessionStartHour  =  IIF(SessionStartHour  ==   21 , 20 , 8 );                 //  按当前BAR对应时间,除以TimeFrame的分钟数,得到的商为索引值,索引值相同的在大周期上属于同一根BAR         Index  =  DateDiff( 19700105 ,TradeDate)  *  (IntPart( 1439 / TimeFrame) + 1 +  IntPart((IIF(TradeHour  >=  SessionStartHour, TradeHour  -  SessionStartHour,        TradeHour  +   24   -  SessionStartHour)  *   60   +  TradeMinute) / TimeFrame);    }     //  索引值不同的,则说明属于不同BAR     condition  =  Index  <>  Index[ 1 ];    If(CurrentBar == 0 )                 //  如果是第一根Bar, Ht_CurBar=0     {        barCnt  =   0 ;        Ht_CurBar  =   0 ;        Ht_Open  =  Open;        Ht_High  =  High;        Ht_Low  =  Low;        Ht_Close  =  Close;        Ht_Vol  =  Vol;        Ht_OpenInt  =  OpenInt;    }    Else    {        If(Condition)                       //  如果在目标周期下,属于另一根K线,则Ht_CurBar加1         {            barCnt  =   1 ;            Ht_CurBar  =  Ht_CurBar[ 1 +   1 ;            Ht_Open  =  Open;            Ht_High  =  High;            Ht_Low  =  Low;            Ht_Vol  =  Vol;        }        Else         //  如果在目标周期下,属于同一根K线,则Ht_CurBar不变,但最高价和最低价要记录价格的变化,成交量要累加         {            barCnt  =  barCnt[ 1 +   1 ;            Ht_High  =  Max(Ht_High[ 1 ],High);            Ht_Low  =  Min(Ht_Low[ 1 ],Low);            Ht_Vol  =  Ht_Vol[ 1 +  Vol;        }         //  收盘价和持仓量总是取最新值         Ht_Close  =  Close;        Ht_OpenInt  =  OpenInt;    } //     FileAppend("c:\\qqqq.txt","DT="+Text(Date+Time)+" Index="+Text(Index)+" CurrentBar="+Text(CurrentBar)+" barCnt="+text(barCnt)+" Ht_CurBar="+text(Ht_CurBar)+" Ht_Open="+text(Ht_Open)+" Ht_High="+text(Ht_High) //     +" Ht_Low="+Text(Ht_Low)+" Ht_Close="+Text(Ht_Close)+" Ht_Vol="+Text(Ht_Vol)+" Ht_OpenInt="+Text(Ht_OpenInt));         //  前面在当前周期的每根BAR,记录了它对应的目标时间周期的开高低收等数据。     //  接下来把每根BAR对应的数据返回给调用本函数的公式(通过全局变量)     barCntSum  =  barCnt ;    If(BarsBack  ==   0 )     //  如果BarsBack为0,则当前BAR记录的是当前BAR所对应目标周期的当前BAR截止到目前为止的BAR数据值     {        barCntSum  =   0  ;    }     //  如果BarsBack为1,则当前BAR记录的是当前BAR所对应目标周期的前一根BAR的数据值     Else    {        barCntSum  =  barCnt ;    }     //  将目标时间周期下的BAR数据写入全局变量返回调用公式     SetGlobalVar2( " Ht_curbar " ,Ht_CurBar);    SetGlobalVar2( " Ht_open " ,Ht_Open[barCntSum]);    SetGlobalVar2( " Ht_high " ,Ht_High[barCntSum]);    SetGlobalVar2( " Ht_low " ,Ht_Low[barCntSum]);    SetGlobalVar2( " Ht_close " ,Ht_Close[barCntSum]);    SetGlobalVar2( " Ht_vol " ,Ht_Vol[barCntSum]);    SetGlobalVar2( " Ht_openInt " ,Ht_OpenInt[barCntSum]);     //  将读取大周期数据的回溯BAR数作为函数的返回值返回     Return barCnt;    End  /*  Params     Numeric TimeFrame(1440);            // 目标时间周期:按月线=4周(40320),周线=7天(10080),日线=24小时(1440)        // 其他日内的周期等于相应的分钟数,如:1小时=60, 30分钟=30。。。        // 1分钟图表,支持不规则分钟数,如3分钟、8分钟、14分钟等            Numeric BarsBack(0);         // 目标时间周期BAR偏移:        // 1--表示当前周期下的当前BAR对应目标周期的前一根BAR        // 0--表示当前周期下的当前BAR对应目标周期的当前BAR截止到目前为止的BAR数据值Vars    Numeric TradeDate;                // 当前K线实际交易日期(主要解决夜盘问题)    Numeric TradeHour;                // 当前K线实际交易时间(小时)    Numeric TradeMinute;            // 当前K线实际交易时间(分钟)    NumericSeries Index;            // 当前BAR在TimeFrame时间周期下的索引值    Numeric SessionStartHour;        // 当前K线实际的交易日的第一节交易的起始时间(小时)    NumericSeries barCnt;            // 读取目标周期上一根BAR的数据在当前周期下需要回溯的BAR数    NumericSeries Ht_CurBar;        // 当前BAR在目标周期下对应的CurrentBar    Numeric barCntSum;                 // 临时变量,返回目标周期数据需要回溯的BAR数    NumericSeries Ht_Open;            // 目标时间周期的开盘价    NumericSeries Ht_High;            // 目标时间周期的最高价    NumericSeries Ht_Low;            // 目标时间周期的最低价    NumericSeries Ht_Close;            // 目标时间周期的收盘价    NumericSeries Ht_Vol;            // 目标时间周期的成交量    NumericSeries Ht_OpenInt;        // 目标时间周期的持仓量    bool condition(false);            // 判断在目标时间是否属于不同根BAR    Numeric i;    Begin     TradeDate = TrueDate(0);         // 取实际交易日期    // 根据TimeFrame分别处理    If(TimeFrame == 40320)            // 月线    {        Index = (YearFromDateTime(TradeDate) - 1970) * 12 + MonthFromDateTime(TradeDate);    }    Else If(TimeFrame == 10080)        // 周线    {        Index = IntPart(DateDiff(19700105,TradeDate)/7);    }    Else If(TimeFrame == 1440)        // 日线    {        Index = DateDiff(19700105,TradeDate);    }    Else    {        TradeHour = HourFromDateTime(Time);        TradeMinute = MinuteFromDateTime(Time);        // 取当前品种,第一节交易的开始小时数        SessionStartHour = IntPart(GetSessionStartTime(0)*100);                // 按当前BAR对应时间,除以TimeFrame的分钟数,得到的商为索引值,索引值相同的在大周期上属于同一根BAR        Index = DateDiff(19700105,TradeDate) * (IntPart(1440/TimeFrame)+1) + IntPart((IIF(TradeHour >= SessionStartHour, TradeHour - SessionStartHour,TradeHour + 24 - SessionStartHour) * 60 + TradeMinute)/TimeFrame);    }    // 索引值不同的,则说明属于不同BAR    condition = Index <> Index[1];    If(CurrentBar==0)                // 如果是第一根Bar, Ht_CurBar=0    {        barCnt = InvalidNumeric;        Ht_CurBar = InvalidNumeric;        Ht_Open = InvalidNumeric;        Ht_High = InvalidNumeric;        Ht_Low = InvalidNumeric;        Ht_Close = InvalidNumeric;        Ht_Vol = InvalidNumeric;        Ht_OpenInt = InvalidNumeric;    }    Else    {        If(Condition)                      // 如果在目标周期下,属于另一根K线,则Ht_CurBar加1        {            If(Ht_CurBar[1] == InvalidNumeric)            {                Ht_CurBar = 0;            }            Else            {                Ht_CurBar = Ht_CurBar[1] + 1;            }            barCnt = 1;            Ht_Open = Open;            Ht_High = High;            Ht_Low = Low;            Ht_Vol = Vol;        }        Else        // 如果在目标周期下,属于同一根K线,则Ht_CurBar不变,但最高价和最低价要记录价格的变化,成交量要累加        {            If(Ht_CurBar[1] <> InvalidNumeric)            {                barCnt = barCnt[1] + 1;                Ht_High = Max(Ht_High[1],High);                Ht_Low = Min(Ht_Low[1],Low);                Ht_Vol = Ht_Vol[1] + Vol;            }        }        // 收盘价和持仓量总是取最新值        If(Ht_CurBar <> InvalidNumeric)        {            Ht_Close = Close;            Ht_OpenInt = OpenInt;        }    }        //Commentary("barCnt = "+Text(barCnt));    //Commentary("Ht_CurBar="+text(Ht_CurBar));        //FileAppend("c:\\qqqq.txt","DT="+Text(Date+Time)+" Index="+Text(Index)+" CurrentBar="+Text(CurrentBar)+" barCnt="+text(barCnt)+" Ht_CurBar="+text(Ht_CurBar)+" Ht_Open="+text(Ht_Open)+" Ht_High="+text(Ht_High)    //+" Ht_Low="+Text(Ht_Low)+" Ht_Close="+Text(Ht_Close)+" Ht_Vol="+Text(Ht_Vol)+" Ht_OpenInt="+Text(Ht_OpenInt));        // 前面在当前周期的每根BAR,记录了它对应的目标时间周期的开高低收等数据。    // 接下来把每根BAR对应的数据返回给调用本函数的公式(通过全局变量)    barCntSum = barCnt ;    If(BarsBack == 0)    // 如果BarsBack为0,则当前BAR记录的是当前BAR所对应目标周期的当前BAR截止到目前为止的BAR数据值    {        barCntSum = 0 ;    }    // 如果BarsBack为1,则当前BAR记录的是当前BAR所对应目标周期的前一根BAR的数据值    Else    {        barCntSum = barCnt ;    }    // 将目标时间周期下的BAR数据写入全局变量返回调用公式    SetGlobalVar2("Ht_curbar",Ht_CurBar);    SetGlobalVar2("Ht_open",Ht_Open[barCntSum]);    SetGlobalVar2("Ht_high",Ht_High[barCntSum]);    SetGlobalVar2("Ht_low",Ht_Low[barCntSum]);    SetGlobalVar2("Ht_close",Ht_Close[barCntSum]);    SetGlobalVar2("Ht_vol",Ht_Vol[barCntSum]);    SetGlobalVar2("Ht_openInt",Ht_OpenInt[barCntSum]);    // 将读取大周期数据的回溯BAR数作为函数的返回值返回    Return barCnt;    End  */

最新回复(0)