指標腳本轉為交易腳本的問題

  •   200 
  • 最後發表   Golly  2024 二月 15
Golly 發文於   2024/02/06

你好,我以0050當作回測的腳本
我先寫成指標,以下是腳本內容
{ 進場條件: 
1.觸發MatchK   
條件1:近13日平均MA60向上   
條件2:股價與MA89乖離<0.5%   
條件3:近21日不可出現長黑大跌(跌幅<3%)   
當符合條件1、2、3時記錄當天最高價(定義為MatchK_H) 

2.進場   
條件1:近13日平均MA60向上   
條件2:當日收漲   
條件3:當股價突破MatchK_H   
當符合條件1、2、3時則進場  

出場條件: 
停利:15% 或 獲利達5%並且乖離MA60>5% 
停損:5% } 
繪圖設定如下


問題1:
寫成指標時看起來大致正常但他會在 20181011    20200317   20220307這三天
不正常的出現[取消觸發MatchK]的這個訊號  (詳細說明在附檔中)

問題2
當我把指標改寫成交易做回測的時候,依照腳本起始時間不同會出現下列情形
2022~2023 無結果
2021~2023 無結果
2020~2023 有結果
2019~2023 無結果
2018~2023 無結果
並且跟指標的腳本相比也會少掉幾次的進場次數

詳細的兩個指標與交易腳本我都有附上

 

附加文件

排序方式: 標準 | 最新
XS小編 發文於   2024/02/07

Hello Golly,

 

您腳本的寫法會受到資料讀取筆數的影響,而兩邊運算的筆數長度不同,故會有不同的結果。

舉例來說,condition1這種運算方式代表至少要14筆資料讀取筆數才能夠計算正確。

若要讓兩者相同,小編會建議可以讓兩者從相同地方開始計算起。

且需注意指標只會顯示該根Bar最後的結果,而自動交易在回測時日頻率則是強制逐筆洗價,且在某些狀況下觸發時不會交易 (ex.當根Bar沒有成交量 or 當日最後一根1分鐘Bar)。

 

至於為何不會交易的部分小幫手認為是在資料讀取筆數的時候條件就已經符合導致Lot1被改變,故不會進場。

建議可以在進場條件中加上 and getinfo("TradeMode") = 1,確保只在可交易時才變動 Lot1。

但遇到某些狀況下觸發時不會交易還是會因為Lot1變動而不為庫存為0導致接下來不會交易。

 

關於取消觸發的部分,小編建議您可以將MatchK_H畫出就可以知道原因。

推測應該是出場區的部分對變數作歸零動作時多打了一個9所導致 (歸零動作是99999而取消觸發條件是 MatchK_H<>9999)。 

Golly 發文於   2024/02/07

小編你好:
很感謝你的幫忙,getinfo("TradeMode") = 1解決很大的問題,交易腳本不會再出現交易次數為0的錯誤
我也修改了變數歸零少打一個9的錯誤,目前指標的腳本看起來非常正常了

不過回到交易腳本上
若是以20190101~20231231的區間來看回測只會有一筆交易次數(如附圖)


若是以20210101~20231231的區間來看回測只會有三筆交易次數(如附圖)

但若是以指標腳本來看
黃色圈圈代表MatchK_H訊號觸發
粉紅色箭頭代表進場
綠色打X圈圈代表出場
在2019,2021,2023都有數次的進場觸發(如附圖)
2019

2021

2023

我覺得問題應該出在
SetBarBack(999);
SetTotalBar(999); 
這兩行,但我還是不太懂應該要把這兩個數值設定為多少,所以乾脆設大一點?
可否幫忙看一下數值應該是設多少才對,以及為何要設這個數值讓我學習一下

最後同樣附上修正過後新的兩個腳本供您參考

附加文件

XS小編 發文於   2024/02/15

Hello Golly,

 

小編建議您將相關數值印出確認,會比較容易找出問題原因。

就這邊觀察的結果來看,您的day、MatchK_H 和 MatchK_L 在兩次回測中會有不同的數值,應該是MatchK的相關運算有問題。

舉例來說,2019 開始回測的在2019/05/17 11:11出場,但在同一天的 12:06 又會符合,此時因為昨天的 day 會是 20190311,故不符合 day cross under 99999998 的條件,MatchK_H 與 MatchK_L 就不會被賦值。

需注意 cross 是以上一根執行頻率 (這邊的狀況就是前一日) 與當根K棒來當作條件判斷,若要使用上一次逐筆洗價的數值判斷建議可以將前次洗價運算時的 day 改用另一個變數保存,像是:

var: intrabarpersist day_1(0), intrabarpersist day(0);

if Lot1=0 and Position = 0 and Filled = 0 and condition1 and condition2 and condition3 then begin

    day_1 = day;

    day=date; 

    if day < 99999998 and day_1 > 99999998 then begin

    ...

 

需注意指標是日頻率,但交易腳本是日頻率逐筆洗價,直接使用相同的邏輯運算並不一定會達到相同的結果。

若要使用日頻率非逐筆洗價回測,可以使用警示腳本。

 

關於 setbackbar 和 settotalbar 的說明,可以參考資料讀取範圍與腳本執行的關係

由於腳本中是條件達成就紀錄變數,並隨著這些變數來決定進出場。

若希望和指標腳本有著相同結果,那麼就需要和指標從相同地方開始計算。

發表回覆
Close