跨周期數據轉換函數以及跨周期技術指標調用的實現 - TradeBlazer公式 [開拓者 TB]
- 咨詢內容:
本帖最后由 追漲殺跌 于 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, 返回值為數值類型,代碼如下:- Params
- Numeric TimeFrame(1440);
- // 目標時間周期:月線=40320,周線=10080,日線=1440,4小時線=240
- // 其他1小時內的周期等于相應的分鐘數,如:1小時=60, 30分鐘=30。。。
- // 支持不規則分鐘數,如3分鐘,8分鐘,之類都行
-
- Numeric BarsBack(1);
- // 目標時間周期BAR偏移:
- // 1--表示將目標時間周期下的前1根K線數據作為與當前Bar對應的目標時間周期下的K線數據
- // 0--表示將目標時間周期下的截止到目前為止的數據轉換為與當前BAR對應的目標時間周期下K線數據
-
- NumericRef oCurBar; // 目標時間周期下的Bar索引
- NumericRef oOPenHT; // 目標時間周期下的開盤價
- NumericRef oHighHT; // 目標時間周期下的最高價
- NumericRef oLowHT; // 目標時間周期下的最低價
- NumericRef oCloseHT; // 目標時間周期下的收盤價
- NumericRef oVolHT; // 目標時間周期下的成交量
- NumericRef oOpenIntHT; // 目標時間周期下的持倉量
- Vars
- NumericSeries barCnt;
- NumericSeries CurBar;
- NumericSeries barCntSum;
- NumericSeries OpenHT;
- NumericSeries HighHT;
- NumericSeries LowHT;
- NumericSeries CloseHT;
- NumericSeries VolHT;
- NumericSeries OpenIntHT;
- Numeric CurTime;
- Numeric PreTime;
- bool condition(false);
- Numeric i;
- Begin
- If (TimeFrame == 40320) // 月線
- {
- CurTime = Month;
- PreTime = Month[1];
- }
- Else If (TimeFrame == 10080) // 周線
- {
- CurTime = IntPart(DateDiff(19700105,Date)/7);
- PreTime = IntPart(DateDiff(19700105,Date[1])/7);
- }
- Else // 其他時間周期
- {
- CurTime = IntPart((DateDiff(19700105,date)*1440 + Hour*60 + Minute)/TimeFrame);
- PreTime = IntPart((DateDiff(19700105,date[1])*1440 + Hour[1]*60 + Minute[1])/TimeFrame);
- }
- condition = CurTime != PreTime;
- If (CurrentBar==0) // 如果是第一根Bar, CurBar=0
- {
- barCnt = 0;
- CurBar = 0;
- OpenHT = Open;
- HighHT = High;
- LowHT = Low;
- CloseHT = Close;
- VolHT = Vol;
- OpenIntHT = OpenInt;
- }
- Else
- {
- If(Condition)
- // 如果在目標周期下,屬于另一根K線,則CurBar加1
- {
- barCnt = 1;
- CurBar = CurBar[1] + 1;
- OpenHT = Open;
- HighHT = High;
- LowHT = Low;
- VolHT = Vol;
- }Else
- // 如果在目標周期下,屬于同一根K線,則CurBar不變,但最高價和最低價要記錄價格的變化,成交量要累加
- {
- barCnt = barCnt[1] + 1;
- CurBar = CurBar[1];
- OpenHT = OpenHT[1];
- HighHT = Max(HighHT[1],High);
- LowHT = Min(LowHT[1],Low);
- VolHT = VolHT[1] + Vol;
- }
- // 收盤價和持倉量總是取最新值
- CloseHT = Close;
- OpenIntHT = OpenInt;
- }
-
- // 上面的程序,在每根小周期的K線上,記錄了它所屬的大時間周期下的開高低收等值的變化。
- // 接下來,要把在大的時間周期級別上,屬于同一根K線的開高低收這些數據,記錄在這一組小周期K線的最后一根上。
- barCntSum = barCnt ;
- 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];
- }
- }
- // 最后將相應的K線數據作為引用參數返回
- oCurBar = CurBar;
- oOpenHT = OpenHT[barCntSum];
- oHighHT = HighHT[barCntSum];
- oLowHT = LowHT[barCntSum];
- oCloseHT = CloseHT[barCntSum];
- oVolHT = VolHT[barCntSum];
- oOpenIntHT = OpenIntHT[barCntSum];
- Return barCnt;
- End
- Params
- TB技術人員:
忘了說一句,以上代碼是在TB V4中編寫與調試的。
接下來,我們來實現跨周期的求和函數MtSummation,上面的函數中特地返回了一個值oCurBar,就是我上面提到的大周期下的BAR索引值,就是想為實現MtSummationFC留下的伏筆,等以后有時間再解決。現在先還是用最笨的循環累加的算法。- Params
- NumericSeries Price(1);
- NumericSeries BarCnt(0);
- Numeric Length(10);
- Vars
- NumericSeries SumValue(0);
- Numeric i;
- Numeric j(0);
- Begin
- SumValue = 0;
- For i = 1 to Length
- {
- If (Price[j] <> InvalidNumeric)
- {
- SumValue = SumValue + Price[j];
- j = j + BarCnt[j];
- }
- else Break;
- }
- Return SumValue;
- End
- Params
- TB客服:
接下來,就可以實現計算跨周期簡單移動平均的函數MtMa。
- Params
- Numeric TimeFrame(1440); // 目標時間周期參數,參數說明參見MtBar
- Numeric BarsBack(1); // 目標時間周期BAR偏移參數,說明見MtBar函數
- Numeric Length(10); // 均線周期
- NumericRef oMA; // 以目標時間周期下的K線數據計算出的移動平均線
- Vars
- NumericSeries mtBarCnt;
- NumericSeries mtClose;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
-
- Numeric SumValue(0);
- Numeric i;
- Numeric j(0);
- Begin
- mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- mtClose = refClose;
- SumValue = MtSummation(mtClose,mtBarCnt,Length);
- oMA = SumValue/Length;
- Return mtBarCnt;
- End
- Params
- 網友回復:
現在可以舉個例子來說明,怎么用上面的幾個函數來做交易策略了。假如我們的策略如下:
1、我們以日線的均線交叉來判斷大趨勢,然后在5分鐘圖上來做交易;
2、日線的短期均線上穿長期均線,則只做多,不做空;反之只做空,不做多;
3、確定了大趨勢后,我們再根據5分鐘圖來判斷小趨勢,以決定進場時機。我們仍然用均線來判斷,在多頭大趨勢下,如果5分鐘的短期均線上穿長期均線,則進場做多,反穿出場,但不反手做空;在空頭大趨勢下,類似;
我們在5分鐘圖上調用剛才的函數的來實現。新建公式應用TestMtMa,代碼如下:- Params
- Numeric TimeFrame(1440); // 目標時間周期參數,參數說明參見MtBar
- Numeric BarsBack(1); // 目標時間周期BAR偏移參數,說明見MtBar函數
- Numeric Length1(10); // 大周期的短期均線周期
- Numeric Length2(20); // 大周期的長期均線周期
- Numeric Length3(10); // 小周期的短期均線周期
- Numeric Length4(20); // 小周期的長期均線周期
- Numeric Lots(1);
- Vars
- NumericSeries MA1;
- NumericSeries MA2;
- Numeric oMA1;
- Numeric oMA2;
- NumericSeries MA3;
- NumericSeries MA4;
- Begin
- MtMa(TimeFrame,BarsBack,Length1,oMA1);
- MA1 = oMA1;
- PlotNumeric("MA1",MA1);
- MtMa(TimeFrame,BarsBack,Length2,oMA2);
- MA2 = oMA2;
- PlotNumeric("MA2",MA2);
- MA3 = AverageFC(Close,Length3);
- MA4 = AverageFC(Close,Length4);
- PlotNumeric("MA3",MA3);
- PlotNumeric("MA4",MA4);
-
-
- If (MA1>MA2) // 大周期均線金叉,多頭趨勢
- {
- if (MarketPosition!=1 and MA3[1]>MA4[1])
- {
- Buy(Lots,Open);
- }
- if (MarketPosition==1 and MA3[1]<MA4[1])
- {
- Sell(Lots,Open);
- }
- }
- If (MA1<MA2) // 大周期均線死叉,空頭趨勢
- {
- if (MarketPosition!=-1 and MA3[1]<MA4[1])
- {
- SellShort(Lots,Open);
- }
- if (MarketPosition==-1 and MA3[1]>MA4[1])
- {
- BuyToCover(Lots,Open);
- }
- }
- End
- Params
- 網友回復:
如果上面的策略,我們不想用日線均線來判斷大趨勢,而改用小時線來判斷,則只要將參數TimeFrame改為60, 就可以了。
有思路,想編寫各種指標公式,程序化交易模型,選股公式,預警公式的朋友
可聯系技術人員 QQ: 262069696 進行 有償 編寫!(不貴!點擊查看價格!)
相關文章
-
沒有相關內容