使用策略回測時為何XS寫的條件都無法符合?

  •   421 
  • 最後發表   大財星  2024 三月 26
大財星 發文於   2021/03/24

當週K線條件下,週K8均線向上並且大於週K20均線時

日線收盤價突破20日MA

請問一下下面到底哪邊有問題? 在回測時還是會測到週K8均小於週K20均的情況

/////////////////////////////////////////////////////////////////

value1 = average(closed(0),20);

value2 = average(closed(1),20);

//週K 8均向上 20均向上 8均大於20均

value21 = average(closew(0),8);

value22 = average(closew(1),8);

value23 = average(closew(0),20);

value24 = average(closew(1),20);

 

if closed(0) > value1 and closed(1) < value2 and volume > 2000 and value21 > value22 and value23 > value24 and value21 > value23

then ret = 1;

附加文件

排序方式: 標準 | 最新
大財星 發文於   2021/03/24

下圖是回測時設的條件

附加文件

大財星 發文於   2021/03/24

回測結果隨便找一個看都一堆錯誤,下圖為台勝科在2020/10/15買進,雖然10/15的日K是穿過20MA,但是這個買進時間點在週K下,明明週K8均就小於週K21均

為何還會進場??

附加文件

大財星 發文於   2021/03/26

小幫手請問一下這問題怎麼解決?

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

Hello 大財星,

 

根據您提供的圖片和程式碼,首先需要注意到的是在資料頻率設為日的情況下

closed(0) = close(w) = close[0],因為最新的一筆資料一定會是該週/該日的收盤價。

另外一點則是

closed(1) = close[1]

需要注意的是將 closew 函數 用在 average函數上的情況。

average(closew(0), 20) 所計算出來的並不是連續20週的平均週收盤價,而是圖上往前20根收盤價的平均值。換句話說:

average(closew(0), 20) 算出來的結果會相當於 average(closed(0), 20), average(close, 20)。

average(closew(1), 20) 一樣是往前20根的前週收盤價的平均值,而不是20週以來的前週收盤的平均價。舉例來說:

今天是星期二,上週的週收盤價是100,上上週的收盤價是98,上上上週的週收盤價是 99。

如果要計算average(closew(1), 3) 的話實際結果會是:

(100 + 100 + 98) / 3 => (星期二的上週收盤價100 + 星期一的上週收盤價100 + 上個星期五的上週收盤價98) / 3

而不是

(100 + 98 + 99) / 3 => (上週收盤價 + 上上週收盤價 + 上上上週收盤價) / 3

之所以會有這樣的結果,是因為在 closew函數裡使用了 SetBarMode(1) 的關係,這會讓closew函數回傳單一數值而不是整個時間序列。

 

您需要的應該是

average(GetField("收盤價", "w"), 20)

即可以套用不同於主圖頻率的資料

 

您也可以參考這篇文章,裡面有更詳細的解釋

進階篇: 跨商品/跨頻率的語法介紹

 

另外附上修改後的策略雷達提供您參考。

附加文件

大財星 發文於   2021/03/26

謝謝小編說明

歐文owen 發文於   2024/03/20

Hello 大財星,

 

根據您提供的圖片和程式碼,首先需要注意到的是在資料頻率設為日的情況下

closed(0) = close(w) = close[0],因為最新的一筆資料一定會是該週/該日的收盤價。

另外一點則是

closed(1) = close[1]

需要注意的是將 closew 函數 用在 average函數上的情況。

average(closew(0), 20) 所計算出來的並不是連續20週的平均週收盤價,而是圖上往前20根收盤價的平均值。換句話說:

average(closew(0), 20) 算出來的結果會相當於 average(closed(0), 20), average(close, 20)。

average(closew(1), 20) 一樣是往前20根的前週收盤價的平均值,而不是20週以來的前週收盤的平均價。舉例來說:

今天是星期二,上週的週收盤價是100,上上週的收盤價是98,上上上週的週收盤價是 99。

如果要計算average(closew(1), 3) 的話實際結果會是:

(100 + 100 + 98) / 3 => (星期二的上週收盤價100 + 星期一的上週收盤價100 + 上個星期五的上週收盤價98) / 3

而不是

(100 + 98 + 99) / 3 => (上週收盤價 + 上上週收盤價 + 上上上週收盤價) / 3

之所以會有這樣的結果,是因為在 closew函數裡使用了 SetBarMode(1) 的關係,這會讓closew函數回傳單一數值而不是整個時間序列。

 

您需要的應該是

average(GetField("收盤價", "w"), 20)

即可以套用不同於主圖頻率的資料

 

您也可以參考這篇文章,裡面有更詳細的解釋

進階篇: 跨商品/跨頻率的語法介紹

 

另外附上修改後的策略雷達提供您參考。

 

請問小幫手,average(closeD(1), 5)跟average(getfield("close","D")[1], 5),假設今天是週三,能否請小幫手實例描述一下,這兩種寫法會分別是哪幾天的收盤價做平均呢?

上週三收盤價100、上週四收盤價100,上周五收盤價101,周一收盤價102,周二收盤價103,週三(當日)收盤價104的情況之下~

謝寫小幫手

XS小編 發文於   2024/03/25

Hello 歐文owen,

 

average(closeD(1), 5) 會受到您使用的頻率影響,取近5根Bar的closeD(1)來運算。

假設您使用1分鐘頻率,且近5根Bar都是同一日的話,那麼近5根Bar的closeD(1)都會是昨日收盤價。

 

average(getfield("close","D")[1], 5) 則是固定取向前5天的收盤價來運算,就您的例子來說就會是 100, 100, 101, 102, 103。

 

小編建議您直接print出來或是用指標腳本畫出會比較容易理解。

歐文owen 發文於   2024/03/26

謝謝小幫手,這樣就很清楚了!

發表回覆
Close