依照MACD的定義:
DIF = EMA(12)-EMA(26)
MACD = EMA(DIF,9)
柱狀圖 = DIF - MACD
比較過XQ和其他軟體的數值發現不一樣,再仔細查看發現是XQ的值有問題
請程式設計員檢查其公式,以免使用MACD為進出場依據的投資人誤判而造成損失
依照MACD的定義:
DIF = EMA(12)-EMA(26)
MACD = EMA(DIF,9)
柱狀圖 = DIF - MACD
比較過XQ和其他軟體的數值發現不一樣,再仔細查看發現是XQ的值有問題
請程式設計員檢查其公式,以免使用MACD為進出場依據的投資人誤判而造成損失
JamesBond007 您好
請問您覺得問題點在哪裡?
是否能夠請您提供一檔股票為範例做看盤軟體之間的比對圖?
因為我們以技嘉2020/12/08 為例
MACD參數 12-26-35
數值為 1.41 -0.05 1.46
是與市面上各大券商 元富、元大 等數據相同的

再請您對於有問題點,提出指教 謝謝
MACD 值計算是採用移動平均方式,會跟取用天數有關,取50 天與100 天算出的值會不同,取用時間越長越準確,差異越小。不是公式有問題。
您好,請看下圖數據,請把移動平均線改成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還比較接近合理


EMA就是移動平均,數值不是固定的,取12/22前1個月(20筆)資料來算12/22當天的EMA(12) 和取12/22前2個月(40筆)資料來算12/22當天的EMA(12) 數值是不同的。當然算MACD 與DIF 也會有同樣的問題。不同軟體取用資料筆數可能不同,因此造成數字不同。基本上,如果大家都取1年(240筆)以上資料來算,大家應該都會數值很接近。
研究了一下
XQ主圖上的EMA可以選擇不同的計算基準
如果把EMA的計算基準調整成 "加權收盤價"
就會發現符合DIF = EMA(12)-EMA(26)
另外再去看一下XS指標內建的MACD
腳本中用的收盤價也是 "加權收盤價"
感謝 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 認定的不同 所以導致計算結果有差異
您可以調整指標為上面第一個的版本 就會是您要的數值了

感謝 WeiieW大和XQ小幫手的解惑
雖然已經找到DIF數值差異的原因,但小弟仍不知道要怎麼改程式才能跑出正確的結果
我想要維持EMA用收盤價來計算,要怎麼做才能使DIF正確=EMA12-EMA26呢?
PS.我不是唸資工的,不知道如何改程式碼,可以指導一下嗎?
您把以下這段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");
小幫手....錯了
你的第10行 WeightedClose(); 就是加權收盤價...
要改成 price = close;
WeiieW 感謝提醒
抱歉這段忘了刪掉,(已修正了)
直接刪除此變數就好
因為把XAverage 改成 ema 的話
就不會運用到此變數了
12 評論