分K跨頻率抓取

  •   10 
  • 最後發表   Ryan103325  12 小時前
Ryan103325 發文於   2026/07/03

下面是我想要做的一個當沖策略(第一次做當沖策略,希望能跟大家多多交流),遇到一些問題:
1. 抓3分K棒的低點做為進場的條件,但看起來進場的條件好像都不是在跌破3分K的低點後進場的
   =>我在想會不會是抓低點時出現問題,導致抓到錯誤的低點,進而在錯誤的時間點進場

2. 想請教利用交易系統的回測,在商品那邊選擇選股的話,他是會用昨日的條件去做選股再進行回測嗎,還是會直接用當天的資料去回測呢

3. 這個策略我目前是打算使用1分K做為交易的主要頻率~

// ============================================================
// 漲停跳空失敗 當沖放空策略 (1分K專用)
// 進場:昨漲停 + 今開高門檻 + 跌破第一根3分K低點 + 10:00前
// 出場:SwingHigh動態追蹤止損(收盤突破) / 2倍風險止盈(盤中觸價)
// ============================================================

input: _MaxAmount(10, "單筆上限金額(萬元)");        // 進場資金上限,單位萬元
input: _GapPct(3, "開高門檻(%)");                   // 今開相對昨收漲幅門檻
input: _CutTime(100000, "最後進場時間(HHMMSS)");    // 僅此時間前允許新開倉
input: _TpMult(2, "止盈倍數");                       // 目標=止損風險的幾倍

var: intrabarpersist _FirstLow(0);                  // 開盤後第一根已收完3分K低點
var: intrabarpersist _StopPrice(0);                 // 動態追蹤止損價
var: intrabarpersist _EntryPrice(0);                // 進場價
var: intrabarpersist _TargetPrice(0);               // 止盈目標價
var: intrabarpersist _Lots(0);                      // 進場張數
var: _NewSwing(0);                                   // 暫存最近SwingHigh

// ------------------------------
// 0. 每日開盤重置狀態 (跨日第一根K棒清空前一日殘留)
// ------------------------------
if date <> date[1] then begin
    _FirstLow    = 0;
    _StopPrice   = 0;
    _EntryPrice  = 0;
    _TargetPrice = 0;
    _Lots        = 0;
end;

// ------------------------------
// 1. 取開盤後第一根已收完的3分K低點
//    [1]=已收完的前一根3分K;Time>090300 確保第一根3分K已收完
// ------------------------------
if _FirstLow = 0 and GetField("最低價", "3")[1] > 0 and Time > 090300 then
    _FirstLow = GetField("最低價", "3")[1];

// ------------------------------
// 2. 前置條件檢查
// ------------------------------
// 昨日漲停:昨收 = 昨日漲停價 (漲停價直接取欄位,勿自算)
condition1 = Close[1] = GetField("漲停價", "D")[1];

// 今日開高:今開相對昨收漲幅 >= 門檻
condition2 = (OpenD(0) - Close[1]) / Close[1] * 100 >= _GapPct;

// ------------------------------
// 3. 進場判斷 (市價放空)
// ------------------------------
if position = 0
   and condition1
   and condition2
   and _FirstLow > 0
   and Close < _FirstLow             // 跌破第一根3分K低點
   and Time < _CutTime               // 10:00:00前
then begin
    // 張數計算:無條件捨去,以張為單位;為0則不進場
    _Lots = IntPortion(_MaxAmount * 10000 / (Close * 1000));

    if _Lots > 0 then begin
        _EntryPrice = Close;

        // 初始止損 = 最近SwingHigh(左右各3根確認) 往上1檔
        // AddSpread 依台股價格級距自動加tick,勿自算
        _NewSwing = SwingHigh(High, 3, 3, 3, 1);
        if _NewSwing > 0 then
            _StopPrice = AddSpread(_NewSwing, 1)
        else
            _StopPrice = AddSpread(High, 1);   // 找不到轉折高的保底

        // 止盈目標 = 進場價 - (止損 - 進場價) * 倍數
        _TargetPrice = _EntryPrice - (_StopPrice - _EntryPrice) * _TpMult;

        SetPosition(-_Lots * 1000);
    end;
end;

// ------------------------------
// 4. 持倉中:動態追蹤止損 (只收緊,不放寬)
// ------------------------------
if position <> 0 then begin
    _NewSwing = SwingHigh(High, 3, 3, 3, 1);
    // 出現更低的新SwingHigh 才下修止損
    if _NewSwing > 0 and AddSpread(_NewSwing, 1) < _StopPrice then
        _StopPrice = AddSpread(_NewSwing, 1);
end;

// ------------------------------
// 5. 出場判斷 (先止盈、後止損)
//    止盈:盤中觸價即出(用Low);止損:收盤確認才出(用Close)
// ------------------------------
if position <> 0 then begin
    if Low <= _TargetPrice then
        SetPosition(0)
    else if Close >= _TargetPrice then      
        SetPosition(0);
end;

截圖圖片

這張圖是他抓的其中一檔進出場的資料,有蠻多都是類似的情況的,想麻煩大大幫我看看是不是哪裡做錯了

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

(1)

condition2 = (OpenD(0) - Close[1]) / Close[1] * 100 >= _GapPct;

改成

condition2 = (OpenD(0) - GetField("參考價","D")) / GetField("參考價","D")另外, * 100 >= _GapPct;

另外,若你不是只判斷開盤漲幅夠不夠多,而是盤中只要漲幅超過3%都算符合條件,則要把OpenD(0)改成Close。

(2)

Lots本身就是交易張數,不應該再乘以1000。

SetPosition(-_Lots * 1000);

改成

SetPosition(-_Lots);

(3)

最後一個IF的止盈與止損的邏輯有問題,需要修正。

(4)

使用指定選股法回測或交易,都會以昨天收盤的數據選股,且將選出的股票加入執行商品監控。

發表回覆
Close