如何在逐筆洗價下計算正確的 1 分 K MACD?

  •   335 
  • 最後發表   KLC  2025 四月 28
KLC 發文於   2025/04/24

我目前使用 1 分 K 線撰寫策略,在收 K 線時計算 MACD 的值,不開啟逐筆洗價時是正確的

MACD(weightedclose(), 12, 26, 9, difValue, macdValue, oscValue);

但由於需要實時停損,在開啟逐筆洗價後,由於每分鐘內會有多筆洗價,而導致 MACD 值錯誤

我已經有將 MACD 函數放在 isFirstCall("bar") 的判斷內,print 的結果也確實每分鐘印一筆,但值是錯的

看起來即使沒有執行到這行也會將每次洗價的值納入考慮

請問要如何在開啟逐筆洗價的狀況下,計算正確的 1 分鐘 K 線 MACD?

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/04/24

(1)請確認是否讀取足夠的資料筆數。

(2)在isFirstCall("bar")裡面,要抓前一期的MACD。

KLC 發文於   2025/04/25

謝謝教授回覆

我嘗試把預讀取資料大幅拉到 100000 筆,抓前一期 MACD 的值仍是錯誤

settotalbar(100000);

var: difValue(0), macdValue(0), oscValue(0);
if isFirstCall("bar") then begin
    MACD(weightedclose(), 12, 26, 9, difValue, macdValue, oscValue);
    Print(time, "dif", difValue[1], "macd", macdValue[1]);
end;

有觀察到如果取 difValue[1] 和 macdValue[1] 的話,會有數十分鐘才更新一次值的現象,不確定原因為何

如果單純只取 difValue 和 macdValue 的話,趨勢大致符合但數值偏小,猜測是因為將 K 棒內 OHLC 全部納入計算,導致 dif 變小

虎科大許教授 發文於   2025/04/27

MACD(weightedclose(), 12, 26, 9, difValue, macdValue, oscValue);應該放在if isFirstCall("bar") then的上一行。

虎科大許教授 發文於   2025/04/28

我測試了,這樣寫所計算的MACD是正確的。

setTotalBar(300);
if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘");
var: difvalue(0),macdvalue(0),oscvalue(0);
macd(weightedClose,12,26,9,difvalue,macdvalue,oscvalue);
if isFirstCall("Bar") then
    print(date,time[1],difvalue[1],macdvalue[1],oscvalue[1]);

KLC 發文於   2025/04/28

這樣正確! 謝謝教授的協助!!

發表回覆
Close