自訂特大單金額

  •   6 
  • 最後發表   師哥  2 小時前
師哥 發文於   2026/03/14

各位大大,

因為XQ內建的特大單金額是400萬以上,我覺得這不太便利,我想要透過自訂金額的方式來找出特大單。

所以我嘗試用AI來幫忙寫出這樣的想法,但是輸出的圖明顯是錯的,因為我將特大單自訂金額設定為400萬以上,來跟xq內建的做比較,來看說ai寫得對不對。所以想請各位大大幫忙看一下哪邊邏輯出錯了

謝謝

// ---------------------------------------------------------------------------

// 腳本名稱:自訂特大單累計金額與淨額指標

// 執行頻率:建議設定為 "Tick"

// ---------------------------------------------------------------------------

 

input: 

_ThresholdInput(400, "自訂大單門檻(萬元)", InputKind:=Dict(

   

    ["400萬", 400],

    ["1000萬", 1000],

["3000萬", 3000],

["5000萬", 5000],

["1億", 10000]

), Quickedit:=True);

 

var: intrabarpersist _LargeBuyAmtSum(0);  // 累計自訂大單買入金額(元)

var: intrabarpersist _LargeSellAmtSum(0); // 累計自訂大單賣出金額(元)

var: _TickAmount(0);                      // 當前 Tick 成交金額

var: _ThresholdValue(0);                  // 門檻值(元)

var: _NetLargeAmt(0);                     // 大單買賣差額(元)

 

// ------------------------------

// 1. 初始化與每日重置邏輯

// ------------------------------

// 使用 date <> date[1] 判斷新交易日,重置累計數值

if date <> date[1] then begin

    _LargeBuyAmtSum = 0;

    _LargeSellAmtSum = 0;

end;

 

// 將輸入的萬元門檻轉換為元

_ThresholdValue = _ThresholdInput * 10000;

 

// ------------------------------

// 2. Tick 資料取得與金額計算

// ------------------------------

// 計算當前 Tick 成交總額 (價格 * 張數 * 1000股)

_TickAmount = Close * Volume * 1000; 

 

// ------------------------------

// 3. 門檻過濾與金額累加

// ------------------------------

// 判斷當前 Tick 金額是否大於等於自訂門檻

if _TickAmount >= _ThresholdValue then begin

    

    // 取得內外盤標記:1 為外盤(買進), -1 為內盤(賣出)

    value1 = GetField("BidAskFlag", "Tick");

    

    if value1 = 1 then begin

        _LargeBuyAmtSum = _LargeBuyAmtSum + _TickAmount; // 累加買盤大單金額

    end else if value1 = -1 then begin

        _LargeSellAmtSum = _LargeSellAmtSum + _TickAmount; // 累加賣盤大單金額

    end;

    

end;

 

// ------------------------------

// 4. 計算買賣差額

// ------------------------------

// 計算買賣大單的淨流向 (買入 - 賣出)

_NetLargeAmt = _LargeBuyAmtSum - _LargeSellAmtSum;

 

// ------------------------------

// 5. 數值輸出與繪圖

// ------------------------------

// 將所有結果轉換回「萬元」單位輸出

plot1(_LargeBuyAmtSum / 10000, "自訂大單買入(萬)");

plot2(_LargeSellAmtSum / 10000, "自訂大單賣出(萬)");

 

plot3(_NetLargeAmt / 10000, "大單買賣差額(萬)"); // 新增:買賣大單淨額

排序方式: 標準 | 最新
虎科大許教授 發文於   2026/03/14

若你使用日頻率,由於date<>date[1]永遠成立,因此_LargeBuyAmtSum及_LargeSellAmtSu每次洗價都會歸零。會有邏輯錯誤。

師哥 發文於   2026/03/14

許教授,我是用60分鐘線,不是日頻率。兩者跑出來的結果還是不對。

請問許教授怎麼修正才會符合我想要的結果呢? 

謝謝

虎科大許教授 發文於   2026/03/14

GetField("買進特大單金額")及GetField("賣出特大單金額")是分鐘及日頻率的數據。若你使用60分鐘,則它們分別代表每60分鐘的特大單金額。若你使用GetField("買進特大單金額","D")及GetField("賣出特大單金額","D")則是當天累積的特大單金額。你用兩個變數累加這兩個數值,但用Date<>Date[1]讓變數歸零,這會造成9點的K棒數據都是0。若在盤中執行,需要改成isFirstCall("Date"),這樣就只會在開盤第一個Tick歸零。

你計算的數據與技術分析圖表不同,最主要的原因是收盤狀態下,程式是每根60分K洗價一次。在盤中,另外一個可能結果不同的原因,是漏接Tick。這種情況很常見。需要另外寫程式碼以確保Tick不會漏接,這樣兩者的數據才會相同。

若你在盤中將_LargeBuyAmtSum與GetField("買進特大單金額","D")比較,它們應該相同。

師哥 發文於   2026/03/14

謝謝許教授,加進您的建議後
我修正成這樣,還是不知道哪邊出錯,看起來跟系統還是不同

 

 

 

 

input: 

_ThresholdInput(400, "自訂大單門檻(萬元)", InputKind:=Dict(

   

    ["400萬", 400],

    ["1000萬", 1000],

["3000萬", 3000],

["5000萬", 5000],

["1億", 10000]

), Quickedit:=True);

 

var: 

    intrabarpersist _TotalBuyAmt(0),    // 當日累計買進大單金額

    intrabarpersist _TotalSellAmt(0),   // 當日累計賣出大單金額

    intrabarpersist _LastResetDate(0),  // 日期重置旗標

    intrabarpersist _PrevBarBuyVol(0),  // 前一刻的外盤累積量

    intrabarpersist _PrevBarSellVol(0), // 前一刻的內盤累積量

    intrabarpersist _LastBarIndex(-1),  // K 棒編號紀錄

    _DeltaBuy(0),                       // 本次增加的外盤量

    _DeltaSell(0),                      // 本次增加的內盤量

    _Threshold_Value(0);                // 換算後的門檻(元)

 

// ------------------------------

// 1. 初始化門檻與每日開盤重置

// ------------------------------

_Threshold_Value = _ThresholdInput * 10000;

 

// 許教授建議修正:使用旗標變數確保每日只在第一筆成交時重置一次

if Date <> _LastResetDate then begin

    _TotalBuyAmt = 0;

    _TotalSellAmt = 0;

    _LastResetDate = Date;

end;

 

// ------------------------------

// 2. 處理新舊 K 棒的成交量銜接

// ------------------------------

// 當分鐘線換下一根 K 棒時,上一根的累積值紀錄要歸零重新計算 Delta

if CurrentBar <> _LastBarIndex then begin

    _PrevBarBuyVol = 0;

    _PrevBarSellVol = 0;

    _LastBarIndex = CurrentBar;

end;

 

// ------------------------------

// 3. 增量演算 (不漏接 Tick 核心)

// ------------------------------

// Delta = 當前 K 棒累積值 - 上一刻紀錄的值

_DeltaBuy = GetField("外盤量") - _PrevBarBuyVol;

_DeltaSell = GetField("內盤量") - _PrevBarSellVol;

 

// 判斷買進大單 (金額 = 增量張數 * 當前價 * 1000)

if (_DeltaBuy * Close * 1000) >= _Threshold_Value then begin

    _TotalBuyAmt = _TotalBuyAmt + (_DeltaBuy * Close * 1000);

end;

 

// 判斷賣出大單

if (_DeltaSell * Close * 1000) >= _Threshold_Value then begin

    _TotalSellAmt = _TotalSellAmt + (_DeltaSell * Close * 1000);

end;

 

// 更新洗價紀錄基準點,供下一個 Tick 使用

_PrevBarBuyVol = GetField("外盤量");

_PrevBarSellVol = GetField("內盤量");

 

// ------------------------------

// 4. 繪製指標

// ------------------------------

Plot1(_TotalBuyAmt / 1000000, "自訂買進大單(百萬)");

Plot2(_TotalSellAmt / 1000000, "自訂賣出大單(百萬)");

Plot3((_TotalBuyAmt - _TotalSellAmt) / 1000000, "自訂大單淨額(百萬)");

發表回覆
Close