進出場回測問題

  •   340 
  • 最後發表   扉扉  2025 三月 11
扉扉 發文於   2025/03/06

我想針對台指期貨設定進出場條件
條件如下
🔹進場條件

  • 時間 08:48
  • 若 08:48 收盤價 > 08:48 開盤價,則 市價買進 1 口
  • 若 08:48 收盤價 < 08:48 開盤價,則 市價賣出 1 口

🔹出場條件

  • 如果是賣單,當價格 比進場價格上漲 100 點,則 市價平倉
  • 如果是買單,當價格 比進場價格下跌 100 點,則 市價平倉

我所寫的語法如下
-----------------
 input: _BuyOrSell(-1), _StopLost(100, "停損點數"); 

Vars: MyEntryPrice(0); 

 

// 限制僅支援分鐘 K 棒 

if barfreq <> "Min" then raiseRunTimeError("僅支援分鐘"); 

 

// 進場策略(_BuyOrSell = 1 表示進場策略) 

if _BuyOrSell = 1 and time = 0848 then begin 

    if close > open then begin 

        // 08:48 收盤價 > 開盤價,市價買進 1 口 

        setposition(1, market); 

        MyEntryPrice = close;  // 記錄進場價格 

    end  

    else if close < open then begin 

        // 08:48 收盤價 < 開盤價,市價賣出 1 口 

        setposition(-1, market); 

        MyEntryPrice = close;  // 記錄進場價格 

    end; 

end; 

 

// 出場策略(_BuyOrSell = 0 表示出場策略) 

if _BuyOrSell = 0 then begin 

    if position > 0 and close >= (MyEntryPrice + _StopLost) then begin 

        // 持有多單,當價格上漲 100 點,市價平倉 

        setposition(0, market); 

    end; 

     

    if position < 0 and close <= (MyEntryPrice - _StopLost) then begin 

        // 持有空單,當價格下跌 100 點,市價平倉 

        setposition(0, market); 

    end; 

end; 
-----------------------------
編譯成功
回測時也顯示成功
但是沒有任何筆數
不知問題出在哪裡

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

_BuyOrSell這個參數預設為-1,在程式中沒有機會符合條件。

扉扉 發文於   2025/03/06

謝謝教授回答,可以怎麼修改呢

虎科大許教授 發文於   2025/03/06

你需要先問問自己,設定這個參數做什麼用?用來控制只作多?或是只作空?還是有其他用途。

扉扉 發文於   2025/03/06

感謝教授,目前剛接觸,想藉著參數回測過往資料,推估損益

虎科大許教授 發文於   2025/03/06

(1)由於你使用8點48分判斷訊號,因此不能任何分鐘都接受。我改成1分鐘頻率。

(2)設定time為8點48分,不可使用0848,必須使用084800。

你可以使用類似下列的程式測試台指期看看。

input: ProfitPoint(50, "停利點數"), LossPoint(50, "停損點數"); 
// 限制僅支援1分鐘 K 棒 
if barfreq <> "Min" or barinterval<>1 then raiseRunTimeError("僅支援1分鐘"); 
//進場
if position=0 and time = 084800 then 
    if close > open then 
        begin 
            // 08:48 收盤價 > 開盤價,市價買進 1 口 
            setposition(1, market); 
        end  
    else 
        if close < open then 
            begin 
                // 08:48 收盤價 < 開盤價,市價賣出 1 口 
                setposition(-1, market); 
            end; 
// 出場 
if position > 0 and (close >= (filledAvgPrice + ProfitPoint) or close <= (filledAvgPrice - LossPoint)) then
    // 持有多單,符合停利停損條件,市價平倉
    setposition(0, market); 
if position < 0 and (close <= (filledAvgPrice - ProfitPoint) or close >= (filledAvgPrice + LossPoint)) then
    // 持有空單,,符合停利停損條件,市價平倉 
    setposition(0, market); 

扉扉 發文於   2025/03/06

我試著將上面的語法跑回測,結果為失敗。
把1分鐘改成3分鐘回測顯示成功,但仍然沒有筆數

虎科大許教授 發文於   2025/03/06

(1)上述的腳本是交易腳本,請確認是否用交易腳本回測。

(2)若沒修改上述程式,3分鐘頻率是不行的。腳本限制只能用1分鐘頻率,

(3)我測試了上述程式,針對台指期近月(一般)以1分鐘頻率回測,是OK的。

XS小幫手 發文於   2025/03/11

扉扉 您好,

您還可以先分段註解掉部分程式碼,並在腳本內加入print語法,來觀察變數與函數的變化

 

print(

"date=",numToStr(date,0),", ",

"time=",numToStr(time,0),", ",

......

{觸發條件、變數、價量等等}

);

 

參考:

1. https://xshelp.xq.com.tw/XSHelp/search?a=print

2. https://www.xq.com.tw/learn/xspractice/printdebug/

 

發表回覆
Close