學習自動交易腳本的debug

  •   65 
  • 最後發表   蘆葦  2025 七月 16
蘆葦 發文於   2025/07/14

各位高手好,我想請問您們將交易策略寫成自動交易腳本的時候,如何驗證你們想要的意思在XS上是一樣的,我的作法是我把我一開始想的策略先寫在量化積木裡面,我再到交易腳本寫出同樣的近出場條件,以相同日期去跑回測後得出相同的結果,那我就能說我的腳本是正確的,但過程中我也發現量化積木提供的選擇很標準無法客製化,有一部分也是積木的問題。但當不一樣時,我就不知道是誰的問題,因此我在debug會有很多問題。之前有位學長說就只能直接跑虛擬帳戶,跑出結果後,用這個結果去回推當初寫的腳本對不對,但我認為這樣時間上來說實在是太浪費了,請問版上的大神,你們在寫自動交易的腳本的時候,是如何測試寫出自己想要的那個結果呢,還是像學長一樣測試才是正確的?

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

若只是想驗證交易策略的邏輯是否正確,只要用虛擬帳號,結合print指令,執行看看,就可得知腳本的邏輯是否與你想要的相同。透過量化積木比對回測結果,反而是繞了一大圈。

蘆葦 發文於   2025/07/14

許教授您好,對於您的回覆我有點不懂這個概念。我舉個例子好了,假設今天我想要用交易腳本寫出最大持有區間為5期的時候出場,那麼我就開始打開腳本,一直測試新的東西,改寫到能夠達到我的標準,這時候我可以對找量化積木的結果得知我的方式對不對,我反而不知道如何用Print以及虛擬帳號執行除錯,我的除錯似乎是建立在自動交易腳本的回測結果與量化積木的回測結果,但是這樣是找到問題並改寫成正確答案是正確的撰寫程式的方式嗎?還是只能按照您說的那個方式,用虛擬帳號結合print指令呢?感謝許教授的幫忙!!

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

假設你在價格高於過去5期最高價時進場,且希望持有5天出場,執行下列交易腳本,你可看到已經進場幾天了。以2345智邦為例,我們準備6根日K,打算在過5天高點進場,且打算持有5天,執行程式,你會發現,到今天為止,已進場3天了。

setTotalBar(6);
var: InDays(0), hasIn(false);
if hasIn=false and h>highest(h[1],5) then
    begin
        setposition(1);
        InDays=0;
        hasIn=true;
    end
else if hasIn=true then inDays+=1;
print(date,InDays);

蘆葦 發文於   2025/07/15

後來我寫出來了,我之後要在加停損以及停利的條件,根據我回測出來的結果,發現我加入停損停利條件後,最大持有區間的條件回測出來的結果就變得有問題了以上是我的程式碼

inputs:

    MaxHoldBars(5,"最大持有幾期"),         // 最多持有幾根 K 棒

    profit_percent(5, "停利(%)"),

loss_percent(10, "停損(%)"),

in_profit_percent(7,"盤中上漲7%");

 

vars:

    holdCount(0),

FinalTime(132900);

 

 

value1     = getField("外資買賣超","D")[1];

condition1 = value1 > 300;

 

// 4) 空倉時看進場條件

if Position = 0 and condition1 then 

begin

    SetPosition(1);

    holdCount = 0;  // 確保新進場前歸零

end;

 

// 2) 如果已持倉,就累加  

if Position <> 0 then 

    holdCount = holdCount + 1;

 

// 3) 出場邏輯:當「持有數 >= 上限」且「已過最晚時間」就出場,並立刻歸零計數  

if Position <> 0 then

 

begin

 

if profit_percent > 0 and

Close >= FilledAvgPrice*(1+0.01*profit_percent) then

begin

holdCount = 0;

setPosition(0, label:="停利出場");

end 

else if loss_percent > 0 and 

Close <= FilledAvgPrice*(1-0.01*loss_percent) then

begin

holdCount = 0;

setposition(0,label:="停損出場");

end

else if holdCount >= MaxHoldBars and

   (FinalTime <= 0 or currenttime >= FinalTime) then

begin

holdCount = 0;

SetPosition(0, label:="最大持有出場");

end;

end;

 

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

使用什麼頻率?

蘆葦 發文於   2025/07/16

日交易的頻率!謝謝許教授

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

問題出在你的 if holdCount >= MaxHoldBars and (FinalTime <= 0 or currenttime >= FinalTime) 條件是在loss_percent = 0的時候才會被判斷。

發表回覆
Close