[請問小幫手]布林極限值 %B, 在分K頻率下, 計算加權/EMA移動平均值, 語法應如何撰寫?

  •   775 
  • 最後發表   Neo  2021 三月 10
Neo 發文於   2021/01/28

小幫手您好!

布林通道程式碼如下:

 

//布林軌道線 with BBandWidth

input: 

Length(20, "MA的天數"), 

UpperBand(2, "上通道標準差倍數"), 

LowerBand(2, "下通道標準差倍數"),

EMALength(3, "移動平均天數");

variable: mid(0), up(0), down(0), bbandwidth(0), ema_X(0), idx_B(0);

 

//布林軌道

up = bollingerband(Close, Length, UpperBand);

mid = average(close, Length);

down = bollingerband(Close, Length, -1 * LowerBand);

//布林帶寬計算 bbandwidth

bbandwidth = 100 * (up - down) / mid; 

ema_X = XAverage(bbandwidth, EMALength);

//布林極限指標 %B : idx_Bollinger_B

if up<> down then idx_B = (close-down) / (UP-DOWN) else idx_B =0; 

 

目前想求出

EMA (idx_B,15) 的值 or XAverage (idx_B,15)

但目前Print 出來的 數值如為開盤前15根或雷達剛啟動, 計算出來的值皆會因, 起始期數不足影響後續計算, 需等過一陣子計算才會趨近正確

經檢視函數內容, 因期數不足則 如果僅有 5根K棒, 則 XAverage , Average 都會直接除以 15 期, 則數值失真

但EMA 依官網說明, 低於設定Length應會考慮不足期數的平均數

唯實際測試似乎亦無法計算出目前不足期數下的移動平均值, 且在分K頻率下, 前一日似乎亦無法納入計算(詳附件部分Print資料)

綜上, 請問小幫手, 如目的是想得到 idx_B 的加權移動平均值, 請問語法該怎麼寫呢?

 

另,在同樣頻率下(1分K),

mid = average(close, 20);

ema (mid,15) 所得結果 與 EMA(xfMin_EMA("1", Close,20),15) 亦有不同, EMA(xfMin_EMA("1", Close,20),15) 似乎較為正確, 請問原因是?

附加文件

排序方式: 標準 | 最新
XQ小幫手 發文於   2021/01/28

Neo 您好

看您所說明的意思

應該是"資料讀取筆數"設定不足產生的問題

能否請您幫我看一下資料讀取筆數設定多少呢?

因為這類指標會使用到前值來做運算的話,都需要一訂時間長度計算 數值才會正確

請參考以下文章

https://forum.xq.com.tw/thread/macd-%e6%8a%80%e8%a1%93%e6%8c%87%e6%a8%99%e7%9a%84%e8%b3%87%e6%96%99%e8%ae%80%e5%8f%96%e7%ad%86%e6%95%b8%e8%a8%ad%e5%ae%9a/

Neo 發文於   2021/01/28

感謝小幫手回覆, 以下為我目前設定

我調整一下, 謝謝!

 // Step_0 ------ [定義] ------支援頻率與資料引用

if barfreq <> "Min" and barfreq <> "D" then raiseruntimeerror("僅支援分鐘與日頻率");

if getinfo("IsRealTime")=0 or q_CulMatchTicks=1 then return;

settotalbar(60);// 調整Kbar數量 => fix bug「最大引用」數值小於腳本需要的資料範圍

 

Neo 發文於   2021/01/29

小幫手您好!

經過您的建議調整後

程式碼調整如下:

SetTotalBar(Length * 60);// 調整Kbar數量 => fix bug「最大引用」數值小於腳本需要的資料範圍

其餘程式碼不變

EMA(idx_B,15),EMA(idx_B,30),EMA(idx_B,60),EMA(xfMin_EMA("1", Close,20),15),EMA (mid,15),EMA (mid,30),EMA (mid,60)

但Print 出來的資料似乎仍與前狀況相同, 是否可以再請您幫忙看一下, 狀況為何?

(附上資料)

 

附加文件

Neo 發文於   2021/02/01

Neo 您好

看您所說明的意思

應該是"資料讀取筆數"設定不足產生的問題

能否請您幫我看一下資料讀取筆數設定多少呢?

因為這類指標會使用到前值來做運算的話,都需要一訂時間長度計算 數值才會正確

請參考以下文章

https://forum.xq.com.tw/thread/macd-%e6%8a%80%e8%a1%93%e6%8c%87%e6%a8%99%e7%9a%84%e8%b3%87%e6%96%99%e8%ae%80%e5%8f%96%e7%ad%86%e6%95%b8%e8%a8%ad%e5%ae%9a/

請問小幫手, 

input: 

Length(20, "MA的天數"), 

SetTotalBar(Length * 60);

mid = average(close, Length);

EMA(xfMin_EMA("1", Close,20),15),EMA (mid,15) 

PRINT 出來的數值差異甚鉅的原因 , 是"資料讀取筆數"設定不足產生的問題嗎?? 還是BUG??

另外, EMA(idx_B,15),EMA(idx_B,30),EMA(idx_B,60) 數值於設定

SetTotalBar(Length * 60) 後計算仍異常, 再麻煩解惑, 感謝!

附加文件

XQ小幫手 發文於   2021/02/01

Neo 您好

相關數據小幫手會幫您測試一下,

在回覆給您

感謝

Neo 發文於   2021/02/01

再麻煩了! 感謝!

XQ小幫手 發文於   2021/02/01

Neo 您好

ema確實也需要較長的資料區間

但是以您設立的是夠的SetTotalBar(Length * 60);

EMA(xfMin_EMA("1", Close,20),15),EMA (mid,15) 

這兩個會不同是正常的

xfMin_EMA 與  average 函式的計算公式是有差異的

average 是單純取普通平均

ema 為指數加權移動平均

公式如下

SetBarMode(2);

// 跨頻率EMA
//
// FreqType是預期要比對的期別, 支援"D", "W", "M"
// 輸入: FreqType, Series, Length
//
input:
    FreqType(string),       //引用頻率
    Series(numericseries),  //價格序列
    Length(numericsimple);  //計算期間

variable:
    Factor(0), lastEMA(0);


condition1 = xf_getdtvalue(FreqType, Date) <> xf_getdtvalue(FreqType, Date[1]);
if condition1 then
    lastEMA = xf_EMA[1];

value1 = xf_GetCurrentBar(FreqType);

if Length + 1 = 0 then Factor = 1 else Factor = 2 / (Length + 1);

if value1 = 1 then
    xf_EMA = Series
else if value1 <= Length then
    xf_EMA = (Series + (lastEMA * (value1 - 1)))/value1 
else
    xf_EMA = lastEMA + Factor * (Series - lastEMA);

 

Neo 發文於   2021/02/01

小幫手您好! 感謝您初步的回覆

"xfMin_EMA 與  average 函式的計算公式是有差異的"  這沒有問題 , 因為xfMin_EMA 本來就是我簡單對照 EMA (mid,15) 數值結果使用的, xfMin_EMA 並不是我要使用的數值

我前次的問題是

"EMA(xfMin_EMA("1", Close,20),15),EMA (mid,15) PRINT 出來的數值差異甚鉅的原因 , 是"資料讀取筆數"設定不足產生的問題嗎?? 還是BUG??"

以下方前次所附PRINT的資料 (2021-02-01 GIS-KY) 為例, 程式碼如初次問題詢問所附

如非資料筆數不足, 則造成上述Print 資料 EMA(mid,15) , EMA(mid, 30) 與實際收盤價 差異甚鉅的原因為何呢?

如果資料筆數沒問題, 語法也無疑義, 是 PRINT 出來的數值有誤嗎?還是 實際計算邏輯有問題呢?

另"EMA(idx_B,15),EMA(idx_B,30),EMA(idx_B,60) 數值於設定SetTotalBar(Length * 60) 後計算仍異常"

這部分仍未解...

如您這邊依程式碼測試正常, 可否提供相關的資料及程式碼參考, 以便調整呢?

因為這關係到一隻預計下實單的雷達核心邏輯, 再麻煩您了!

XQ小幫手 發文於   2021/02/02

Neo 您好

1."EMA(xfMin_EMA("1", Close,20),15),EMA (mid,15) PRINT 出來的數值差異甚鉅的原因 , 是"資料讀取筆數"設定不足產生的問題嗎?? 還是BUG??"

A: 您都知道xfMin_EMA 與  average不同 ,那為何會覺得以這兩個為參數所繪製的

EMA(xfMin_EMA("1", Close,20),15),EMA (mid,15) 數值會相同?

2. 如非資料筆數不足, 則造成上述Print 資料 EMA(mid,15) , EMA(mid, 30) 與實際收盤價 差異甚鉅的原因為何呢?

A: 兩者的參數是不一樣的

3. 上述所說的,資料讀取筆數值的問題,主要是EMA 與布林通道兩者為"連續指標" 會取用到前者計算的值

來運算當期值,需要拉長時間來做計算

 

XQ小幫手 發文於   2021/02/02

舉例:

您可以試試看以下,我們來觀看所有的值而 value1 and value2 為不同的起點

ret=1;

value1=average(close, 20);
value2=xfMin_EMA("1", Close,20);
value3=EMA(value1,15);
value4=EMA(value2,15);

print(date,time,close,value1,value2,value3,value4);

print出來會是不同的

顯示更多回應 發表回覆
Close