自動交易腳本撰寫回測有問題

  •   57 
  • 最後發表   TM  3 週前
TM 發文於   2025/04/25

我想寫一個多次到頂後突破時,同時滿足周轉率以及大戶買超金額的自動交易,我將XS的多次到頂後突破指標改寫後,回測沒有滿足的條件出現,不知道要如何調整? 是否有大神可以幫忙看一下? 剛進來學習,還在摸索中,謝謝!!

//到頂突破
var: TouchTop(0);
var: Tuneoverratio(0);
var: Largeaccountmoney(0);
var: ConditionEntryTop(false);
var: ConditionEntryTuneover(false);
var: ConditionEntryLargeAccount(false);
var: ConditionEntryAll(false);
vars:
   holdingReturn(0),          // (currentPrice - avgEntryPrice_) / avgEntryPrice_ * 100
    entryDate_(0),             // FilledEntryDate adapter
    currentDate_(0),           // Date adapter
    avgEntryPrice_(0),         // FilledAvgPrice adapter
    ConditionExitProfit(false),
    ConditionExitLoss(false),
    ConditionExitTime(false),
    ConditionHasPosition(false),
    ConditionExit1(false),
    ConditionExit2(false),
    ConditionExit3(false);

input:HitTimes(3);    setinputname(1,"設定觸頂次數");
input:RangeRatio(1);  setinputname(2,"設定頭部區範圍寬度%");
input:Length(20);     setinputname(3,"計算期數");

settotalbar(Length + 3);

variable: theHigh(0); theHigh = Highest(High[1],Length);  //找到過去其間的最高點
variable: HighLowerBound(0);  HighLowerBound = theHigh *(100-RangeRatio)/100;  // 設為瓶頸區間上界
variable: TouchRangeTimes(0);                               //期間中進入瓶頸區間的低點次數,每跟K棒要歸0
 
//回算在此區間中 進去瓶頸區的次數
TouchRangeTimes = CountIF(High[1] > HighLowerBound, Length);
 
if  TouchRangeTimes >= HitTimes   and  ( q_ask> theHigh or   close > theHigh) then TouchTop=1;


//周轉率
if barfreq = "Tick" or barfreq = "Min"
    then raiseruntimeerror("不支援此頻率");

if GetField("發行張數(張)") <> 0 then begin
    Tuneoverratio = GetField("成交量", "D") / GetField("發行張數(張)") * 100;

end;
    

//大戶金額    
{大戶買賣力(金額)是特大單金額+大單金額,資料為開盤迄今的累計
支援商品:台(股票)}
    
value1 = GetField("賣出特大單金額","D") + GetField("賣出大單金額","D");
value2 = GetField("買進特大單金額","D") + GetField("買進大單金額","D");
Largeaccountmoney = value2 - value1;

// 進場條件
ConditionEntryTop = TouchTop=1;
ConditionEntryTuneover = Tuneoverratio >= 0.005;
ConditionEntryLargeAccount = Largeaccountmoney > 20;

ConditionEntryAll = ConditionEntryTop and ConditionEntryTuneover  and ConditionEntryLargeAccount;

If ConditionEntryAll Then
Begin
    Buy(1, MARKET, label:="進場觸發");
    Alert("符合進場條件,已買進 1 張");
End;



// 出場條件
ConditionExitProfit = holdingReturn >= 5;
ConditionExitLoss = holdingReturn <= -1.5;
ConditionExitTime = entryDate_ < currentDate_ and currentDate_ - entryDate_ >= 2;
ConditionHasPosition = Position > 0;

ConditionExit1 = ConditionHasPosition and ConditionExitProfit;        // 停利
ConditionExit2 = ConditionHasPosition and ConditionExitLoss;         // 停損
ConditionExit3 = ConditionHasPosition and ConditionExitTime;         // 持有超過兩天平倉

If ConditionExit1 Then
Begin
    Sell(1, MARKET, label:="達到停利,出場");
    Alert("持倉報酬率達到 5%,已賣出 1 張");
End;

If ConditionExit2 Then
Begin
    Sell(1, MARKET, label:="達到停損,出場");
    Alert("持倉報酬率低於 -1.5%,已賣出 1 張");
End;

If ConditionExit3 Then
Begin
    Sell(1, MARKET, label:="持倉超過兩日平倉");
    Alert("持有超過 2 天,平倉已執行");
End;

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

你的程式有報價欄位的資料 q_ask ,所以無法回測。請改用GetField("AskPrice", "Tick")。

TM 發文於   2025/04/26

謝謝許教授解答,我將q_ask改為 GetField("AskPrice","1"), 編譯會顯示"AskPrice" 在交易腳本中,目前不支援頻率"1" ,">" 左右兩邊的型態不同, "OR" 左右兩邊的型態不同的錯誤訊息,也不行。如果不給頻率編譯可以過但是一樣跑不出結果,請問我還能怎麼處理呢? 謝謝您



虎科大許教授 發文於   2025/04/26

不是請你改用GetField("AskPrice", "Tick")?為何改用GetField("AskPrice", "1")?

TM 發文於   2025/04/26

報告教授,因為改GetField("AskPrice", "Tick"),回測還是 fail, 所以想改看看"1"或其他看看,但是都不行。會不會還有其他問題呢?

附加文件

虎科大許教授 發文於   2025/04/26

我回測台積電是OK的。我只是把你的q_ask改成GetField("AskPrice", "Tick"),其他都不變。

TM 發文於   2025/04/26

原來是執行頻率我用1分鐘所以不行,改成日就可以了,謝謝教授太感謝了。我想另外請問回測頻率該怎麼選? 我原先的想法是每分鐘讓他跑一次,在策略安全哪邊設成每一商品每天最多進場一次,是否這個觀念是錯的? 還是我的到頂突破是看日K,對應回測就該用日? 不好意思喔,剛開始玩還多觀念不是很清楚...一直請教教授,真的感謝。

虎科大許教授 發文於   2025/04/26

(1)你的程式裡面限制不能用分鐘頻率,所以只能用日頻率跑:

if barfreq = "Tick" or barfreq = "Min"

then raiseruntimeerror("不支援此頻率");

(2)既然用日頻率,到頂突破當然看的是日K。交易用日K,回測當然也要用日K。

(3)日K一樣可以用變數控制每天只進場一次。控制每天只進場一次,最好用變數控制,不要用自動交易中心的安控。

 

TM 發文於   2025/04/27

了解,謝謝教授

發表回覆
Close