SMA是用每根K棒的 "收盤" 那當日還沒收盤 怎麼計算出均線指標的?

  •   376 
  • 最後發表   蓬蘇王杜  2024 十二月 04
蓬蘇王杜 發文於   2024/11/30

如題 SMA是用每根K棒的 "收盤"  那當日還沒收盤 怎麼計算出均線指標的?   
我有一個策略 是希望如果當天漲幅高於(5日均線+1.5個ATR)*0.9 的話 就跌破 (5日均線+1.5個ATR)*0.9 出場
這個條件只限定在當日 所以所有數值都要是當下的條件
那在指標上會不會有失準的問題 因為當日還沒收盤 沒辦法算出準確的(5日均線+1.5個ATR)*0.9
我再交易腳本回測沒有達到我想要的狀況 並沒有觸發跌破 (5日均線+1.5個ATR)*0.9 出場

以下附上程式碼 , 謝謝各位的回答!

// 設定參數

input: money(15, "下單金額(萬)"),               // 下單金額(單位萬)

       atr_length(5, "ATR計算天數"),           // ATR計算天數

       high_length(5, "突破高點參考天數"),     // 突破高點天數

       ma_length(5, "均線天數"),                // 均線天數

       atr_multiplier(1.5, "ATR倍數"),          // ATR倍數

       stop_loss_pct(3, "停損百分比"),          // 停損百分比

       adjustment_factor(0.9, "價格調整倍數"),   // 調整倍數

       low_length(3, "低點參考天數");           // 低點參考天數

 

// 宣告變數

var: atr_value(0),                // ATR 值

     highest_close(0),            // 最近 high_length 天的最高收盤價

     position_size(0),            // 開倉股數

     stop_loss_price(0),          // 停損價格

     ma_plus_atr(0),              // 5日均線 + 1.5倍ATR

     adjusted_price(0),           // (5日均線 + 1.5倍ATR) * 調整倍數

     three_day_low(0);            // 最近 3 日低點

 

// 計算 ATR

atr_value = Average(TrueRange, atr_length);

 

// 計算最近 high_length 天的最高收盤價

highest_close = Highest(Close[1], high_length);

 

// 計算 5 日均線 + 1.5倍ATR

ma_plus_atr = Average(Close, ma_length) + (atr_value * atr_multiplier);

 

// 計算調整後的價格

adjusted_price = ma_plus_atr * adjustment_factor;

 

// 計算最近 low_length 天的最低價

three_day_low = Lowest(Low, low_length);

 

// 開倉邏輯

if Position = 0 and Close > highest_close then begin

    // 計算開倉股數(取整數)

    position_size = IntPortion((money * 10000) / (Close * 1000));

    if position_size > 0 then begin

        SetPosition(position_size);  // 進場

        stop_loss_price = FilledAvgPrice * (1 - stop_loss_pct / 100);  // 設定初始停損價格

    end;

end;

 

// 停損邏輯:跌破庫存成本 - 3% 出場

if Position > 0 and Close < FilledAvgPrice * (1 - stop_loss_pct / 100) then begin

    SetPosition(0);  // 平倉

end;

 

// 停利邏輯:跌破條件出場

if Position > 0 then begin

    // 如果當天股價大於調整價格

    if High >= adjusted_price then begin

        if Close < adjusted_price then begin

            SetPosition(0);  // 平倉

        end;

    end;

    // 跌破最近3日低點出場

    if Close < three_day_low then begin

        SetPosition(0);  // 平倉

    end;

 

end;

 

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/12/01

還沒收K時,5日均線是用過去4根收盤加上今天的即時成交價算出均值。

這3天最低價three_day_low = Lowest(Low, low_length);這樣寫的話,若三天最低價出現在今天,則Close < three_day_low條件不會成立。應改成three_day_low = Lowest(Low[1], low_length);

  • 按讚來自於
  • YEAH301000
蓬蘇王杜 發文於   2024/12/01

謝謝教授 !  確實點出的我沒想到的問題.
還有一點想請教, 我在指標腳本寫出5日均+2個atr的價格  在日k可以正常畫出來  30分k為什麼就無法了

 

// 設定參數

input: avg_length(5, "均線長度"),       // 均線長度

       atr_length(5, "ATR計算天數"),  // ATR 計算天數

       atr_multiplier(3, "ATR倍數");   // ATR 倍數

 

// 宣告變數

var: moving_avg(0),   // 均線

     atr_value(0),    // ATR 值

     indicatorX(0);    // 最終指標值

 

// 計算 5 日均價

moving_avg = Average(Close, avg_length);

 

// 計算 ATR

atr_value = Average(TrueRange, atr_length);

 

// 計算指標值:5 日均價 + 3 個 ATR

indicatorX = moving_avg + (atr_value * atr_multiplier);

 

// 繪製指標

 

Plot1(indicatorX, "5日均線+3ATR");

 

虎科大許教授 發文於   2024/12/01

我測試你的指標腳本,30分鐘頻率下,可正常顯示indicatorX。

  • 按讚來自於
  • YEAH301000
蓬蘇王杜 發文於   2024/12/01

確實是有顯示出來 是我表達不夠清楚,數值跟日k有差異,我剛剛爬文,應該是因為atr都是默認當下頻率的k棒 ,我要指定日頻率然後在分鐘頻率顯示才對

虎科大許教授 發文於   2024/12/01

這需要自己撰寫跨頻率函數,抓取ATR跨頻率的數據。這是進階的應用。也是我進階課程第7講的內容。

蓬蘇王杜 發文於   2024/12/01

我大概寫了一些 但日K的顯示跟30分的顯示還是對不上, 還 發現一個奇怪的問題 明明數值是5日均+1.5ATR XQ技術圖面顯示線卻在五日均下方 ,以下附圖  先謝謝教授以及各位!!

// 設定參數

input: ma_length(5, "均線天數"),

       atr_length(5, "ATR計算天數"),

       atr_multiplier(1.5, "ATR倍數");

 

// 宣告變數

var: five_day_ma(0),      // 5 日均線

     atr_value(0),        // ATR 值

     ma_plus_atr(0),      // 5 日均線 + ATR

     tr_current(0),       // 當前真實區間

     tr_sum(0);           // ATR 計算中的總和

 

// 設定準備資料

settotalbar(300);  // 需要 200 筆資料才能計算指標

 

// 計算日頻率的真實區間 (True Range)

if GetField("Close", "D")[1] > GetField("High", "D") then 

    tr_current = GetField("Close", "D")[1] - GetField("Low", "D")

else if GetField("Close", "D")[1] < GetField("Low", "D") then 

    tr_current = GetField("High", "D") - GetField("Close", "D")[1]

else 

    tr_current = GetField("High", "D") - GetField("Low", "D");

 

// 累加指定天數的真實區間計算 ATR

tr_sum = tr_current;

for value1 = 1 to atr_length - 1 begin

    tr_sum += xf_GetValue("D", tr_current, value1);

end;

atr_value = tr_sum / atr_length;

 

// 計算 5 日均線和 5 日均線 + 1.5 倍 ATR

five_day_ma = Average(GetField("Close", "D"), ma_length);

ma_plus_atr = five_day_ma + (atr_value * atr_multiplier);

// 繪圖

Plot1(five_day_ma, "5日均線");             // 繪製 5 日均線

 

Plot2(ma_plus_atr, "5日均 + 1.5ATR");     // 繪製 5 日均線 + ATR

 

XS小編 發文於   2024/12/04

Hello 蓬蘇王杜,

 

小編這邊測試數值相同,5日均+1.5ATR也在 5日均之上 (參考附圖)。

需注意30分鐘頻率和日頻率只有在當日最後一根K棒的時候才會相同。

由於您圖的解析度較低,小編無法確認您使用的商品為何。

麻煩提供 頁面匯出檔勾選(包含)指標腳本 以及 XQ Log 讓相關人員檢驗。

Log資料夾(預設路徑:C:\SysJust\XQLite\LOG)直接壓縮後提供即可。

您可以直接將檔案上傳,如果檔案過大的話也可以保存到雲端後將連結Mail至客服信箱 XQservice@XQ.com.tw 且務必附上 討論文章連結網址(小編才能盡早處理)。

感謝。

附加文件

發表回覆
Close