//------------------------------------------------------------------------ // 簡稱: k_Bar // 名稱: 跨周期函數(shù)--基礎(chǔ)BAR數(shù)據(jù) // 類別: 用戶函數(shù) // 類型: 用戶函數(shù) // 輸出: 數(shù)值型 //------------------------------------------------------------------------
Params Numeric TimeFrame(1440); // 目標時間周期:按月線=4周(40320),周線=7天(10080),日線=24小時(1440) // 其他日內(nèi)的周期等于相應的分鐘數(shù),如:1小時=60, 30分鐘=30。。。 // 1分鐘圖表,支持不規(guī)則分鐘數(shù),如3分鐘、8分鐘、14分鐘等 Numeric BarsBack(0); // 目標時間周期BAR偏移: // 1--表示當前周期下的當前BAR對應目標周期的前一根BAR // 0--表示當前周期下的當前BAR對應目標周期的當前BAR截止到目前為止的BAR數(shù)據(jù)值
Vars Numeric TradeDate; // 當前K線實際交易日期(主要解決夜盤問題) Numeric TradeHour; // 當前K線實際交易時間(小時) Numeric TradeMinute; // 當前K線實際交易時間(分鐘) NumericSeries Index; // 當前BAR在TimeFrame時間周期下的索引值 Numeric SessionStartHour; // 當前K線實際的交易日的第一節(jié)交易的起始時間(小時)
NumericSeries barCnt; // 讀取目標周期上一根BAR的數(shù)據(jù)在當前周期下需要回溯的BAR數(shù) NumericSeries Ht_CurBar; // 當前BAR在目標周期下對應的CurrentBar Numeric barCntSum; // 臨時變量,返回目標周期數(shù)據(jù)需要回溯的BAR數(shù) 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); // 取實際交易日期
// 根據(jù)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);
// 取當前品種,第一節(jié)交易的開始小時數(shù) SessionStartHour = IntPart(GetSessionStartTime(0)*100);
// 解決4小時圖的時間劃分比較特殊問題 If(TimeFrame == 240) SessionStartHour = IIF(SessionStartHour == 21,20,8); // 按當前BAR對應時間,除以TimeFrame的分鐘數(shù),得到的商為索引值,索引值相同的在大周期上屬于同一根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,記錄了它對應的目標時間周期的開高低收等數(shù)據(jù)。 // 接下來把每根BAR對應的數(shù)據(jù)返回給調(diào)用本函數(shù)的公式(通過全局變量) barCntSum = barCnt ; If(BarsBack == 0) // 如果BarsBack為0,則當前BAR記錄的是當前BAR所對應目標周期的當前BAR截止到目前為止的BAR數(shù)據(jù)值 { barCntSum = 0 ; } // 如果BarsBack為1,則當前BAR記錄的是當前BAR所對應目標周期的前一根BAR的數(shù)據(jù)值 Else { barCntSum = barCnt ; }
// 將目標時間周期下的BAR數(shù)據(jù)寫入全局變量返回調(diào)用公式 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]);
// 將讀取大周期數(shù)據(jù)的回溯BAR數(shù)作為函數(shù)的返回值返回 Return barCnt; End
/* Params Numeric TimeFrame(1440); // 目標時間周期:按月線=4周(40320),周線=7天(10080),日線=24小時(1440) // 其他日內(nèi)的周期等于相應的分鐘數(shù),如:1小時=60, 30分鐘=30。。。 // 1分鐘圖表,支持不規(guī)則分鐘數(shù),如3分鐘、8分鐘、14分鐘等 Numeric BarsBack(0); // 目標時間周期BAR偏移: // 1--表示當前周期下的當前BAR對應目標周期的前一根BAR // 0--表示當前周期下的當前BAR對應目標周期的當前BAR截止到目前為止的BAR數(shù)據(jù)值
Vars Numeric TradeDate; // 當前K線實際交易日期(主要解決夜盤問題) Numeric TradeHour; // 當前K線實際交易時間(小時) Numeric TradeMinute; // 當前K線實際交易時間(分鐘) NumericSeries Index; // 當前BAR在TimeFrame時間周期下的索引值 Numeric SessionStartHour; // 當前K線實際的交易日的第一節(jié)交易的起始時間(小時)
NumericSeries barCnt; // 讀取目標周期上一根BAR的數(shù)據(jù)在當前周期下需要回溯的BAR數(shù) NumericSeries Ht_CurBar; // 當前BAR在目標周期下對應的CurrentBar Numeric barCntSum; // 臨時變量,返回目標周期數(shù)據(jù)需要回溯的BAR數(shù) 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); // 取實際交易日期
// 根據(jù)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);
// 取當前品種,第一節(jié)交易的開始小時數(shù) SessionStartHour = IntPart(GetSessionStartTime(0)*100); // 按當前BAR對應時間,除以TimeFrame的分鐘數(shù),得到的商為索引值,索引值相同的在大周期上屬于同一根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,記錄了它對應的目標時間周期的開高低收等數(shù)據(jù)。 // 接下來把每根BAR對應的數(shù)據(jù)返回給調(diào)用本函數(shù)的公式(通過全局變量) barCntSum = barCnt ; If(BarsBack == 0) // 如果BarsBack為0,則當前BAR記錄的是當前BAR所對應目標周期的當前BAR截止到目前為止的BAR數(shù)據(jù)值 { barCntSum = 0 ; } // 如果BarsBack為1,則當前BAR記錄的是當前BAR所對應目標周期的前一根BAR的數(shù)據(jù)值 Else { barCntSum = barCnt ; }
// 將目標時間周期下的BAR數(shù)據(jù)寫入全局變量返回調(diào)用公式 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]);
// 將讀取大周期數(shù)據(jù)的回溯BAR數(shù)作為函數(shù)的返回值返回 Return barCnt; End */
|