[TS懶人包] [保險服務]

2008年8月20日 星期三

在分線內實作 ATR 指標

ATR指標的原文是Average True Range,原文的意思是「平均真實區域」指標,所謂的真實區域,指的就是真實的股價「波動」區域,這個指標可以在開盤時就大概抓出今天可能的波動範圍,其實還滿好用的,只是 TS 內鍵的 AverageTrueRange 函式是利用每根 k 線來計算,跟我想要的不同,所以又只好自己動手作啦。

首先,還是得先準備幾個 function 才行…
第一個 DTrueLow

If Closed(2) < Lowd(1) Then
DTrueLow = Closed(2)
Else
DTrueLow = Lowd(1);

第二個 DTrueHigh

If CloseD(2) > Highd(1) Then
DTrueHigh = Closed(2)
Else
DTrueHigh = Highd(1);

第三個 DTrueRange

DTrueRange = DTrueHigh - DTrueLow;

最後,才是主角…DAvgTrueRange

Inputs: Length(NumericSimple);

DAvgTrueRange = Average(DTrueRange, Length);

搞定…已經可以在分線內用上日線的 ATR 了…畫張圖來看看…準備個 Indicator

plot1(DAvgTrueRange(10), "ATR", yellow, yellow, 2);

就可以得到下面的圖了…


不過看看圖…這樣子的參考價值實在不高…所以把 Indicator 的部份改一下吧…

plot1(opend(0)+DAvgTrueRange(10), "ATR", yellow, yellow, 2);
plot2(opend(0)-DAvgTrueRange(10), "ATR", green, green, 2);

就可以得到下面這張圖…


有參考價值多了…除了當天走勢比較強之外(紅色鍵頭),其餘幾乎都是在範圍內…更有許多天碰到就往上走的情況(黃色鍵頭)…這實在是當沖交易者不得不看的一個指標啊…

個人覺得…這是個很不錯的參考指標…

網友 peter 幫忙實作出來的 HTS 版本…大家給他拍拍手。


Variables: DTrueHigh(0), DTrueLow(0), DTrueRange(0)
Array: OoD[84](-1), HoD[84](-1), LoD[84](-1), CoD[84](-1)

Value2 = HighOfD ( 1, HoD)
Value3 = LowOfD ( 1, LoD)
Value4 = CloseOfD( 1, CoD)

Value7 = CloseOfD( 2, CoD)

Value11 = (Value2+Value3+Value4)/3
//DTrueHigh

If Value7 > Value2 Then
DTruehigh = Value7
Else
DTruehigh = Value2
End If

//DTrueLow

If Value7 < Value3 Then
DTrueLow = Value7
Else
DTrueLow = Value3
End If

//DTrueRange

DTrueRange = (DTruehigh - DTrueLow) / 2

Draw1 ( Value11 + DTrueRange,"ATR",cyan)//Average
Draw2 ( Value11 - DTrueRange,"ATR",cyan)

18 則留言:

  1. 請問版大~這個如果要轉成hts碼要怎麼寫呢?謝謝~^^

    回覆刪除
  2. 這個..可能要等下個星期我比較有空再寫了..^^

    回覆刪除
  3. 小弟有一個很笨的疑問
    依ATR的概念
    每天的ATR只有一個固定數值

    但是版大你這支程式Plot卻在每日開盤後
    有一段時間會呈曲線的變化
    是不是那裡引用數據有問題

    還是小弟觀念有誤
    謝謝

    回覆刪除
  4. 因為這是分線裡抓日線資料出來算的..也許..這些資料不是一開始就會出來..我猜的..= =

    回覆刪除
  5. 呵呵~~
    小弟找到問題所在了

    把 DAvgTrueRange(10)
    改一下就會發現曲線的節末端
    會隨著參數的增加而延長;減少而縮短

    所以DAvgTrueRange所使用的資料
    應該是每日開盤幾根k bar後參數所設的資料
    來計算DAvgTrueRange

    我們本來想計算前幾日的ATR來作平均
    最後卻引用到每分鐘的資料所造成的

    DAvgTrueRange 以今日和前日的差距為1tick作收斂(ex:今日DAvgTrueRange=500; 前日為400 ;參數為10日平均時; 可以看到它會以每一個Bar 上升10點 在第10根到500)

    如有誤會之處還請指教 .........

    回覆刪除
  6. 好像是有這樣的問題啊..= =a..我再研究一下吧..感謝你測試喔..

    回覆刪除
  7. 版大
    小弟有寫了幾個函數
    是參考你文中的概念寫出
    應該可以解決這個狀況
    不好意思野人獻曝了
    可以貼在這裡嗎
    (不好意思洗版了)
    還是在可以plunk上交流一下
    意見或想法??

    回覆刪除
  8. Function
    DTrueRange = Maxlist ( (HighD(1) - LowD(1)) , AbsValue( CloseD(2) - LowD(1) ) , AbsValue( CloseD(2) - HighD(1) ));
    Function
    Inputs: Length(NumericSimple);
    Vars: Counter(0), Counter1(0), SumTrueRange (0);
    Arrays: MyArray[ 19 ](0);

    If Date[0] <> Date[1] Then Begin
    MyArray[ Counter ] = DTrueRange ;

    Counter = Counter + 1;
    For Value1=0 To Length-1 Begin
    SumTrueRange = MyArray[ Value1 ] + SumTrueRange ;
    End;

    If Counter1 >= Length-1 Then Begin
    DAvgTrueRange = SumTrueRange / Length ;
    SumTrueRange = 0 ;
    end
    Else
    Counter1 =Counter1 + 1 ;

    End;

    If Counter = Length Then
    Counter = 0 ;

    還是運用到 array 暫存資料
    這樣劃出的線當日都不會有變化
    人工驗算數值也正確
    版大參考一下......

    ATR用來作策略的部份
    小弟寫的就不是很好了

    回覆刪除
  9. 看了程式交易全攻略D.K.寫的這篇後才知到有個closed函數可用,本想說既然可以引用日線開高低收數據,應該也有可以引用分時的函數吧,結果查help找不到...請教D.K.是否知道TS有類似可引用分時數據的函數嗎? 感謝~

    回覆刪除
  10. J.I. 不太了解你所說的分時數據是什麼意思耶?

    回覆刪除
  11. 就是例如我需要在30分chart裡面取60或15分的開高低收數據做運算,看了你寫的另一篇用data1、data2的方法好像可以,但如果30分裡我同時需要取60及15似乎就無法達到? 謝謝~

    回覆刪除
  12. 可以同時用到data3嗎? 謝謝,我再試試看。

    回覆刪除
  13. HTS 程式碼DTrueLow中有誤,請修正
    //DTrueLow
    If Value7小於請用正確符號Value3 Then
    DTrueLow = Value7
    Else
    DTrueLow = Value3
    End If

    回覆刪除
  14. 您好,

    可以請問一下NumericSimple在MultiCharts裡面是對應甚麼樣的參數嗎?

    感謝
    祝福

    回覆刪除
  15. 小派:這個,你可能要開一下其它的 Function 來看一下,我目前沒有安裝 MC,不過 NumericSimple 和 Numeric 作用會是相同的。大概找一下類似的或是開 F1 說明看一下了。

    回覆刪除

請留下您的大名…匿名者恕不回應…

Related Posts Plugin for WordPress, Blogger...