if close[1]<open[1]
then setposition(1,high[1]) ;
回測發現
想要在20210917的時候
做多20210916的高點
但回測時
會多在20210915的不知道跟誰比的高點?
請幫忙提醒一下哪裡錯了,謝謝!
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語法的基礎和應用可供閱覽。
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才出場?
*****************************************************************************
請參閱附件的圖檔,
進場為橘色框框.
出場為藍色圈圈.
謝謝.
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,這樣就不會進場當天持續觸發。
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;
這樣嗎?

7 評論