一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

跨周期數(shù)據(jù)轉(zhuǎn)換函數(shù)以及跨周期技術(shù)指標(biāo)調(diào)用的實(shí)現(xiàn)

 禁忌石 2011-09-10
跨周期數(shù)據(jù)轉(zhuǎn)換函數(shù)以及跨周期技術(shù)指標(biāo)調(diào)用的實(shí)現(xiàn)
本帖最后由 追漲殺跌 于 2011-7-10 19:44 編輯

TB的跨周期調(diào)用,以前已經(jīng)有一些解決方案。但總體來說,使用還不夠方便。以前的帖子中Nopain曾提出過一個(gè)算法,非常精巧。最近在這個(gè)算法的基礎(chǔ)上, 把整個(gè)實(shí)現(xiàn)方法完善了一下。下面把總體思路和函數(shù)代碼貼出來,請大家試用,也歡迎大家提出修改意見。

總體思路:
1、還是小周期調(diào)用大周期的數(shù)據(jù),這樣才能保證盤中和盤后結(jié)果一樣。大周期調(diào)用小周期,我個(gè)人覺得很難實(shí)現(xiàn),也沒有必要;
2、具體方法是新編一個(gè)函數(shù),用來根據(jù)小周期下的數(shù)據(jù)推算出大周期的BAR數(shù)據(jù),為了省事,計(jì)算時(shí),會(huì)將大周期下的開高低收以及成交量和持倉量等數(shù)據(jù)都算出來,然后將這些數(shù)據(jù)通過引用參數(shù)返回。當(dāng)然有的朋友可能只需要一個(gè)收盤價(jià)就可以了,那樣的話,可以自行修改這個(gè)函數(shù),把多余的數(shù)據(jù)去掉;
3、返回的大周期數(shù)據(jù)將以序列變量的形式保留在對應(yīng)的小周期K線上,以便以后調(diào)用;
4、另外為了便于大周期的數(shù)據(jù)計(jì)算出來后的回溯使用,函數(shù)會(huì)將小周期下當(dāng)前BAR到大周期下的前一個(gè)BAR的最后一個(gè)小周期BAR需要回溯的BAR數(shù)目,作為函數(shù)的結(jié)果返回。這句話,不容易描述清楚,估計(jì)大家聽起來也費(fèi)力,但沒關(guān)系,后面用例子來解釋,知道這回事就行了。
5、另外還增加了一個(gè)返回值(也是通過引用參數(shù)返回),表示的是當(dāng)前小周期K線對應(yīng)的大周期K線在整個(gè)大周期中的索引值。舉例來說,5分鐘圖,樣本數(shù)300,那轉(zhuǎn)換成30分鐘周期圖,總共應(yīng)該是50根K線,那最新一根5分鐘圖對應(yīng)的30分鐘K線在整個(gè)30分鐘圖中的索引值就應(yīng)該是49(類似CurrentBar 0-49);

好,其他先不廢話,把代碼貼出來,再舉幾個(gè)例子。

新建用戶函數(shù)MtBar, 返回值為數(shù)值類型,代碼如下:
  1. Params
  2.         Numeric TimeFrame(1440);    // 目標(biāo)時(shí)間周期:月線=40320,周線=10080,日線=1440,4小時(shí)線=240 其他周期等于相應(yīng)的分鐘數(shù),如:1小時(shí)=60 30分鐘=30。。。
  3.         Numeric BarsBack(1);            // 目標(biāo)時(shí)間周期BAR偏移:1--表示將目標(biāo)時(shí)間周期下的前1根K線數(shù)據(jù)作為與當(dāng)前Bar對應(yīng)的目標(biāo)時(shí)間周期下的K線數(shù)據(jù)
  4.                                  //            0--表示將目標(biāo)時(shí)間周期下的截止到目前為止的數(shù)據(jù)轉(zhuǎn)換為與當(dāng)前BAR對應(yīng)的目標(biāo)時(shí)間周期下K線數(shù)據(jù)
  5.         NumericRef oCurBar;            // 目標(biāo)時(shí)間周期下的Bar索引
  6.         NumericRef oOPenHT;         // 目標(biāo)時(shí)間周期下的開盤價(jià)
  7.         NumericRef oHighHT;         // 目標(biāo)時(shí)間周期下的最高價(jià)
  8.         NumericRef oLowHT;          // 目標(biāo)時(shí)間周期下的最低價(jià)
  9.         NumericRef oCloseHT;        // 目標(biāo)時(shí)間周期下的收盤價(jià)
  10.         NumericRef oVolHT;          // 目標(biāo)時(shí)間周期下的成交量
  11.         NumericRef oOpenIntHT;      // 目標(biāo)時(shí)間周期下的持倉量

  12.  
  13. Vars
  14.         NumericSeries barCnt;
  15.         NumericSeries CurBar;
  16.         NumericSeries barCntSum;
  17.         NumericSeries OpenHT;
  18.         NumericSeries HighHT;
  19.         NumericSeries LowHT;
  20.         NumericSeries CloseHT;
  21.         NumericSeries VolHT;
  22.         NumericSeries OpenIntHT;
  23.         Numeric CurTime;
  24.         Numeric PreTime;
  25.         bool condition(false);
  26.         Numeric i;
  27. Begin
  28.         If (TimeFrame == 40320)                 // 月線
  29.         {
  30.                 CurTime = Month;
  31.                 PreTime = Month[1];
  32.         }
  33.         Else If (TimeFrame == 10080)
  34.         {
  35.                 CurTime = IntPart(DateDiff(19700105,Date)/7);
  36.                 PreTime = IntPart(DateDiff(19700105,Date[1])/7);
  37.         }
  38.         Else
  39.         {
  40.                 CurTime = IntPart((DateDiff(19700105,date)*1440 + Hour*60 + Minute)/TimeFrame);
  41.                 PreTime = IntPart((DateDiff(19700105,date[1])*1440 + Hour[1]*60 + Minute[1])/TimeFrame);
  42.         }
  43.         condition = CurTime != PreTime;

  44.  
  45.         If (CurrentBar==0)                // 如果是第一根Bar, CurBar=0
  46.         {
  47.                 barCnt = 0;
  48.                 CurBar = 0;
  49.                 OpenHT = Open;
  50.                 HighHT = High;
  51.                 LowHT = Low;
  52.                 CloseHT = Close;
  53.                 VolHT = Vol;
  54.                 OpenIntHT = OpenInt;
  55.         }
  56.         Else
  57.         {
  58.                 If(Condition)                // 如果在目標(biāo)周期下,屬于另一根K線,則CurBar加1
  59.                 {
  60.                         barCnt = 1;
  61.                         CurBar = CurBar[1] + 1;
  62.                         OpenHT = Open;
  63.                         HighHT = High;
  64.                         LowHT = Low;
  65.                         VolHT = Vol;
  66.                 }Else                                // 如果在目標(biāo)周期下,屬于同一根K線,則CurBar不變,但最高價(jià)和最低價(jià)要記錄價(jià)格的變化,成交量要累加
  67.                 {
  68.                         barCnt = barCnt[1] + 1;
  69.                         CurBar = CurBar[1];
  70.                         OpenHT = OpenHT[1];
  71.                         HighHT = Max(HighHT[1],High);
  72.                         LowHT = Min(LowHT[1],Low);
  73.                         VolHT = VolHT[1] + Vol;
  74.                         //FileAppend("d:\\test.log","222 CurrentBar="+text(CurrentBar)+" BarCnt="+text(BarCnt)+" CurBar="+text(oCurBar)+" O="+Text(OpenHt)+" H="+Text(HighHT)+" L="+Text(LowHT)+" C="+Text(CloseHT));
  75.                 }
  76.                 // 收盤價(jià)和持倉量總是取最新值
  77.                 CloseHT = Close;
  78.                 OpenIntHT = OpenInt;
  79.         }
  80.        
  81.         // 上面的程序,在每根小周期的K線上,記錄了它所屬的大時(shí)間周期下的開高低收等值的變化。
  82.         // 其中大周期的最終收盤數(shù)據(jù),記錄在這一組小周期K線的最后一根上。
  83.         barCntSum = barCnt ;
  84.         If(BarsBack == 0)                                // 如果Bar偏移參數(shù)為0,則取每根小周期K線上保留的大時(shí)間周期截止到這根小周期K線為止的BAR數(shù)據(jù)
  85.         {
  86.                 barCntSum = 0 ;
  87.         }Else If(BarsBack == 1)                // 如果Bar偏移參數(shù)為1,則取大時(shí)間周期的上一根K線的BAr數(shù)據(jù)
  88.         {
  89.                 barCntSum = barCnt ;
  90.         }Else                                                        // 如果BAR偏移參數(shù)為其他,則取大時(shí)間周期的指定偏移后的那根K線的BAR數(shù)據(jù)
  91.         {
  92.                 For i = 2 To BarsBack
  93.                 {
  94.                         barCntSum = barCntSum + barCnt[barCntSum];
  95.                 }
  96.         }

  97.  
  98.         // 最后將相應(yīng)的K線數(shù)據(jù)作為引用參數(shù)返回
  99.         oCurBar = CurBar;
  100.         oOpenHT = OpenHT[barCntSum];
  101.         oHighHT = HighHT[barCntSum];
  102.         oLowHT = LowHT[barCntSum];
  103.         oCloseHT = CloseHT[barCntSum];
  104.         oVolHT = VolHT[barCntSum];
  105.         oOpenIntHT = OpenIntHT[barCntSum];
  106.         Return barCnt;
  107. End
 
 
呵呵, 代碼貼得有點(diǎn)亂,整理一下,重發(fā)過。
  1. Params
  2.         Numeric TimeFrame(1440);   
  3.         // 目標(biāo)時(shí)間周期:月線=40320,周線=10080,日線=1440,4小時(shí)線=240
  4.         // 其他1小時(shí)內(nèi)的周期等于相應(yīng)的分鐘數(shù),如:1小時(shí)=60, 30分鐘=30。。。
  5.         // 支持不規(guī)則分鐘數(shù),如3分鐘,8分鐘,之類都行
  6.        
  7.         Numeric BarsBack(1);
  8.         // 目標(biāo)時(shí)間周期BAR偏移:
  9.         // 1--表示將目標(biāo)時(shí)間周期下的前1根K線數(shù)據(jù)作為與當(dāng)前Bar對應(yīng)的目標(biāo)時(shí)間周期下的K線數(shù)據(jù)
  10.         // 0--表示將目標(biāo)時(shí)間周期下的截止到目前為止的數(shù)據(jù)轉(zhuǎn)換為與當(dāng)前BAR對應(yīng)的目標(biāo)時(shí)間周期下K線數(shù)據(jù)
  11.        
  12.         NumericRef oCurBar;                 // 目標(biāo)時(shí)間周期下的Bar索引
  13.         NumericRef oOPenHT;         // 目標(biāo)時(shí)間周期下的開盤價(jià)
  14.         NumericRef oHighHT;         // 目標(biāo)時(shí)間周期下的最高價(jià)
  15.         NumericRef oLowHT;          // 目標(biāo)時(shí)間周期下的最低價(jià)
  16.         NumericRef oCloseHT;        // 目標(biāo)時(shí)間周期下的收盤價(jià)
  17.         NumericRef oVolHT;          // 目標(biāo)時(shí)間周期下的成交量
  18.         NumericRef oOpenIntHT;      // 目標(biāo)時(shí)間周期下的持倉量

  19.  
  20. Vars
  21.         NumericSeries barCnt;
  22.         NumericSeries CurBar;
  23.         NumericSeries barCntSum;
  24.         NumericSeries OpenHT;
  25.         NumericSeries HighHT;
  26.         NumericSeries LowHT;
  27.         NumericSeries CloseHT;
  28.         NumericSeries VolHT;
  29.         NumericSeries OpenIntHT;
  30.         Numeric CurTime;
  31.         Numeric PreTime;
  32.         bool condition(false);
  33.         Numeric i;
  34. Begin
  35.         If (TimeFrame == 40320)                 // 月線
  36.         {
  37.                 CurTime = Month;
  38.                 PreTime = Month[1];
  39.         }
  40.         Else If (TimeFrame == 10080)                        // 周線
  41.         {
  42.                 CurTime = IntPart(DateDiff(19700105,Date)/7);
  43.                 PreTime = IntPart(DateDiff(19700105,Date[1])/7);
  44.         }
  45.         Else                                                                        // 其他時(shí)間周期
  46.         {
  47.                 CurTime = IntPart((DateDiff(19700105,date)*1440 + Hour*60 + Minute)/TimeFrame);
  48.                 PreTime = IntPart((DateDiff(19700105,date[1])*1440 + Hour[1]*60 + Minute[1])/TimeFrame);
  49.         }
  50.         condition = CurTime != PreTime;

  51.  
  52.         If (CurrentBar==0)                // 如果是第一根Bar, CurBar=0
  53.         {
  54.                 barCnt = 0;
  55.                 CurBar = 0;
  56.                 OpenHT = Open;
  57.                 HighHT = High;
  58.                 LowHT = Low;
  59.                 CloseHT = Close;
  60.                 VolHT = Vol;
  61.                 OpenIntHT = OpenInt;
  62.         }
  63.         Else
  64.         {
  65.                 If(Condition)               
  66.                 // 如果在目標(biāo)周期下,屬于另一根K線,則CurBar加1
  67.                 {
  68.                         barCnt = 1;
  69.                         CurBar = CurBar[1] + 1;
  70.                         OpenHT = Open;
  71.                         HighHT = High;
  72.                         LowHT = Low;
  73.                         VolHT = Vol;
  74.                 }Else
  75.                 // 如果在目標(biāo)周期下,屬于同一根K線,則CurBar不變,但最高價(jià)和最低價(jià)要記錄價(jià)格的變化,成交量要累加
  76.                 {
  77.                         barCnt = barCnt[1] + 1;
  78.                         CurBar = CurBar[1];
  79.                         OpenHT = OpenHT[1];
  80.                         HighHT = Max(HighHT[1],High);
  81.                         LowHT = Min(LowHT[1],Low);
  82.                         VolHT = VolHT[1] + Vol;
  83.                 }
  84.                 // 收盤價(jià)和持倉量總是取最新值
  85.                 CloseHT = Close;
  86.                 OpenIntHT = OpenInt;
  87.         }
  88.        
  89.         // 上面的程序,在每根小周期的K線上,記錄了它所屬的大時(shí)間周期下的開高低收等值的變化。
  90.         // 接下來,要把在大的時(shí)間周期級別上,屬于同一根K線的開高低收這些數(shù)據(jù),記錄在這一組小周期K線的最后一根上。
  91.         barCntSum = barCnt ;
  92.         If(BarsBack == 0)
  93.         // 如果Bar偏移參數(shù)為0,則取每根小周期K線上保留的大時(shí)間周期截止到這根小周期K線為止的BAR數(shù)據(jù)
  94.         {
  95.                 barCntSum = 0 ;
  96.         }Else If(BarsBack == 1)
  97.         // 如果Bar偏移參數(shù)為1,則取大時(shí)間周期的上一根K線的BAr數(shù)據(jù)
  98.         {
  99.                 barCntSum = barCnt ;
  100.         }Else
  101.         // 如果BAR偏移參數(shù)為其他,則取大時(shí)間周期的指定偏移后的那根K線的BAR數(shù)據(jù)
  102.         {
  103.                 For i = 2 To BarsBack
  104.                 {
  105.                         barCntSum = barCntSum + barCnt[barCntSum];
  106.                 }
  107.         }

  108.  
  109.         // 最后將相應(yīng)的K線數(shù)據(jù)作為引用參數(shù)返回
  110.         oCurBar = CurBar;
  111.         oOpenHT = OpenHT[barCntSum];
  112.         oHighHT = HighHT[barCntSum];
  113.         oLowHT = LowHT[barCntSum];
  114.         oCloseHT = CloseHT[barCntSum];
  115.         oVolHT = VolHT[barCntSum];
  116.         oOpenIntHT = OpenIntHT[barCntSum];
  117.         Return barCnt;
  118. End
 
 
 
忘了說一句,以上代碼是在TB V4中編寫與調(diào)試的。

接下來,我們來實(shí)現(xiàn)跨周期的求和函數(shù)MtSummation,上面的函數(shù)中特地返回了一個(gè)值oCurBar,就是我上面提到的大周期下的BAR索引值,就是想為實(shí)現(xiàn)MtSummationFC留下的伏筆,等以后有時(shí)間再解決?,F(xiàn)在先還是用最笨的循環(huán)累加的算法。
  1. Params
  2.         NumericSeries Price(1);
  3.         NumericSeries BarCnt(0);
  4.         Numeric Length(10);
  5. Vars
  6.         NumericSeries SumValue(0);
  7.         Numeric i;
  8.         Numeric j(0);
  9. Begin
  10.         SumValue = 0;
  11.         For i = 1 to Length
  12.         {
  13.                 If (Price[j] <> InvalidNumeric)
  14.                 {
  15.                         SumValue = SumValue + Price[j];
  16.                         j = j + BarCnt[j];
  17.                 }
  18.                 else Break;
  19.         }
  20.         Return SumValue;
  21. End
 
 
 
接下來,就可以實(shí)現(xiàn)計(jì)算跨周期簡單移動(dòng)平均的函數(shù)MtMa。
  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);                // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric Length(10);                        // 均線周期
  5.         NumericRef oMA;             // 以目標(biāo)時(shí)間周期下的K線數(shù)據(jù)計(jì)算出的移動(dòng)平均線
  6. Vars
  7.         NumericSeries mtBarCnt;
  8.         NumericSeries mtClose;
  9.         Numeric refCurBar;
  10.         Numeric refOpen;
  11.         Numeric refHigh;
  12.         Numeric refLow;
  13.         Numeric refClose;
  14.         Numeric refVol;
  15.         Numeric refOpenInt;
  16.        
  17.         Numeric SumValue(0);
  18.         Numeric i;
  19.         Numeric j(0);
  20. Begin
  21.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  22.         mtClose = refClose;

  23.  
  24.         SumValue = MtSummation(mtClose,mtBarCnt,Length);
  25.         oMA = SumValue/Length;
  26.         Return mtBarCnt;
  27. End
 
 
 
現(xiàn)在可以舉個(gè)例子來說明,怎么用上面的幾個(gè)函數(shù)來做交易策略了。假如我們的策略如下:
1、我們以日線的均線交叉來判斷大趨勢,然后在5分鐘圖上來做交易;
2、日線的短期均線上穿長期均線,則只做多,不做空;反之只做空,不做多;
3、確定了大趨勢后,我們再根據(jù)5分鐘圖來判斷小趨勢,以決定進(jìn)場時(shí)機(jī)。我們?nèi)匀挥镁€來判斷,在多頭大趨勢下,如果5分鐘的短期均線上穿長期均線,則進(jìn)場做多,反穿出場,但不反手做空;在空頭大趨勢下,類似;
我們在5分鐘圖上調(diào)用剛才的函數(shù)的來實(shí)現(xiàn)。新建公式應(yīng)用TestMtMa,代碼如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);                // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)

  4.  
  5.         Numeric Length1(10);                // 大周期的短期均線周期               
  6.         Numeric Length2(20);                // 大周期的長期均線周期
  7.         Numeric Length3(10);                // 小周期的短期均線周期
  8.         Numeric Length4(20);                // 小周期的長期均線周期
  9.         Numeric Lots(1);
  10. Vars
  11.         NumericSeries MA1;
  12.         NumericSeries MA2;
  13.         Numeric oMA1;
  14.         Numeric oMA2;

  15.  
  16.         NumericSeries MA3;
  17.         NumericSeries MA4;
  18. Begin
  19.         MtMa(TimeFrame,BarsBack,Length1,oMA1);
  20.         MA1 = oMA1;
  21.         PlotNumeric("MA1",MA1);
  22.         MtMa(TimeFrame,BarsBack,Length2,oMA2);
  23.         MA2 = oMA2;
  24.         PlotNumeric("MA2",MA2);
  25.         MA3 = AverageFC(Close,Length3);
  26.         MA4 = AverageFC(Close,Length4);
  27.         PlotNumeric("MA3",MA3);
  28.         PlotNumeric("MA4",MA4);
  29.        
  30.        
  31.         If (MA1>MA2)                // 大周期均線金叉,多頭趨勢
  32.         {
  33.                 if (MarketPosition!=1 and MA3[1]>MA4[1])
  34.                 {
  35.                         Buy(Lots,Open);
  36.                 }
  37.                 if (MarketPosition==1 and MA3[1]<MA4[1])
  38.                 {
  39.                         Sell(Lots,Open);
  40.                 }
  41.         }
  42.         If (MA1<MA2)                // 大周期均線死叉,空頭趨勢
  43.         {
  44.                 if (MarketPosition!=-1 and MA3[1]<MA4[1])
  45.                 {
  46.                         SellShort(Lots,Open);
  47.                 }
  48.                 if (MarketPosition==-1 and MA3[1]>MA4[1])
  49.                 {
  50.                         BuyToCover(Lots,Open);
  51.                 }
  52.         }
  53. End
復(fù)制代碼
 
 
 
如果上面的策略,我們不想用日線均線來判斷大趨勢,而改用小時(shí)線來判斷,則只要將參數(shù)TimeFrame改為60, 就可以了。
 
 
 

很好很強(qiáng)大,慢慢學(xué)習(xí)。   使用起來非常方便啊,只要修改時(shí)間參數(shù)就行了,十分感謝?。?/div>
 
 
 
 
謝謝道勤的鼓勵(lì)! 繼續(xù)把其他幾個(gè)常用指標(biāo)的跨周期函數(shù)貼出來。
新建MtMacd函數(shù),代碼如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);         // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric FastLength(12);
  5.         Numeric SlowLength(26);
  6.         Numeric MACDLength(9);
  7.        
  8.         NumericRef oMACDValue;      // 以目標(biāo)時(shí)間周期下的K線數(shù)據(jù)計(jì)算出的MACDValue
  9.         NumericRef oAvgMACD;        // 以目標(biāo)時(shí)間周期下的K線數(shù)據(jù)計(jì)算出的AvgMACD

  10.  
  11. Vars
  12.         NumericSeries mtBarCnt;
  13.         NumericSeries mtCurBar;
  14.         NumericSeries mtClose;
  15.         Numeric refCurBar;
  16.         Numeric refOpen;
  17.         Numeric refHigh;
  18.         Numeric refLow;
  19.         Numeric refClose;
  20.         Numeric refVol;
  21.         Numeric refOpenInt;
  22.        
  23.         NumericSeries MACDValue;
  24.         NumericSeries AvgMACD;
  25.         Numeric sFcactor;
  26.         NumericSeries XAvgValue1;
  27.         NumericSeries XAvgValue2;
  28.        
  29. Begin

  30.  
  31.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  32.         mtCurBar = refCurBar;
  33.         mtClose = refClose;
  34.        
  35.         sFcactor = 2 / ( FastLength + 1 );
  36.         if (MtCurBar == 0 || XAvgValue1[mtBarCnt] == InvalidNumeric) XAvgValue1 = mtClose;
  37.         else XAvgValue1 = XAvgValue1[mtBarCnt] + sFcactor * ( mtClose - XAvgValue1[mtBarCnt] ) ;

  38.  
  39.         sFcactor = 2 / ( SlowLength + 1 );
  40.         if (MtCurBar == 0 || XAvgValue2[mtBarCnt] == InvalidNumeric) XAvgValue2 = mtClose;
  41.         else XAvgValue2 = XAvgValue2[mtBarCnt] + sFcactor * ( mtClose - XAvgValue2[mtBarCnt] ) ;

  42.  
  43.         MACDValue = XAvgValue1 - XAvgValue2;

  44.  
  45.         sFcactor = 2 / ( MACDLength + 1 );
  46.         if (MtCurBar == 0 || AvgMACD[mtBarCnt] == InvalidNumeric) AvgMACD = MACDValue;
  47.         else AvgMACD = AvgMACD[mtBarCnt] + sFcactor * ( MACDValue - AvgMACD[mtBarCnt] ) ;

  48.  
  49.         oMACDValue = MACDValue;
  50.         oAvgMACD = AvgMACD;
  51.         return mtBarCnt;
  52. End

 
編譯好上面的MtMacd函數(shù)后,以后就可以隨時(shí)通過調(diào)用這個(gè)函數(shù)來顯示跨周期的MACD指標(biāo),以及在小周期上根據(jù)大周期的MACD指標(biāo)進(jìn)行交易,下面繼續(xù)舉個(gè)例子,也是在V4中實(shí)現(xiàn),把指標(biāo)和交易指令放在一個(gè)公式應(yīng)用中,注意要在“屬性設(shè)置”中,設(shè)置成“子圖顯示”。這次簡單點(diǎn),沒有做成多周期共振,只是簡單地在5分鐘圖表上,根據(jù)30分鐘的MACD指標(biāo)交叉來進(jìn)行交易,代碼如下:
  1. Params
  2.         Numeric TimeFrame(30);                // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);                 // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric FastLength(12);
  5.         Numeric SlowLength(26);
  6.         Numeric MACDLength(9);
  7.     Numeric Lots(1);
  8. Vars
  9.         NumericSeries MACDValue;
  10.         NumericSeries AvgMACD;
  11.         NumericSeries MACDDiff;
  12.         Numeric ooMACDValue;
  13.         Numeric ooAvgMACD;
  14.         Numeric PreBar;
  15. Begin
  16.         PreBar = MtMACD(TimeFrame,BarsBack,FastLength,SlowLength,MACDLength,ooMACDValue,ooAvgMACD);
  17.         MACDVAlue = ooMACDValue;
  18.         AvgMACD = ooAvgMACD;
  19.         MACDDiff = MACDValue - AvgMACD;

  20.         PlotNumeric("MACD",MACDValue);
  21.         PlotNumeric("MACDAvg",AvgMACD);
  22.         If (MACDDiff >= 0)       
  23.                 PlotNumeric("MACDDiff",MACDDiff,0,Red);
  24.         Else
  25.                 PlotNumeric("MACDDiff",MACDDiff,0,Green);
  26.         PlotNumeric("零線",0);

  27.         If (MacdDiff[PreBar]<0 and MacdDiff>0)
  28.         {
  29.                 Buy(Lots,Open);
  30.         }
  31.         If (MacdDiff[PreBar]>0 and MacdDiff<0)
  32.         {
  33.                 SellShort(Lots,Open);
  34.         }
  35. End
 
先滿足haomai01朋友的需要, 把跨周期DMI函數(shù)先貼出來。函數(shù)名MtDMI
  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);                 // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric Length(14);
  5.         NumericRef oDMIPlus;
  6.         NumericRef oDMIMinus;
  7.         NumericRef oADX;
  8. Vars
  9.         NumericSeries mtBarCnt;
  10.         NumericSeries mtHigh;
  11.         NumericSeries mtLow;
  12.         NumericSeries mtClose;
  13.         Numeric refCurBar;
  14.         Numeric refOpen;
  15.         Numeric refHigh;
  16.         Numeric refLow;
  17.         Numeric refClose;
  18.         Numeric refVol;
  19.         Numeric refOpenInt;

  20.         NumericSeries DMIPlus;
  21.         NumericSeries DMIMinus;
  22.         NumericSeries DMI;
  23.         NumericSeries ADX;
  24.         NumericSeries ADXR;
  25.         NumericSeries Volty;
  26.         NumericSeries sDMI;
  27.         NumericSeries sADX;
  28.         NumericSeries sVolty;
  29.         Numeric PlusDM;
  30.         Numeric MinusDM;
  31.         Numeric UpperMove;
  32.         Numeric LowerMove;
  33.         Numeric SumPlusDM(0);
  34.         Numeric SumMinusDM(0);
  35.         Numeric SumTR(0);
  36.         NumericSeries AvgPlusDM;
  37.         NumericSeries AvgMinusDM;
  38.         Numeric SF;                        // smoothing factor
  39.         Numeric Divisor;
  40.         BoolSeries bStopLoop;
  41.         Numeric i;
  42.         Numeric j(0);
  43.         Numeric K;
  44.         Numeric nbHigh;
  45.         NumericSeries TRValue;
  46.         Numeric CumValue(0);
  47. Begin
  48.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  49.         mtHigh = refHigh;
  50.         mtLow = refLow;
  51.         mtClose = refClose;
  52.        
  53.         SF = 1/Length;

  54.         TRValue = IIF(mtHigh >= mtClose[mtBarCnt],mtHigh,mtClose[mtBarCnt]) - IIF(mtLow <= mtClose[mtBarCnt],mtLow,mtClose[mtBarCnt]);

  55.         bStopLoop = bStopLoop[1];
  56.         If (bStopLoop!=true)
  57.         {
  58.                 j = 0;
  59.                 For i = 0 to Length
  60.                 {
  61.                         If (mtHigh[j] == InvalidNumeric)
  62.                         {
  63.                                 nbHigh = InvalidNumeric;
  64.                                 i = Length + 1;
  65.                         }
  66.                         Else
  67.                         {
  68.                                 nbHigh = mtHigh[j];
  69.                                 j = j + mtBarCnt[j];
  70.                         }
  71.                 }
  72.                 if(nbHigh!=InvalidNumeric and mtHigh[j] != InvalidNumeric) bStopLoop = true;
  73.         }
  74.         If(nbHigh == InvalidNumeric)
  75.         {
  76.                 DMIPlus = InvalidNumeric;
  77.                 DMIMinus = InvalidNumeric;
  78.                 DMI = InvalidNumeric;
  79.                 ADX = InvalidNumeric;
  80.                 ADXR = InvalidNumeric;
  81.                 Volty = InvalidNumeric;
  82.                 //RSIValue = InvalidNumeric;
  83.         }Else
  84.         {
  85.                 If(bStopLoop !=true)
  86.                 {
  87.                         j = 0;
  88.                         K = 0;
  89.                         For i = 1 To Length
  90.                         {
  91.                                 j = K + mtBarCnt[K];

  92.                                 PlusDM = 0 ;
  93.                                 MinusDM = 0 ;
  94.                                 UpperMove = High[K] - High[j] ;
  95.                                 LowerMove = Low[j] - Low[K] ;
  96.                                 if (UpperMove > LowerMove and UpperMove > 0 )
  97.                                 {
  98.                                         PlusDM = UpperMove;
  99.                                 }else if (LowerMove > UpperMove and LowerMove > 0)
  100.                                 {
  101.                                         MinusDM = LowerMove ;
  102.                                 }
  103.                                 SumPlusDM = SumPlusDM + PlusDM ;
  104.                                 SumMinusDM = SumMinusDM + MinusDM ;
  105.                                 SumTR = SumTR + TRValue[K] ;

  106.                                 K = j ;
  107.                         }
  108.                         AvgPlusDM = SumPlusDM / Length ;
  109.                         AvgMinusDM = SumMinusDM / Length ;
  110.                         sVolty = SumTR / Length ;
  111.                 }
  112.                 Else
  113.                 {
  114.                         PlusDM = 0 ;
  115.                         MinusDM = 0 ;
  116.                         UpperMove = mtHigh - mtHigh[mtBarCnt] ;
  117.                         LowerMove = mtLow[mtBarCnt] - mtLow ;
  118.                         if (UpperMove > LowerMove and UpperMove > 0 )
  119.                         {
  120.                                 PlusDM = UpperMove;
  121.                         }else if (LowerMove > UpperMove and LowerMove > 0 )
  122.                         {
  123.                                 MinusDM = LowerMove ;
  124.                         }
  125.                         AvgPlusDM = AvgPlusDM[mtBarCnt] + SF * ( PlusDM - AvgPlusDM[mtBarCnt] ) ;
  126.                         AvgMinusDM = AvgMinusDM[mtBarCnt] + SF * ( MinusDM - AvgMinusDM[mtBarCnt] ) ;
  127.                         sVolty = sVolty[mtBarCnt] + SF * ( TRValue  - sVolty[mtBarCnt] ) ;
  128.                 }

  129.                 if (sVolty > 0)
  130.                 {
  131.                         DMIPlus = 100 * AvgPlusDM / sVolty ;
  132.                         DMIMinus = 100 * AvgMinusDM / sVolty ;
  133.                 }else
  134.                 {
  135.                         DMIPlus = 0 ;
  136.                         DMIMinus = 0 ;
  137.                 }

  138.                 Divisor = DMIPlus + DMIMinus ;
  139.                 if (Divisor > 0)
  140.                 {
  141.                         sDMI = 100 * Abs( DMIPlus - DMIMinus ) / Divisor;
  142.                 }else
  143.                 {
  144.                         sDMI = 0 ;
  145.                 }

  146.                 if (bStopLoop != true)
  147.                 {
  148.                         K = 0;
  149.                         j = 0;
  150.                         For i = 0 To Length - 1
  151.                         {
  152.                                 CumValue = CumValue + sDMI[K];
  153.                                 j = K + mtBarCnt[K];
  154.                                 If (mtHigh[j] != InvalidNumeric) K = j;
  155.                                 else
  156.                                 {
  157.                                         j = i;
  158.                                         i = Length + 1;
  159.                                 }
  160.                         }
  161.                         sADX = CumValue / j ;
  162.                         ADXR = ( sADX + sADX[ K-1 ] ) * 0.5 ;
  163.                 }else  
  164.                 {
  165.                         sADX = sADX[mtBarCnt] + SF * ( sDMI - sADX[mtBarCnt] ) ;
  166.                         j = 0;
  167.                         For i = 0 To Length-1
  168.                         {
  169.                                 j = j + mtBarCnt[j];
  170.                         }
  171.                         ADXR = ( sADX + sADX[ j ] ) * 0.5 ;
  172.                 }
  173.                 Volty = sVolty;
  174.                 DMI = sDMI;
  175.                 ADX = sADX;

  176.         }
  177.         oDMIPlus = DMIPlus;
  178.         oDMIMinus = DMIMinus;
  179.         oADX = ADX;
  180.         return mtBarCnt;
  181. End
 
同樣舉個(gè)例子。公式應(yīng)用TestMtDMI
  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);                 // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric Length(20);                       
  5.         Numeric Offset(2);
  6.         Numeric Lots(1);
  7.        
  8. Vars
  9.         NumericSeries DMIPlus;
  10.         NumericSeries DMIMinus;
  11.         NumericSeries ADX;
  12.         NumericSeries PreBar;

  13.         Numeric DPlus;
  14.         Numeric DMinus;
  15.         Numeric tADX;

  16. Begin
  17.         PreBar = MtDMI(TimeFrame,BarsBack,Length,DPLus,DMinus,tADX);
  18.         DMIPlus = DPlus;
  19.         DMIMinus = DMinus;
  20.         ADX = tADX;

  21.         PlotNumeric( "DMI+" ,DMIPlus);
  22.         PlotNumeric( "DMI-" ,DMIMinus);
  23.         PlotNumeric( "ADX" ,ADX);
  24.        
  25.         If ( MarketPosition != 1 and DMIPlus>DMIMinus and DMIPlus[PreBar]<DMIMinus[PreBar])
  26.         {
  27.                 Buy(Lots,Open);
  28.         }
  29.         If ( MarketPosition !=-1 and DMIPlus<DMIMinus and DMIPlus[PreBar]>DMIMinus[PreBar])
  30.         {
  31.                 SellShort(Lots,Open);
  32.         }
  33. End
在小時(shí)圖上插入該公式應(yīng)用即可,參數(shù)默認(rèn)我就是日線1440,如需其他周期,直接改參數(shù)就可
 
 
按照你的意思,大致寫了一下,看看是否符合你的要求。
  1. //------------------------------------------------------------------------
  2. // 簡稱: TestMtMa_V2
  3. // 名稱: 周線加日線均線策略
  4. // 類別: 公式應(yīng)用
  5. // 類型: 用戶應(yīng)用
  6. // 輸出:
  7. //------------------------------------------------------------------------

  8. Params
  9.         Numeric TimeFrame(10080);        // 目標(biāo)時(shí)間周期:周線
  10.         Numeric BarsBack(1);                // 以前一周的均線來判斷

  11.         Numeric WeekLength(5);                // 周線的均線周期               
  12.         Numeric Length1(5);                        // 日線的短期均線周期
  13.         Numeric Length2(10);                // 日線的長期均線周期
  14.         Numeric Lots(1);                        // 交易頭寸大小
  15. Vars
  16.         NumericSeries WeekMA;
  17.         Numeric oWeekMA;

  18.         NumericSeries MA1;
  19.         NumericSeries MA2;
  20. Begin
  21.         MtMa(TimeFrame,BarsBack,WeekLength,oWeekMA);
  22.         WeekMA = oWeekMA;
  23.         PlotNumeric("WeekMA",WeekMA);

  24.         MA1 = AverageFC(Close,Length1);
  25.         MA2 = AverageFC(Close,Length2);
  26.         PlotNumeric("MA1",MA1);
  27.         PlotNumeric("MA2",MA2);
  28.        
  29.         If (MA1[1]>WeekMA and MA2[1]>WeekMA)                // 日線短期均線和長期均線均再周線5周期均線之上
  30.         {
  31.                 if (MarketPosition!=1 and MA1[1]>MA2[1])
  32.                 {
  33.                         Buy(Lots,Open);
  34.                 }
  35.                 if (MarketPosition==1 and MA1[1]<MA2[1])
  36.                 {
  37.                         Sell(Lots,Open);
  38.                 }
  39.         }
  40.         If (MA1[1]<WeekMA and MA2[1]<WeekMA)                // 日線短期均線和長期均線均再周線5周期均線之下
  41.         {
  42.                 if (MarketPosition!=-1 and MA1[1]<MA2[1])
  43.                 {
  44.                         SellShort(Lots,Open);
  45.                 }
  46.                 if (MarketPosition==-1 and MA1[1]>MA2[1])
  47.                 {
  48.                         BuyToCover(Lots,Open);
  49.                 }
  50.         }
  51. End

拖了好幾天了,一直沒有把跨周期已經(jīng)完成的幾個(gè)指標(biāo)貼上來。致富網(wǎng)友,也提出了很高的要求,我試著來寫一寫吧。
首先把跨周期的KDJ指標(biāo)完成,新建函數(shù)MtKDJ,代碼如下:

  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);         // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric Length(14);                       
  5.         Numeric SlowLength(3);       
  6.         Numeric SmoothLength(3);
  7.        
  8.         NumericRef oKValue;
  9.         NumericRef oDValue;
  10. Vars
  11.         NumericSeries mtBarCnt;
  12.         NumericSeries mtOpen;
  13.         NumericSeries mtHigh;
  14.         NumericSeries mtLow;
  15.         NumericSeries mtClose;
  16.         NumericSeries mtVol;
  17.         NumericSeries mtOpenInt;
  18.         Numeric refCurBar;
  19.         Numeric refOpen;
  20.         Numeric refHigh;
  21.         Numeric refLow;
  22.         Numeric refClose;
  23.         Numeric refVol;
  24.         Numeric refOpenInt;

  25.         NumericSeries HighestValue;                               
  26.         NumericSeries LowestValue;                                       
  27.         NumericSeries KValue;
  28.         Numeric DValue;
  29.         Numeric i;
  30.         Numeric j(0);
  31.         Numeric SumHLValue(0);
  32.         Numeric SumCLValue(0);
  33.         Numeric sumValue(0);

  34. Begin
  35.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  36.         mtHigh = refHigh;
  37.         mtLow = refLow;
  38.         mtClose = refClose;
  39.        
  40.         HighestValue = mtHigh;
  41.         LowestValue = mtLow;
  42.         For i = 1 to Length-1
  43.         {
  44.                 j = j + mtBarCnt[j];
  45.                 If (mtHigh[j] == InvalidNumeric) HighestValue = InvalidNumeric;
  46.                 Else If ( mtHigh[j] > HighestValue) HighestValue = mtHigh[j];
  47.                 If (mtLow[j] == InvalidNumeric) LowestValue = InvalidNumeric;
  48.                 Else If ( mtLow[j] < LowestValue) LowestValue = mtLow[j];
  49.         }

  50.         j = 0;
  51.         For i = 1 to SlowLength
  52.         {
  53.                 If (mtClose[j] == InvalidNumeric)
  54.                 {
  55.                         SumHLValue = 0;     //InvalidNumeric;
  56.                         SumCLValue = 0;     //InvalidNumeric;
  57.                 }
  58.                 Else
  59.                 {
  60.                         SumCLValue = SumCLValue + mtClose[j] - LowestValue[j];
  61.                         SumHLValue = SumHLValue + HighestValue[j] - LowestValue[j];
  62.                         j = j + mtBarCnt[j];
  63.                 }
  64.         }

  65.         If (SumHLValue <> 0)
  66.         {
  67.                 KValue = SumCLValue/SumHLValue*100;
  68.         }Else
  69.         {
  70.                 KValue = 0;
  71.         }

  72.         j = 0;
  73.         For i = 1 to SmoothLength
  74.         {
  75.                 If (KValue[j] == InvalidNumeric) SumValue = 0;     //InvalidNumeric;
  76.                 Else
  77.                 {
  78.                         SumValue = SumValue + KValue[j];
  79.                         j = j + mtBarCnt[j];
  80.                 }
  81.         }
  82.         DValue = SumValue/SmoothLength;

  83.         oKValue = KValue;
  84.         oDValue = DValue;
  85.         return mtBarCnt;
  86. End
復(fù)制代碼

然后和往常一樣,寫個(gè)調(diào)用的例子,新建公式應(yīng)用TestMtKdj,隨便在日線以下的時(shí)間周期中使用,參數(shù)為1440,表示求日線KDJ,根據(jù)日線KDJ,金叉買入,死叉賣出,不管交叉發(fā)生的位置。代碼如下:

  1. Params
  2.         Numeric TimeFrame(1440);        // 日線
  3.         Numeric BarsBack(1);        // 求前一日的值
  4.         Numeric Length(14);                       
  5.         Numeric SlowLength(3);       
  6.         Numeric SmoothLength(3);
  7.         Numeric Lots(1);
  8. Vars
  9.         NumericSeries KValue;
  10.         NumericSeries DValue;
  11.         Numeric ooKValue;
  12.         Numeric ooDValue;
  13.         Numeric PreBar;
  14. Begin
  15.         PreBar = MtKDJ(TimeFrame,BarsBack,Length,SlowLength,SmoothLength,ooKValue,ooDValue);
  16.         KValue = ooKValue;
  17.         DValue = ooDValue;

  18.         PlotNumeric("K",KValue);
  19.         PlotNumeric("D",DValue);
  20.         PlotNumeric("J",3*KValue - 2*DValue);
  21.         PlotNumeric("Ref1",20);
  22.         PlotNumeric("Ref2",80);

  23.         If (KValue[PreBar] < DValue[PreBar] and KValue>DValue)
  24.         {
  25.                 Buy(Lots,Open);
  26.         }
  27.         If (KValue[PreBar] > DValue[PreBar] and KValue<DValue)
  28.         {
  29.                 SellShort(Lots,Open);
  30.         }
  31. End

周期BOLL線指標(biāo),新建函數(shù)MtBoll,代碼如下:

  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);         // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric Length(20);                       
  5.         Numeric Offset(2);
  6.         NumericRef oUpLine;                        // 上軌
  7.         NumericRef oDownLine;                // 下軌
  8.         NumericRef oMidLine;                // 中軌
  9. Vars
  10.         NumericSeries mtBarCnt;
  11.         NumericSeries mtClose;
  12.         Numeric refCurBar;
  13.         Numeric refOpen;
  14.         Numeric refHigh;
  15.         Numeric refLow;
  16.         Numeric refClose;
  17.         Numeric refVol;
  18.         Numeric refOpenInt;

  19.         Numeric tempBand;

  20.         Numeric SumValue(0);
  21.         Numeric i;
  22.         Numeric j(0);
  23.         Numeric SumSqr(0);
  24.         Numeric VarPSValue;

  25.        
  26. Begin
  27.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  28.         mtClose = refClose;

  29.         For i = 1 to Length
  30.         {
  31.                 If (mtClose[j] == InvalidNumeric) SumValue = InvalidNumeric;
  32.                 Else
  33.                 {
  34.                         SumValue = SumValue + mtClose[j];
  35.                         j = j + mtBarCnt[j];
  36.                 }
  37.         }

  38.         oMidLine = SumValue/Length;

  39.         If(Length > 1)
  40.         {
  41.                 j = 0;
  42.                 for i = 0 to Length - 1
  43.                 {
  44.                         SumSqr = SumSqr + Sqr( mtClose[j] - oMidLine ) ;
  45.                         j = j + mtBarCnt[j];
  46.                 }
  47.                 VarPSValue = SumSqr / (Length - 1) ;
  48.         }Else
  49.         {
  50.                 VarPSValue = 0;
  51.         }

  52.         tempBand = iif(VarPSValue > 0,Sqrt(VarPSValue),0);

  53.         oUpLine = oMidLine + Offset * tempBand;
  54.         oDownLine = oMidLine - Offset * tempBand;
  55.         Return mtBarCnt;
  56. End
復(fù)制代碼

再寫個(gè)公式應(yīng)用的例子,新建公式應(yīng)用TestMtBoll,代碼如下:

  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);                 // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric Length(20);                       
  5.         Numeric Offset(2);
  6.         Numeric Lots(1);
  7. Vars
  8.         NumericSeries UpLine;                        // 上軌
  9.         NumericSeries DownLine;                        // 下軌
  10.         NumericSeries MidLine;                        // 中軌
  11.         NumericSeries PreBar;
  12.         Numeric UpL;
  13.         Numeric DnL;
  14.         Numeric MdL;
  15. Begin
  16.         PreBar = MtBOLL(TimeFrame,BarsBack,Length,Offset,UpL,DnL,MdL);
  17.         UpLine = UpL;
  18.         DownLine = DnL;
  19.         MidLine = MdL;

  20.         PlotNumeric("UpLine",UpLine);
  21.         PlotNumeric("DownLine",DownLine);
  22.         PlotNumeric("MidLine",MidLine);
  23.        
  24.         If ( MarketPosition != 1 and Close[1]>MidLine[1] and UpLine[1]>UpLine[PreBar] and MidLine[1]>MidLine[PreBar])
  25.         {
  26.                 Buy(Lots,Open);
  27.         }
  28.         If ( MarketPosition !=-1 and Close[1]<MidLine[1] and DownLine[1]<DownLine[PreBar] and MidLine[1]<MidLine[PreBar])
  29.         {
  30.                 SellShort(Lots,Open);
  31.         }
  32. End

周期RSI指標(biāo),新建函數(shù)MtRSI,代碼如下:
  1. Params
  2.         Numeric TimeFrame(1440);        // 目標(biāo)時(shí)間周期參數(shù),參數(shù)說明參見MtBar
  3.         Numeric BarsBack(1);         // 目標(biāo)時(shí)間周期BAR偏移參數(shù),說明見MtBar函數(shù)
  4.         Numeric Length(14) ;
  5.         NumericRef oRSIValue;
  6. Vars
  7.         NumericSeries mtBarCnt;
  8.         NumericSeries mtClose;
  9.         Numeric refCurBar;
  10.         Numeric refOpen;
  11.         Numeric refHigh;
  12.         Numeric refLow;
  13.         Numeric refClose;
  14.         Numeric refVol;
  15.         Numeric refOpenInt;

  16.         NumericSeries NetChgAvg( 0 );
  17.         NumericSeries TotChgAvg( 0 );
  18.         Numeric Change( 0 );
  19.         Numeric SF( 0 );
  20.         Numeric ChgRatio( 0 ) ;
  21.         Numeric RSIValue;
  22.         BoolSeries bStopLoop;
  23.         Numeric i;
  24.         Numeric j(0);
  25.         Numeric K;
  26.         Numeric nbClose;
  27.         Numeric nbClose1;
  28. Begin
  29.         mtBarCnt = MtBar(TimeFrame,BarsBack,refCurBar,refOpen,refHigh,refLow,refClose,refVol,refOpenInt);
  30.         mtClose = refClose;

  31.         SF = 1/Length;
  32.         bStopLoop = bStopLoop[1];
  33.         If (bStopLoop!=true)
  34.         {
  35.                 j = 0;
  36.                 For i = 0 to Length
  37.                 {
  38.                         If (mtClose[j] == InvalidNumeric)
  39.                         {
  40.                                 nbClose = InvalidNumeric;
  41.                                 i = Length + 1;
  42.                         }
  43.                         Else
  44.                         {
  45.                                 nbClose = mtClose[j];
  46.                                 j = j + mtBarCnt[j];
  47.                         }
  48.                 }
  49.                 if(nbClose!=InvalidNumeric and mtClose[j] != InvalidNumeric) bStopLoop = true;
  50.         }

  51.         If(nbClose == InvalidNumeric)
  52.         {
  53.                 RSIValue = InvalidNumeric;
  54.         }Else
  55.         {
  56.                 If(bStopLoop !=true)
  57.                 {
  58.                         NetChgAvg = ( mtClose - nbClose ) / Length ;
  59.                         j = 0;
  60.                         K = 0;
  61.                         For i = 1 To Length
  62.                         {
  63.                                 j = K + mtBarCnt[K];
  64.                                 TotChgAvg = TotChgAvg+Abs(mtClose[K] - mtClose[j]);
  65.                                 K = j ;
  66.                         }
  67.                         TotChgAvg = TotChgAvg / Length;
  68.                 }
  69.                 Else
  70.                 {
  71.                         Change = mtClose - mtClose[mtBarCnt] ;
  72.                         NetChgAvg = NetChgAvg[mtBarCnt] + SF * ( Change - NetChgAvg[mtBarCnt] ) ;
  73.                         TotChgAvg = TotChgAvg[mtBarCnt] + SF * ( Abs( Change ) - TotChgAvg[mtBarCnt] ) ;
  74.                 }
  75.                
  76.                 If( TotChgAvg <> 0 )
  77.                 {
  78.                         ChgRatio = NetChgAvg / TotChgAvg ;
  79.                 }else
  80.                 {
  81.                         ChgRatio = 0 ;
  82.                 }
  83.                
  84.                 RSIValue = 50 * ( ChgRatio + 1 ) ;
  85.         }
  86.        
  87.         oRSIValue = RSIValue;
  88.         return mtBarCnt;
  89. End
復(fù)制代碼
再新建公式應(yīng)用TestMtRsi,把傳統(tǒng)的RSI使用方法改了一下,RSI大于50做多,小于50做空。
  1. Params
  2.         Numeric TimeFrame(1440);        // 日線
  3.         Numeric BarsBack(1);                // 求前一日的值
  4.         Numeric Length(14) ;
  5.         Numeric OverSold(30) ;
  6.         Numeric OverBought(70) ;
  7.         Numeric Lots(1);
  8. Vars
  9.         NumericSeries RSIValue;
  10.         Numeric oRSIValue;
  11.         Numeric PreBar;
  12. Begin
  13.         PreBar = MtRSI(TimeFrame,BarsBack,Length,oRSIValue);
  14.         RSIValue = oRSIValue;

  15.         PlotNumeric("RSI",RSIValue);
  16.         PlotNumeric("超買",OverBought);
  17.         PlotNumeric("超賣",OverSold);

  18.         If (RSIValue>50)
  19.         {
  20.                 Buy(Lots,Open);
  21.         }
  22.         If (RSIValue<50)
  23.         {
  24.                 SellShort(Lots,Open);
  25.         }
  26. End

至此,我已經(jīng)做好的幾個(gè)跨周期的指標(biāo),已經(jīng)全部發(fā)表完畢。接下來,試著完成致富朋友的要求。其實(shí)有了前面的例子,要實(shí)現(xiàn)同時(shí)讀取多個(gè)周期的MACD和KDJ值不是什么難事,就是同樣的代碼復(fù)制黏貼,多寫幾遍就是了。這里我只以MACD為例子,在1分鐘圖上使用,KDJ的部分致富可以自己完成。計(jì)算出來的指標(biāo)我就不顯示了,太多了。我只把提示買入賣出的信息作為注釋信息輸出了,供你參考吧。
  1. Params
  2.         Numeric FastLength(12);
  3.         Numeric SlowLength(26);
  4.         Numeric MACDLength(9);
  5. Vars
  6.         Numeric PreBar60;
  7.         Numeric ooMACDValue60;
  8.         Numeric ooAvgMACD60;
  9.         NumericSeries MACDVAlue60;
  10.         NumericSeries AvgMACD60;
  11.         NumericSeries MACDDiff60;
  12.        
  13.         Numeric PreBar30;
  14.         Numeric ooMACDValue30;
  15.         Numeric ooAvgMACD30;
  16.         NumericSeries MACDVAlue30;
  17.         NumericSeries AvgMACD30;
  18.         NumericSeries MACDDiff30;

  19.         Numeric PreBar15;
  20.         Numeric ooMACDValue15;
  21.         Numeric ooAvgMACD15;
  22.         NumericSeries MACDVAlue15;
  23.         NumericSeries AvgMACD15;
  24.         NumericSeries MACDDiff15;
  25.        
  26.         Numeric PreBar5;
  27.         Numeric ooMACDValue5;
  28.         Numeric ooAvgMACD5;
  29.         NumericSeries MACDVAlue5;
  30.         NumericSeries AvgMACD5;
  31.         NumericSeries MACDDiff5;

  32.         Numeric PreBar3;
  33.         Numeric ooMACDValue3;
  34.         Numeric ooAvgMACD3;
  35.         NumericSeries MACDVAlue3;
  36.         NumericSeries AvgMACD3;
  37.         NumericSeries MACDDiff3;

  38. Begin
  39.         PreBar60 = MtMACD(60,1,FastLength,SlowLength,MACDLength,ooMACDValue60,ooAvgMACD60);
  40.         MACDVAlue60 = ooMACDValue60;
  41.         AvgMACD60 = ooAvgMACD60;
  42.         MACDDiff60 = MACDValue60 - AvgMACD60;

  43.         If (MacdDiff60[PreBar60]<0 and MacdDiff60>0)
  44.                 Commentary("60分鐘MACD買入信號");
  45.         If (MacdDiff60[PreBar60]>0 and MacdDiff60<0)
  46.                 Commentary("60分鐘MACD賣出信號");

  47.         PreBar30 = MtMACD(30,1,FastLength,SlowLength,MACDLength,ooMACDValue30,ooAvgMACD30);
  48.         MACDVAlue30 = ooMACDValue30;
  49.         AvgMACD30 = ooAvgMACD30;
  50.         MACDDiff30 = MACDValue30 - AvgMACD30;

  51.         If (MacdDiff30[PreBar30]<0 and MacdDiff30>0)
  52.                 Commentary("30分鐘MACD買入信號");
  53.         If (MacdDiff30[PreBar30]>0 and MacdDiff30<0)
  54.                 Commentary("30分鐘MACD賣出信號");

  55.         PreBar15 = MtMACD(15,1,FastLength,SlowLength,MACDLength,ooMACDValue15,ooAvgMACD15);
  56.         MACDVAlue15 = ooMACDValue15;
  57.         AvgMACD15 = ooAvgMACD15;
  58.         MACDDiff15 = MACDValue15 - AvgMACD15;

  59.         If (MacdDiff15[PreBar15]<0 and MacdDiff15>0)
  60.                 Commentary("15分鐘MACD買入信號");
  61.         If (MacdDiff15[PreBar15]>0 and MacdDiff15<0)
  62.                 Commentary("15分鐘MACD賣出信號");

  63.         PreBar5 = MtMACD(5,1,FastLength,SlowLength,MACDLength,ooMACDValue5,ooAvgMACD5);
  64.         MACDVAlue5 = ooMACDValue5;
  65.         AvgMACD5 = ooAvgMACD5;
  66.         MACDDiff5 = MACDValue5 - AvgMACD5;

  67.         If (MacdDiff5[PreBar5]<0 and MacdDiff5>0)
  68.                 Commentary("5分鐘MACD買入信號");
  69.         If (MacdDiff5[PreBar5]>0 and MacdDiff5<0)
  70.                 Commentary("5分鐘MACD賣出信號");

  71.         PreBar3 = MtMACD(3,1,FastLength,SlowLength,MACDLength,ooMACDValue3,ooAvgMACD3);
  72.         MACDVAlue3 = ooMACDValue3;
  73.         AvgMACD3 = ooAvgMACD3;
  74.         MACDDiff3 = MACDValue3 - AvgMACD3;

  75.         If (MacdDiff3[PreBar3]<0 and MacdDiff3>0)
  76.                 Commentary("3分鐘MACD買入信號");
  77.         If (MacdDiff3[PreBar3]>0 and MacdDiff3<0)
  78.                 Commentary("3分鐘MACD賣出信號");
  79. End

 
 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    五月天丁香婷婷一区二区| 老司机精品福利视频在线播放| 国产一级一片内射视频在线| 日韩人妻av中文字幕| 九七人妻一区二区三区| 九九热精品视频在线观看| 日韩中文无线码在线视频| 国产成人精品一区在线观看| 91亚洲精品综合久久| 69老司机精品视频在线观看| 久久国产青偷人人妻潘金莲| 欧美成人精品一区二区久久| 丰满少妇被粗大猛烈进出视频| 99久久婷婷国产亚洲综合精品| 熟女少妇久久一区二区三区| 国产一区二区不卡在线视频| 国产成人精品久久二区二区| 五月婷婷六月丁香在线观看| 日本高清加勒比免费在线| 蜜臀人妻一区二区三区| 好骚国产99在线中文| 中文字幕一区二区熟女| 国产乱人伦精品一区二区三区四区 | 国产精品视频久久一区| 欧美乱码精品一区二区三| 人妻久久一区二区三区精品99| 欧美日韩精品一区免费| 国产精品国产亚洲看不卡| 中文字幕日韩精品人一妻| 国产99久久精品果冻传媒| 欧美日韩亚洲国产精品| 日本不卡一本二本三区| 91爽人人爽人人插人人爽| 99久热只有精品视频最新| 日韩黄片大全免费在线看| av一区二区三区天堂| 久久精品中文扫妇内射| 国产一区二区三区av在线| 熟女乱一区二区三区丝袜| 欧美日韩一区二区午夜| 欧美多人疯狂性战派对|