回測

  •   242 
  • 最後發表   Go198  2022 四月 01
Go198 發文於   2022/03/14

if close[1]<open[1]

then setposition(1,high[1]) ;

 

回測發現
想要在20210917的時候
做多20210916的高點
但回測時
會多在20210915的不知道跟誰比的高點?

請幫忙提醒一下哪裡錯了,謝謝!

附加文件

排序方式: 標準 | 最新
XQ小幫手 發文於   2022/03/16

 Hello Go198,

 

您腳本中這段的意思是 如果前一期的開盤價大於收盤價,就以昨日高價限價買一張。

小幫手不知道您是從甚麼時候開始回測的,不過很可能是因為在 2021/09/15 開盤時運算,2021/09/14 符合條件,所以就以 9/14 高價掛單賣出。

而您掛 17569 在 9/15 時一定會成交,因為該天的價格都比此價格低。

建議您可以使用print函數將運算資訊印出檢查,會比較容易理解問題所在。

Go198 發文於   2022/03/17

Hello 小幫手,

 

if close[1]<open[1]

then setposition(1,high[1]);
這樣寫不知道對不對?

附件有圖檔給您,
假設我們縮小回測區間,
就以圖檔的日期來討論,
2021/09/13~2021/10/01

模擬進場:

在09/17時開盤運算(模擬成當日,未來的K還沒出現)
條件一:09/16是黑K
條件二:09/16量大於09/15的10%
條件三:09/17價位突破09/16的高

如果都符合,那就在09/17新倉多單一口09/16的高,
進場方式能用觸價單(MIT)而不是限價單嗎?

模擬出場:
方式一:虧損50點出場
方式二:最大獲利回吐50%出場


感謝.

附加文件

XQ小幫手 發文於   2022/03/22

Hello Go198,

 

如同小幫手上面所說,依造您的例子從 2021/09/13~2021/10/01 來看。

第一根黑Bar會發生在 9/14,所以 9/15的時候就算觸發,觸發時您會掛一張限價單,價格會是 9/14 的high,也就是 17569。

此時在9/15時一定會成交 (當下價格17417,掛17569的單),在此時您的filled和position就被調整成為 1,因此在9/17就不會再交易。

須注意 SetPosition 是將部位庫存調整成指定的部位,不是加碼。

如果您要觸價單的話,可以自行撰寫。

舉例來說:

if close[1]<open[1] then value1 = high[1];

if close cross over value1 then setposition(1, value1);   //收盤價上升穿越指定價格才下單

這樣回測在2021/09/13~2021/10/01的話就會成交在 9/17。

 

至於各種停損停利方法,您可以參考內建的停損停利腳本並修改成所需樣式。

在交易腳本中的系統 2-下單出場方式裡面可以找到各種範例。

網站上有教學區,裡面有XS語法的基礎和應用可供閱覽。

Go198 發文於   2022/03/23

Hello 小幫手,

回測區間
2021/09/13~2021/10/01
沒有問題

但是
區間加大後,
2021/09/01~2021/10/08
回測後發現,
進場邏輯不一致!
附件有圖檔給您.

//進場

if close[1]<open[1] then value1 = high[1];

if high cross over value1 then setposition(1, value1);

 

//出場

input: profit_point(10, "停利(點)");

input: loss_point(10, "停損(點)");

 

if Position = 1 and Filled = 1 then begin

{ 依照成本價格設定停損/停利 }

 

if profit_point > 0 and Close >= FilledAvgPrice + profit_point then begin

{ 停利 }

SetPosition(0);

end else if loss_point > 0 and Close <= FilledAvgPrice - loss_point then begin

{ 停損 }

SetPosition(0);

end;

end;

 

******************************************************************************
回測後發現
進場
邏輯不一致!

9/17和9/30
都有正常進場

但是

進場問題一:
09/03前一根是黑K
也過high[1]的高
為什麼沒有進場?


進場問題二
9/10前一根非黑K
為什麼會進場?

進場問題三
10/07
前一根是黑K
也過前高
為什麼沒有進場?
*************************************************************************************
出場設定
獲利10點出場
虧損10點出場
但看不出
出場的邏輯是什麼?


出場問題

出場問題一:
09/17虧10點後
怎麼沒有出場
而是在下一根
09/22才出場?

出場問題二:
9/30虧10點後
怎麼沒有出場
而是在下一根
10/01才出場?
*****************************************************************************

請參閱附件的圖檔,
進場為橘色框框.
出場為藍色圈圈.

謝謝.

附加文件

XQ小幫手 發文於   2022/03/28

Hello Go198,

 

您可以使用print函數將數值印出就可得知問題原因。

像是 print(date, currentTime, value1, high, close, filledAvgPrice);

1.您的進場條件是 high cross over value1,代表的意思是這一期的high大於等於value1,且前一期的high小於value1。

您在 9/2 的 value1 大於 high (會是預讀筆數計算出的 17125)而不是小於,所以不符合。

 

2.您進場的條件並不是要前一根為黑K,而是 high cross over value1。

if close[1]<open[1] then value1 = high[1];

這一行代表的是如果前一根為黑K的話,value1更新為high[1],需注意的是若不是黑K的話,value1會維持原本的值。

9/10的value1值9/9號更新的 17426。

 

3.10/6的value1為 16629,10/7 的 value1為 16493。

10/6的high為 16493,10/7 的high為 16760。

沒有發生cross over 的狀況。

 

至於出場部分到下一根才出場的原因很簡單,您可以參考 SetPosition 的說明。

當有複數個交易指令符合時,只會執行第一個。

您進場當天進場條件會一直符合,所以就算出場條件觸發,也會因為優先執行 setposition(1, value1) 而無法執行 SetPosition(0)。

小幫手建議您進場條件加上 position = 0 and filled = 0,這樣就不會進場當天持續觸發。

Go198 發文於   2022/03/28

 Hello ,

1.您的進場條件是 high cross over value1,代表的意思是這一期的high大於等於value1,且前一期的high小於value1。

2.您進場的條件並不是要前一根為黑K,而是 high cross over value1。

 

 

 

3.10/6的value1為 16629,10/7 的 value1為 16493。沒有發生cross over 的狀況。

以上懂了且修改完成,
以下還沒懂


小幫手建議您進場條件加上 position = 0 and filled = 0,這樣就不會進場當天持續觸發。

 

問題:

1.要當"根"虧損就觸發,沒有要留到下一根,有部位and有虧損馬上出.

(如圖中藍色圈圈問題一跟問題二)

 

2.停利停損點也都沒有符合設定點數出場.

 

3.if Position = 1 and Filled = 1 then begin
可以改成

if Filled > 1 then begin//多單

或是

if Filled < 1 tnen begin//空單
判斷目前是否有部位,
有部位就執行下方出場的腳本.

//出場

input: profit_point(10, "停利(點)");

input: loss_point(10, "停損(點)");

if profit_point > 0 and Close >= FilledAvgPrice + profit_point then begin

SetPosition(0);

 end else

 if loss_point > 0 and Close <= FilledAvgPrice - loss_point then begin

SetPosition(0);

end;

end;

這樣嗎?

 

 

 

XQ小幫手 發文於   2022/04/01

Hello Go198,

 

1.如同小幫手上面所說,當有複數個交易指令符合時,只會執行第一個。

如果您進場條件有符合的話,會造成就算有部位且已經到了停損停利點還是不會執行出場。

建議您可以在進場前面加上position = 0 and filled = 0。

 

2.小幫手覺得也是和上面所說相同的狀況。

另外需注意,回測的時候日頻率逐筆洗價會是用1分鐘Bar來模擬,也只會成交在1分鐘Bar的OHLC上。

 

附上小幫手修改過的腳本以及回測報告供您參考。

附加文件

發表回覆
Close