請問在每5分鐘觸發時, 如何跨頻率取得每日的肯特納通道資料 ?

  •   254 
  • 最後發表   Goku  2023 六月 27
Goku 發文於   2023/06/18

Hi 小編, 

   執行頻率為日時, 我的肯特納通道方式是, 

 

midline = XAverage(close, Length);

UB = midline + ATR(Length) * UpperBand;

LB = midline - ATR(Length) * LowerBand;

 

   它可以正常執行, 但若執行頻率改為 5分鐘時, 仍想取得日頻率的肯特納通道, 我改成

midline = xf_XAverage("D",GetField("Close","D"),Length);

UB = midline + ATR(Length) * UpperBand;

LB = midline - ATR(Length) * LowerBand;

   而結果是錯的, 請問我應該怎麼做 ?

 

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/06/20

 Hello Goku,

 

您的ATR函數也需要改用日頻率,才可以計算出正確的數值。

需注意由於ATR是針對執行頻率撰寫,所以您需要重新計算近10日的 TrueRange 並平均,可以搭配迴圈來計算。

舉例來說:

value1 = 0;

for value2 = 0 to 9 begin

    value1 += maxlist((getfield("High", "D")[value2] - getfield("Low", "D")[value2]), absvalue(getfield("High", "D")[value2] - getfield("Close", "D")[value2 + 1]), absvalue(getfield("Low", "D")[value2] - getfield("Close", "D")[value2 + 1]));

    end;

value1 = value1 / 10;

這樣value1就會是10日ATR。

Goku 發文於   2023/06/23

Hi 小幫手, 

   謝謝你的回覆, 

   我依你的作法, 修改我的程式, 但數值仍然不一樣, 我不知那裡有錯 ~

   以 2457, 6/19 為例, 其 UB 值為 85.57, 

   但 我的程式, 在 6/19 13:25 的值卻是 86.1

 

   另建一個涵式 xf_ATR(),

//============================

SetBarMode(1);

{

傳回平均真實區間

Length: 計算期數

}

input: Length(numeric);

 

value1 = 0;

for value2 = 0 to Length begin

    value1 += maxlist((getfield("High", "D")[value2] - getfield("Low", "D")[value2]), absvalue(getfield("High", "D")[value2] - getfield("Close", "D")[value2 + 1]), absvalue(getfield("Low", "D")[value2] - getfield("Close", "D")[value2 + 1]));

    end;

xf_ATR = round(value1/Length,2);

 

//============================

var: Length(20), UpperBand(2), LowerBand(2);

var: UB(0),LB(0),midline(0);

 

midline = xf_XAverage("D",GetField("Close","D"),Length);

UB = midline + xf_ATR(Length) * UpperBand;

LB = midline - xf_ATR(Length) * LowerBand;

 

Print(File("d:\Print\[Date]_[ScriptName]_[Symbol]_[Freq]_.log"), date, time, symbol, symbolname, close, round(midline,2), round(UB,2));

ret=1;

 

Goku 發文於   2023/06/23
XQ小幫手 發文於   2023/06/27

Hello Goku,

 

您的ATR函數計算有誤。

正確應該為:

input: Length(numeric);

 

value1 = 0;

for value2 = 0 to (Length-1) begin

    value1 += maxlist((getfield("High", "D")[value2] - getfield("Low", "D")[value2]), absvalue(getfield("High", "D")[value2] - getfield("Close", "D")[value2 + 1]), absvalue(getfield("Low", "D")[value2] - getfield("Close", "D")[value2 + 1]));

    end;

 

xf_ATR = value1/Length;

 

因為0也是一期,所以您的寫法會導致多了一期,但分母沒變 (ex. 21期的ATR總合除以20)。

Goku 發文於   2023/06/27

了解, 謝謝你的幫忙.

發表回覆
Close