回測問題:策略中往回算均線值

  •   276 
  • 最後發表   wudachano  2021 五月 03
wudachano 發文於   2021/04/28

你好:

 

請問在交易策略腳本中如果要計算前面好幾個5分K的各個周期的均線值,MA20, MA60, MA120...

 

 

我用以下的腳本回測都會失敗,可以幫忙看問題出在哪嗎??

settotalbar(960);

setbarback(960);

variable: i(0);

for i = 1 to 53

begin

value1 = Average(GetField("收盤價", "5")[i],20);

print(currentDate, ":", currentTime, ":", value1);

end;

if Position > 0 and Filled > 0 then begin

setposition(0,MARKET);

return;

end;

 

if Position = 0  then begin

setposition(1);

return;

end;

 

排序方式: 標準 | 最新
wudachano 發文於   2021/04/28

對了,我是回測半年的時間,頻率是選五分鐘,設定如下

 

附加文件

XQ小幫手 發文於   2021/04/28

Hello wudachano,

 

首先

value1 =  Average(GetField("收盤價", "5")[1],20);

value2 = Average(GetField("收盤價", "5")[2],20);

value1[1] 是會等於 value2的,所以您不須用for迴圈來取前期的均線值,您可以實際print出來確認。

也不須設那麼長的資料讀取筆數。

另外如果可以的話,請盡量不要用return。您可以改用條件式來進行限制。

 

小幫手幫您修改了腳本給您參考:

settotalbar(53);

setbarback(53);

variable: i(0);

 

value1 = Average(GetField("收盤價", "5")[1],20);

for i = 0 to 52 begin

    print(currentDate, ":", currentTime, ":", value1[i]);

    end;

 

if Position > 0 and Filled > 0 then setposition(0,MARKET);

if Position = 0  then setposition(1);

 

至於您提到的各個周期的均線值,小幫手在腳本裡沒有看見,您計算的都是20周期的均線值。

如果你是要不同周期的話應該是要:

value1 = Average(GetField("收盤價", "5")[1],20);   //期數20

value2 = Average(GetField("收盤價", "5")[1],60);   //期數60

value3 = Average(GetField("收盤價", "5")[1],120);  //期數120

wudachano 發文於   2021/04/29

哈囉你好:

我使用了您的腳本再跑回測的時候結果全部出現回測失敗(39個商品,跑半年回測),請問這是什麼原因呢?

當時我的即時交易策略正在運行中,不知道有沒有影響?

附加文件

XQ小幫手 發文於   2021/04/29

Hello wudachano,

 

小幫手這邊作測試是全部成功,附上圖片供您參考。

需要麻煩您提供您測試的是什麼商品,回測的設定為何,這樣小幫手才能幫您檢驗問題出在哪裡。

感謝

附加文件

wudachano 發文於   2021/04/29

哈囉您好:

這邊附上產品以及參數設定喔。

請問如果電腦CPU滿載是否會影響回測成功與否呢?

時常有有全部失敗也有部分失敗的

附加文件

XQ小幫手 發文於   2021/04/29

Hello wudachano,

 

小幫手這邊作測試,確實會因為運算過久導致回測失敗。

小幫手建議您可以減少回測商品的數目與時間長度,這樣就可以回測成功。

 

另外,XS腳本中可以避免使用迴圈,因為這樣會導致大量的運算。

您腳本裡的內容不用迴圈單純用 Print 一樣可以將均線的數值印出。

wudachano 發文於   2021/04/29

您好,多謝您的回覆:

 

請問不用迴圈的意思是如下一行一行寫嗎??

    print(currentDate, ":", currentTime, ":", value1[0]);

    print(currentDate, ":", currentTime, ":", value1[1]);

.....

    print(currentDate, ":", currentTime, ":", value1[51]);

    print(currentDate, ":", currentTime, ":", value1[52]);

 

 

 

謝謝

 

XQ小幫手 發文於   2021/05/03

Hello wudachano,

 

由於回測時是由時間前往時間後運算,所以您只需要print出最新的值即可取得回測期間的值,不用特地用for迴圈去抓。

附上交易腳本供您參考。

您可以實際查看print出來的值。

附加文件

發表回覆
Close