Bug : MACD的數值有問題

  •   764 
  • 最後發表   JamesBond007  2021 三月 08
JamesBond007 發文於   2020/12/18

依照MACD的定義:

DIF = EMA(12)-EMA(26)

MACD = EMA(DIF,9)

柱狀圖 = DIF - MACD

比較過XQ和其他軟體的數值發現不一樣,再仔細查看發現是XQ的值有問題

請程式設計員檢查其公式,以免使用MACD為進出場依據的投資人誤判而造成損失

排序方式: 標準 | 最新
XQ小幫手 發文於   2020/12/21

JamesBond007 您好

請問您覺得問題點在哪裡? 

是否能夠請您提供一檔股票為範例做看盤軟體之間的比對圖?

因為我們以技嘉2020/12/08 為例

MACD參數 12-26-35 

數值為 1.41 -0.05 1.46 

是與市面上各大券商 元富、元大 等數據相同的

再請您對於有問題點,提出指教 謝謝

jongjen 發文於   2020/12/21

MACD 值計算是採用移動平均方式,會跟取用天數有關,取50 天與100 天算出的值會不同,取用時間越長越準確,差異越小。不是公式有問題。

JamesBond007 發文於   2020/12/22

您好,請看下圖數據,請把移動平均線改成EMA12和EMA26

12/22日的數字為:EMA12 = 78.53, EMA26 = 78.18

所以EMA12 - EMA 26 = 0.35

但是程式卻顯示DIF12-26 = 0.43,既然DIF都算錯了,MACD35自然也是錯的

而另一張則是元大投資先生的截圖,DIF12-26 = 0.357還比較接近合理

jongjen 發文於   2020/12/23

EMA就是移動平均,數值不是固定的,取12/22前1個月(20筆)資料來算12/22當天的EMA(12) 和取12/22前2個月(40筆)資料來算12/22當天的EMA(12) 數值是不同的。當然算MACD 與DIF 也會有同樣的問題。不同軟體取用資料筆數可能不同,因此造成數字不同。基本上,如果大家都取1年(240筆)以上資料來算,大家應該都會數值很接近。

WeiieW 發文於   2020/12/24

研究了一下
XQ主圖上的EMA可以選擇不同的計算基準

如果把EMA的計算基準調整成 "加權收盤價"
就會發現符合DIF = EMA(12)-EMA(26)

另外再去看一下XS指標內建的MACD
腳本中用的收盤價也是 "加權收盤價"

XQ小幫手 發文於   2020/12/24

感謝 WeiieW大的解惑 

我嘗試了一下發現主要是我們與元大對於macd的計算方式會有些不同

可以參考一下程式碼

元大

SetBarMode(2);

input:thePrice(numericseries); //"價格序列"
input:Length(Numeric);   //"計算期間"

variable:  Factor(0);

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

if CurrentBar = 1 then
    EMA = thePrice
else if CurrentBar <= Length then
    EMA = (thePrice + (EMA[1]*(CurrentBar-1)))/CurrentBar   
else
    EMA = EMA[1] + Factor * (thePrice - EMA[1]);

--------------

XS

// XQ: MACD指標
//
input: FastLength(12), SlowLength(26), MACDLength(9);
variable: price(0);

SetInputName(1, "DIF短天數");
SetInputName(2, "DIF長天數");
SetInputName(3, "MACD天數");

price = WeightedClose();

Value1 = XAverage(price, FastLength) - XAverage(price, SlowLength);
Value2 = XAverage(Value1, MACDLength) ;
Value3 = Value1 - Value2 ;

// 前面區段資料變動較大, 先不繪出
//
if CurrentBar <= SlowLength then
begin
    Value1 = 0;
    Value2 = 0;
    Value3 = 0;
end;

Plot1(Value1, "DIF");
Plot2(Value2, "MACD");
Plot3(Value3, "Osc");
        

因為對於 MACD 第一項DIF 認定的不同 所以導致計算結果有差異

您可以調整指標為上面第一個的版本 就會是您要的數值了

JamesBond007 發文於   2020/12/25

 感謝 WeiieW大和XQ小幫手的解惑

雖然已經找到DIF數值差異的原因,但小弟仍不知道要怎麼改程式才能跑出正確的結果

我想要維持EMA用收盤價來計算,要怎麼做才能使DIF正確=EMA12-EMA26呢?

PS.我不是唸資工的,不知道如何改程式碼,可以指導一下嗎?

XQ小幫手 發文於   2020/12/25

您把以下這段code  貼入xs 指標編譯器裡面 然後編譯

並加入指標 就ok了

無須修改

// XQ: MACD指標
//
input: FastLength(12), SlowLength(26), MACDLength(9);

SetInputName(1, "DIF短天數");
SetInputName(2, "DIF長天數");
SetInputName(3, "MACD天數");

Value1 = EMA(Close,FastLength ) - EMA(Close, SlowLength);
Value2 = XAverage(Value1, MACDLength) ;
Value3 = Value1 - Value2 ;

// 前面區段資料變動較大, 先不繪出
//
if CurrentBar <= SlowLength then
begin
    Value1 = 0;
    Value2 = 0;
    Value3 = 0;
end;

Plot1(Value1, "DIF");
Plot2(Value2, "MACD");
Plot3(Value3, "Osc");

WeiieW 發文於   2020/12/28

小幫手....錯了

你的第10行 WeightedClose();    就是加權收盤價...

要改成  price = close;

XQ小幫手 發文於   2020/12/28

WeiieW  感謝提醒

抱歉這段忘了刪掉,(已修正了)

直接刪除此變數就好

因為把XAverage 改成 ema  的話

就不會運用到此變數了

顯示更多回應 發表回覆
Close