分批出場,出場一半後便無動作

  •   73 
  • 最後發表   路人小員工  2025 八月 18
路人小員工 發文於   2025/07/23

// ==== 多單處理邏輯 ====

if filled = 2 then begin

    entryCompleted = true; // 完整進場確認

end;

if entryCompleted then begin

    // 達到 +50 點,平掉一半倉位

    if high >= close15 + 50 then begin

        SetPosition(1, market); // 平掉一半倉位

        hitProfitTarget50Long = true; // 記下已達 +50 點

    end;

end;

if filled = 1 and entryCompleted then begin

    // ? 第一步:保底出場條件(已達 +50,尚未達 +100)

    if hitProfitTarget50Long and not hitProfitTarget100Long then begin

        if low <= FILLedAvgPrice + 5 then

            setposition(0, market);  // 回跌至 +5,先保本出場

    end;

    // ? 第二步:更新是否已達 +100

    if high >= FILLedAvgPrice + 100 then

        hitProfitTarget100Long = true;

    // ? 第三步:鎖利條件(已達 +100)

    if hitProfitTarget100Long then begin

        if low <=FILLedAvgPrice + 50 then

            setposition(0, market);  // 回跌至 +50,全部出場

    end;

end;

在10分k下運行,有開逐筆洗價,但達到 +50 點,平掉一半倉位後,如果價格跌回成本+5時,也不會觸發出場,會一直等到尾盤才出場。請問上面的部分要怎麼修改才能正常運作呢?

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

我看到了兩個問題:

(1)已達+50,會一直送出setposition(1)的無效指令,應該在IF加position=2的條件控制。

(2)價格回跌到成本+5沒有出場的原因應該是變數hitProfitTarget50Long在宣告時沒有加intrabarpersist。hitProfitTarget100Long也是有相同的問題。

路人小員工 發文於   2025/08/07

感謝許教授的回覆。

變數已在宣告時加intrabarpersist,也在IF加filled=2的條件控制。

那像今天

// === 多單出場邏輯 ===

if entryCompletedLong and Filled = 2 then begin

    // 如果尚未平一半

    if not partialExitDoneLong and High >= FilledAvgPrice + 100 then begin

        // 若 High 直接衝破 +100,就先平掉一半、進入鎖利模式

        SetPosition(1, market);

        partialExitDoneLong = true;

        hitProfitTarget50Long = true;

        hitProfitTarget100Long = true;

    end else if not partialExitDoneLong and High >= FilledAvgPrice + 50 then begin

        // High >= +50,平掉一半

        SetPosition(1, market);--------先觸發這行

        partialExitDoneLong = true;

        hitProfitTarget50Long = true;

    end;

end;

if entryCompletedLong and Filled = 1 and partialExitDoneLong  then begin

        // 已平一半 → 處理剩餘一口的鎖利邏輯

        if not hitProfitTarget100Long and Low <= FilledAvgPrice + 5 then begin

            // 尚未達 +100,跌回 +5,保本出場

            SetPosition(0, market);--------同時又觸發這行

        end else if High >= FilledAvgPrice + 100 then begin

            // 達到 +100,記錄進入鎖利

            hitProfitTarget100Long = true;

        end else if hitProfitTarget100Long and Low <= FilledAvgPrice + 50 then begin

            // 已達 +100,跌回 +50,出清

            SetPosition(0, market);

        end;

    end;

同時觸發兩行,該怎麼修正才能達成我一開始預訂的出場方式呢?

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

你說的兩次setposition同時觸發,應該不是發生在同一次洗價,因為第一個下單的指令改變的部位filled,最快要到下一次洗價才會更新。第一次平倉一半,很快又結清部位,應該與filledAvgPrice有關。XQ的庫存平均成本按照先進先出規則計算,減碼之後,它就是第二次買進的成本,你用Low低於庫存成本加5點,在當根K棒急拉時(長紅K)時,Low可能遠低於庫存成本加5點,因此很快就結清部位。把Low改成Close,會比較合理。

路人小員工 發文於   2025/08/07

感謝許教授的回覆,我附上今天xq的執行紀錄給你看看,似乎兩次setposition應該是同時觸發,中間只差一點點時間。另外當時 Filled = 2跟 Filled = 1我是用position,會是主要原因嗎?

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

看起來是同一次洗價觸發兩次下單指令。不過,這很奇怪,就算你用Position=1取代filled=1,也不應該同一次洗價執行兩次setposition。也許用Else處理比較好。例如

if entryCompletedLong and Filled = 2 then begin

//....

end

else

   if entryCompletedLong and Filled = 1 and partialExitDoneLong  then begin

      //....

end;

路人小員工 發文於   2025/08/07

剛剛我回測今天,並沒有出現同時觸發出場的狀況,而是照腳本先出一筆,然後收盤再出一筆,

只能說是運氣差吧!

感謝許教授的幫忙!

XS小編 發文於   2025/08/12

Hello 路人小員工,

 

雖然要有Log才能夠確認,小編認為可能是兩次洗價非常接近,因此腳本連續兩次運算改變了position兩次。

由於position的變化和filled的變化不同,不需要有實際交易即會改變,因此是可能在兩次極近的洗價中連續變化的。

改為用filled限制的話可以確保策略在前一筆交易完成後才會進行下一次的交易。

安控上限則是策略安控設定中的每分鐘最多交易次數,此安控會依據position的變化來計算次數。

路人小員工 發文於   2025/08/18

今天又發生了一次同時出場的狀況,我的推測大概是這樣,請許教授看看是否合理。

entryCompletedLong成立後,開始進入出場的判斷,

High >= FilledAvgPrice + 50成立時,賣出一半,

partialExitDoneLong 跟  hitProfitTarget50Long 同時成立,

所以Filled = 2賣出變成1,所以Filled = 1也成立,

但這時這支10分K還沒結束,在這K內,以下兩件事也都發生過,所以也成立

 

 not hitProfitTarget100Long 、 Low <= FilledAvgPrice + 5,所以又再次觸發賣出。

我們認為應該在entryCompletedLong and Filled = 1 and partialExitDoneLong 這三件發生後,

系統才去判斷not hitProfitTarget100Long and Low <= FilledAvgPrice + 5,

但看起來系統在一開始出現Low <= FilledAvgPrice + 5時已經做了記號,

所以才會在平倉一半後,就算價格沒有回測。卻一樣觸發出場。

 

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

你先按照我建議的方式修改程式,若還有問題,再貼文上來詢問。

路人小員工 發文於   2025/08/18

好的,謝謝許教授!

發表回覆
Close