TradingView 這個參數_request.security()_XS寫得出來嗎?

  •   146 
  • 最後發表   Hsyih  2025 八月 16
Hsyih 發文於   2025/08/16

  1. TradingView 的獨特作法: 您的 Pine Script 程式碼使用了一個非常特殊的功能 request.security()。它的運作方式可以理解為:

    • 第一步:在 1 分鐘的精細資料上,先計算出平滑的 ALMA 移動平均線。

    • 第二步:每隔 10 分鐘,去「採樣」一次那條 1 分鐘 MA 線的數值

    • 第三步:將這個採樣到的數值,作為接下來 10 分鐘內固定不變的「階梯線」值。 這種「先計算再採樣」的邏輯,會產生非常平滑且反應滯後的階梯狀訊號線。

  2. XS 的限制

    • XS 的跨頻率函數 GetField 主要是用來取得原始的 K 棒資料(如 10 分鐘的開盤價、收盤價),它無法對一個在 1 分鐘週期上已經計算完成的自訂指標序列進行「採樣」。

    • 我們之前所有試圖用 xfMin_GetDTValue 來手動模擬「採樣」的嘗試,都因為 XS 在處理這種複雜、非連續的序列歷史值 ([1]) 時遇到瓶頸,最終導致腳本中斷或無法產生訊號。

結論就是:Pine Script 的這種特殊採樣模式,在 XS 中沒有可以直接對應且穩定運行的實現方法。

// --- 區塊 B:高週期採樣與階梯線建立 ---

vars:
    _openSeries_Sampled(0),
    _closeSeries_Sampled(0);

// 使用 xfMin_GetDTValue 判斷是否為 10 分鐘週期的第一根 K 棒
// 【問題點】: 這一行程式碼在我們的測試中,會導致腳本在執行時中斷
if xfMin_GetDTValue("10", date) <> xfMin_GetDTValue("10", date)[1] then begin
    // 如果是,就去「採樣」前一分鐘MA線的數值
    _openSeries_Sampled = _openSeries_base[1];
    _closeSeries_Sampled = _closeSeries_base[1];
end else begin
    // 如果不是,就維持前一分鐘的「階梯」數值不變
    _openSeries_Sampled = _openSeries_Sampled[1];
    _closeSeries_Sampled = _closeSeries_Sampled[1];
end;
當 XS 引擎執行到 if xfMin_GetDTValue("10", date) <> xfMin_GetDTValue("10", date)[1] 這一行時,雖然語法正確,但在我們的複雜腳本環境中,它引發了一個底層的執行錯誤,導致整個腳本的運算當場中斷

虎科大許教授 發文於   2025/08/16

看看下面的程式碼是否就是你需要的。

if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘");
vars:
    myTime(0),
    _openSeries_Sampled(0),
    _closeSeries_Sampled(0),
    _openSeries_base(0),
    _closeSeries_base(0);
_openSeries_base=average(open,20);
_closeSeries_base=average(close,20);
myTime=GetField("時間", "10");
if myTime <> myTime[1] then begin
    _openSeries_Sampled = _openSeries_base[1];
    _closeSeries_Sampled = _closeSeries_base[1];
end else begin
    _openSeries_Sampled = _openSeries_Sampled[1];
    _closeSeries_Sampled = _closeSeries_Sampled[1];
end;
plot1(_openSeries_Sampled, "開盤序列");
plot2(_closeSeries_Sampled,"收盤序列");

發表回覆
Close