回測數據錯誤

  •   210 
  • 最後發表   richardchien6  2023 六月 20
richardchien6 發文於   2023/06/13

小弟嘗試寫交易策略,但在回測時發現數據很奇怪

實際WMA均線數據和看盤軟體數據對不上

還有以下問題

1. print出來的結果最前面數字很奇怪,感覺抓的資料有問題

2. 就算拉到後面數字看似正常也和看盤軟體顯示的均線數據對不上

 

不知道是不是抓取資料的方式不對還是甚麼原因

以下為程式碼,並有附回測數據和程式檔案

請求小編和各位大神解惑

{

15分鐘頻率

1. 15分鐘線72WMA斜率往上

2. 15分鐘線20WMA要在72WMA上

3. 同時60分鐘線60WMA要在200WMA上

 

 

}

//settotalBar(500);

 

var:WMA20(0), WMA72(0), WMA240(0),WMA20pass(0),WMA72pass(0);

var:longWMA60(0), longWMA240(0);

 

WMA20 = WMA(close, 20);

WMA72 = WMA(close, 72);

WMA20pass = WMA(close, 20) - WMA(close, 20)[1];

WMA72pass = WMA(close, 72) - WMA(close, 72)[1];

condition1 = WMA72pass > 0 and WMA20 > WMA72;

condition2 = WMA20 + 50 < WMA72;

WMA240 = WMA(close, 240);

 

value2 = WMA(GetField("收盤價","60"),60);

value3 = WMA(GetField("收盤價","60"),200);

condition3 = value2 > value3;

 

if WMA20 > WMA72 and condition1 and condition2 and condition3 then

ret = 1;

//======測試區

print("=========up=====");

print(condition1);

print(condition2);

print(condition3);

print(WMA20);

print(WMA72);

print(WMA(GetField("收盤價","60"),60));

print(WMA(GetField("收盤價","60") ,200));

print("日期",date); 

print("時間",time);

print("=========down=====");

 

附加文件

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/06/14

 Hello richardchien6,

 

1.您可以參考內建WMA的函數撰寫方式:

if CurrentBar < Length then

    WMA = thePrice

else begin

    WMA = Length * thePrice;

    for value1 = 1 to Length - 1

WMA += thePrice[value1] * (Length - value1);

    WMA = WMA/Factor;

end;

所以在運算Bar的編號還小於WMA設定長度時,WMA會直接回傳收盤價。

故要有足夠的資料讀取筆數才能夠計算出正確的值 (只有運算編號大於WMA的Bar才會計算出正確的值)。

 

2.小幫手這邊測試是正常的。(參考附圖)

附加文件

richardchien6 發文於   2023/06/14

謝謝小幫手的回覆
那想請教,如果我想跑1整年的回測紀錄
1年約250工作天,一天扣除位開盤的時間約有19個小時,以15分鐘線頻率來說,1天有285個15分鐘

那如果我想回測1年的回測紀錄,要在資料讀取比數輸入250 * 285 嗎?

還是哪裡理解有誤呢?

 

XQ小幫手 發文於   2023/06/15

Hello richardchien6,

 

小幫手建議您先閱覽資料讀取筆數的說明

若您的回測區間為過去一年的話,那麼只要資料讀取筆數有超過WMA的長度 (上面腳本的狀況就會是 settotalbar(200);),就可以取得正確數值。

但由於您有使用跨頻率 (60分鐘),所以資料引用筆數要另外設定 (setbackbar(200, "60"))。

richardchien6 發文於   2023/06/15

 小幫手您好,謝謝您的回覆

我照了您的方式做,添加了

settotalbar(200);
setbackbar(200, "60");

結果仍然是一樣的,資料有誤

較久以前的資料還是會出現數據有誤的情形,但近期的資料卻是正確的,請問是我print的方式不對還是抓錯資料呢?

能否請小幫手以台指期連續圖的15分鐘線來幫我測試呢
有附上程式碼以及print資料,再請小幫手解答

附加文件

XQ小幫手 發文於   2023/06/19

Hello richardchien6,

 

小幫手認為您沒有看懂WMA的內建腳本。

if CurrentBar < Length then

    WMA = thePrice

 

換句話說,只要currentbar小於設定的WMA長度,WMA出來的數值就會是收盤價。

不論您的settotalbar設多長,前面的 Length 筆印出的數值就會是收盤價。

設定settotalbar只是確保您在回測設定的區間計算出的數值是WMA而不是收盤價。

 

如果不希望印出這些資料,建議您將印出的條件修改為:

if currentbar > 200 then begin

    print("=========up=====");

    print(condition1);

    print(condition2);

    print(condition3);

    print(WMA20);

    print(WMA72);

    print(WMA(GetField("收盤價","60"),60));

    print(WMA(GetField("收盤價","60") ,200));

    print("日期",date); 

    print("時間",time);

    end;

 

確保腳本在運算過足夠筆數後才印出

 

settotalbar => 腳本會運算,currentbar會改變

setbackbar => 腳本不會運算,只是取用資料,currentbar不會改變

richardchien6 發文於   2023/06/20

懂了,已解決,謝謝小幫手

發表回覆
Close