首先,還是得先準備幾個 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)
請問版大~這個如果要轉成hts碼要怎麼寫呢?謝謝~^^
回覆刪除這個..可能要等下個星期我比較有空再寫了..^^
回覆刪除小弟有一個很笨的疑問
回覆刪除依ATR的概念
每天的ATR只有一個固定數值
但是版大你這支程式Plot卻在每日開盤後
有一段時間會呈曲線的變化
是不是那裡引用數據有問題
還是小弟觀念有誤
謝謝
因為這是分線裡抓日線資料出來算的..也許..這些資料不是一開始就會出來..我猜的..= =
回覆刪除呵呵~~
回覆刪除小弟找到問題所在了
把 DAvgTrueRange(10)
改一下就會發現曲線的節末端
會隨著參數的增加而延長;減少而縮短
所以DAvgTrueRange所使用的資料
應該是每日開盤幾根k bar後參數所設的資料
來計算DAvgTrueRange
我們本來想計算前幾日的ATR來作平均
最後卻引用到每分鐘的資料所造成的
DAvgTrueRange 以今日和前日的差距為1tick作收斂(ex:今日DAvgTrueRange=500; 前日為400 ;參數為10日平均時; 可以看到它會以每一個Bar 上升10點 在第10根到500)
如有誤會之處還請指教 .........
好像是有這樣的問題啊..= =a..我再研究一下吧..感謝你測試喔..
回覆刪除版大
回覆刪除小弟有寫了幾個函數
是參考你文中的概念寫出
應該可以解決這個狀況
不好意思野人獻曝了
可以貼在這裡嗎
(不好意思洗版了)
還是在可以plunk上交流一下
意見或想法??
歡迎歡迎..請貼..^^
回覆刪除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用來作策略的部份
小弟寫的就不是很好了
看了程式交易全攻略D.K.寫的這篇後才知到有個closed函數可用,本想說既然可以引用日線開高低收數據,應該也有可以引用分時的函數吧,結果查help找不到...請教D.K.是否知道TS有類似可引用分時數據的函數嗎? 感謝~
回覆刪除J.I. 不太了解你所說的分時數據是什麼意思耶?
回覆刪除就是例如我需要在30分chart裡面取60或15分的開高低收數據做運算,看了你寫的另一篇用data1、data2的方法好像可以,但如果30分裡我同時需要取60及15似乎就無法達到? 謝謝~
回覆刪除J.I. 那就用到 data3 囉..
回覆刪除可以同時用到data3嗎? 謝謝,我再試試看。
回覆刪除HTS 程式碼DTrueLow中有誤,請修正
回覆刪除//DTrueLow
If Value7小於請用正確符號Value3 Then
DTrueLow = Value7
Else
DTrueLow = Value3
End If
您好,
回覆刪除可以請問一下NumericSimple在MultiCharts裡面是對應甚麼樣的參數嗎?
感謝
祝福
小派:這個,你可能要開一下其它的 Function 來看一下,我目前沒有安裝 MC,不過 NumericSimple 和 Numeric 作用會是相同的。大概找一下類似的或是開 F1 說明看一下了。
回覆刪除作者已經移除這則留言。
回覆刪除