福利 跨周期的傻瓜式解決方案
作者:開拓者 TB 來(lái)源:cxh99.com 發(fā)布時(shí)間:2015年06月09日
- 咨詢內(nèi)容:
TB的跨周期調(diào)用,論壇以前已經(jīng)有一些解決方案。但對(duì)很多人來(lái)說不夠方便 ,本方案主要參考了追漲殺跌的一些基礎(chǔ)函數(shù),兼顧了使用方便、運(yùn)算性能速度、精確,在具體的算法上如 均線ma 標(biāo)準(zhǔn)差std 等不用因?yàn)閿?shù)據(jù)源的變化而重新編寫算法函數(shù)。
比如close 的ma myValue 的ma 都可以用一個(gè) iMA函數(shù)解決。iMA的形式之所以不用 iMA(iPrice 數(shù)據(jù)源,TimeFrame 時(shí)間周期,Length 算法參數(shù)) 而是選擇 iMA((iPrice 數(shù)據(jù)源,mtBarCnt ,Length1);是為了運(yùn)算速度,否則如果一個(gè)策略多次用到跨周期的算法 函數(shù)內(nèi)部會(huì)多次重復(fù)計(jì)算mtBarCnt值 , 會(huì)影響運(yùn)算速度。
- TB技術(shù)人員:
此函數(shù)是追漲殺跌的MtBar 函數(shù) 為了和后面函數(shù)包的美觀 修改了函數(shù)名
- //------------------------------------------------------------------------
- // 簡(jiǎn)稱: iBar
- // 名稱:
- // 類別: 用戶函數(shù)
- // 類型: 用戶函數(shù)
- // 輸出: 數(shù)值型
- //------------------------------------------------------------------------
- Params
- Numeric TimeFrame(1440);
- // 目標(biāo)時(shí)間周期:月線=40320,周線=10080,日線=1440,4小時(shí)線=240
- // 其他1小時(shí)內(nèi)的周期等于相應(yīng)的分鐘數(shù),如:1小時(shí)=60, 30分鐘=30。。。
- // 支持不規(guī)則分鐘數(shù),如3分鐘,8分鐘,之類都行
-
- Numeric BarsBack(1);
- // 目標(biāo)時(shí)間周期BAR偏移:
- // 1--表示將目標(biāo)時(shí)間周期下的前1根K線數(shù)據(jù)作為與當(dāng)前Bar對(duì)應(yīng)的目標(biāo)時(shí)間周期下的K線數(shù)據(jù)
- // 0--表示將目標(biāo)時(shí)間周期下的截止到目前為止的數(shù)據(jù)轉(zhuǎn)換為與當(dāng)前BAR對(duì)應(yīng)的目標(biāo)時(shí)間周期下K線數(shù)據(jù)
-
- NumericRef oCurBar; // 目標(biāo)時(shí)間周期下的Bar索引
- NumericRef oOPenHT; // 目標(biāo)時(shí)間周期下的開盤價(jià)
- NumericRef oHighHT; // 目標(biāo)時(shí)間周期下的最高價(jià)
- NumericRef oLowHT; // 目標(biāo)時(shí)間周期下的最低價(jià)
- NumericRef oCloseHT; // 目標(biāo)時(shí)間周期下的收盤價(jià)
- NumericRef oVolHT; // 目標(biāo)時(shí)間周期下的成交量
- NumericRef oOpenIntHT; // 目標(biāo)時(shí)間周期下的持倉(cāng)量
- 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 // 其他時(shí)間周期
- {
- 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)
- // 如果在目標(biāo)周期下,屬于另一根K線,則CurBar加1
- {
- barCnt = 1;
- CurBar = CurBar[1] + 1;
- OpenHT = Open;
- HighHT = High;
- LowHT = Low;
- VolHT = Vol;
- }Else
- // 如果在目標(biāo)周期下,屬于同一根K線,則CurBar不變,但最高價(jià)和最低價(jià)要記錄價(jià)格的變化,成交量要累加
- {
- barCnt = barCnt[1] + 1;
- CurBar = CurBar[1];
- OpenHT = OpenHT[1];
- HighHT = Max(HighHT[1],High);
- LowHT = Min(LowHT[1],Low);
- VolHT = VolHT[1] + Vol;
- }
- // 收盤價(jià)和持倉(cāng)量總是取最新值
- CloseHT = Close;
- OpenIntHT = OpenInt;
- }
-
- // 上面的程序,在每根小周期的K線上,記錄了它所屬的大時(shí)間周期下的開高低收等值的變化。
- // 接下來(lái),要把在大的時(shí)間周期級(jí)別上,屬于同一根K線的開高低收這些數(shù)據(jù),記錄在這一組小周期K線的最后一根上。
- barCntSum = barCnt ;
- If(BarsBack == 0)
- // 如果Bar偏移參數(shù)為0,則取每根小周期K線上保留的大時(shí)間周期截止到這根小周期K線為止的BAR數(shù)據(jù)
- {
- barCntSum = 0 ;
- }Else If(BarsBack == 1)
- // 如果Bar偏移參數(shù)為1,則取大時(shí)間周期的上一根K線的BAr數(shù)據(jù)
- {
- barCntSum = barCnt ;
- }Else
- // 如果BAR偏移參數(shù)為其他,則取大時(shí)間周期的指定偏移后的那根K線的BAR數(shù)據(jù)
- {
- For i = 2 To BarsBack
- {
- barCntSum = barCntSum + barCnt[barCntSum];
- }
- }
- // 最后將相應(yīng)的K線數(shù)據(jù)作為引用參數(shù)返回
- oCurBar = CurBar;
- oOpenHT = OpenHT[barCntSum];
- oHighHT = HighHT[barCntSum];
- oLowHT = LowHT[barCntSum];
- oCloseHT = CloseHT[barCntSum];
- oVolHT = VolHT[barCntSum];
- oOpenIntHT = OpenIntHT[barCntSum];
- Return barCnt;
- End
復(fù)制代碼
- TB客服:
iBar 參數(shù)太多 調(diào)用聲明參數(shù)太麻煩 以下為簡(jiǎn)便寫法
- //------------------------------------------------------------------------
- // 簡(jiǎn)稱: inBar
- // 名稱: 讀書山林
- // 類別: 用戶函數(shù)
- // 類型: 用戶函數(shù)
- // 輸出: 數(shù)值型
- //------------------------------------------------------------------------
- Params
- Numeric TimeFrame(1440); // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
- Numeric BarsBack(1); // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
- Vars
- NumericSeries mtBarCnt;
- Numeric refCurBar;
- Numeric refOpen;
- Numeric refHigh;
- Numeric refLow;
- Numeric refClose;
- Numeric refVol;
- Numeric refOpenInt;
-
- Numeric SumValue(0);
- Numeric i;
- Numeric j(0);
- Begin
- mtBarCnt=iBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
- Return mtBarCnt;
- End
復(fù)制代碼
- 網(wǎng)友回復(fù):
本帖最后由 讀書山林 于 2015-5-21 02:19 編輯
跨周期求和函數(shù)- //------------------------------------------------------------------------
- // 簡(jiǎn)稱: iSum
- // 名稱: 跨周期求和函數(shù) 讀書山林
- // 類別: 用戶函數(shù)
- // 類型: 用戶函數(shù)
- // 輸出: 數(shù)值型
- //------------------------------------------------------------------------
- Params
- NumericSeries iPrice(1);
- NumericSeries BarCnt(0);
- Numeric Length(10);
- Vars
- NumericSeries SumValue(0);
- Numeric i;
- Numeric j(0);
- Begin
- If(Length==0)
- {
- Return iPrice;
- }Else
- {
- j=0;
- SumValue = 0;
- For i = 1 to Length
- {
- If (iPrice[j] <> InvalidNumeric)
- {
- SumValue = SumValue + iPrice[j];
- j = j + BarCnt[j];
- }
- else Break;
- }
- }
- Return SumValue;
- End
復(fù)制代碼
- 網(wǎng)友回復(fù):
本帖最后由 讀書山林 于 2015-5-9 00:28 編輯
- //------------------------------------------------------------------------
- // 簡(jiǎn)稱: iMA
- // 名稱: 跨周期求均值 讀書山林
- // 類別: 用戶函數(shù)
- // 類型: 用戶函數(shù)
- // 輸出: 數(shù)值型
- //------------------------------------------------------------------------
- Params
- NumericSeries iPrice(1); //數(shù)據(jù)源必須為跨周期的值 否則不能返回正確值
- NumericSeries mtBarCnt(1) ;
- Numeric Length(10);
- Vars
- Numeric SumValue(0);
- Numeric i;
- Numeric oMA;
- Begin
- SumValue = iSum(iPrice,mtBarCnt,Length);
- oMA = SumValue/Length;
- Return oMA;
- End
復(fù)制代碼iMA 可求任意數(shù)據(jù)源
|