XS交易語法,回測結果與程式不符?

  •   425 
  • 最後發表   Kelsier  2023 四月 07
Kelsier 發文於   2023/03/21

您好,我寫了一個狹幅盤整N日後,出量突破做多的策略,但是寫出來跑回測(週期為日線),結果卻和我想達成的目標不同,想請問是不是有什麼地方寫錯了?

 

進場邏輯:

1、至少連續15天高低點震幅低於5%。

2、5,10,20均線糾結(三條均線間的倆倆差異都低於3%)

3、最近一天大漲3%以上,當天成交量大於10日均量1倍以上,且收盤價高於5,10,20均線。

上述3個條件同時符合時,進場做多(次日開盤價市價進場)。

 

移動停利:

當獲利狀態時,收盤價跌破5日均出場。

 

停損機制:

當收盤價低於買進當根K線的5,10,20均線的3%(取最低值)時停損出場。

 

語法如下:

inputs:

    Length1(5), //MA5

    Length2(10), //MA10

    Length3(20), //MA20

    VolLength(10), //10日均量

    AmpThreshold(3), //震幅小於3%

    MA_Diff_Threshold(3), //兩兩均線差異小於3%

    VolumeThreshold(1), //成交量大於10均量N倍

    Num_Threshold(15); //至少N日震幅小於3%

 

variables:

    Amp(0), //震幅

    Num(0), //連續N日

    MA_Diff1(0), //MA5及MA10差異

    MA_Diff2(0), //MA5及MA20差異

    MA_Diff3(0); //MA10及MA20差異

 

Amp = (High - Low) / Close * 100;

 

MA_Diff1 = absvalue(Average(Close, Length1) - Average(Close, Length2)) / Minlist(Average(Close, Length1), Average(Close, Length2)) * 100;

MA_Diff2 = absvalue(Average(Close, Length1) - Average(Close, Length3)) / Minlist(Average(Close, Length1), Average(Close, Length3)) * 100;

MA_Diff3 = absvalue(Average(Close, Length2) - Average(Close, Length3)) / Minlist(Average(Close, Length2), Average(Close, Length3)) * 100;

 

if Amp > AmpThreshold then Num = 0;

 

if Amp[1] <= AmpThreshold then Num = 1;

if Amp <= AmpThreshold then begin

   Num = Num[1]+1;

end;

 

condition1 = Num[1] >= 15;

condition2 = MA_Diff1 <= MA_Diff_Threshold and MA_Diff2 <= MA_Diff_Threshold and MA_Diff3 <= MA_Diff_Threshold;

condition3 = Close > Close[1] * 1.03 and Volume > Average(Volume, VolLength) * (1 + VolumeThreshold) and Close > Maxlist(Average(Close, Length1), Average(Close, Length2), Average(Close, Length3));

 

if Position = 0 and condition1 and condition2 and condition3 then setposition(1, MARKET);

 

variables:

    ts(0), //移動停利

    sl(0), //停損點

_entryprice(0); //多單進場價格

    

ts = Average(Close, 5);

 

if Position[1] = 0 and Position = 1 then begin

   _entryprice = O;

   sl = Minlist(Average(Close, Length1), Average(Close, Length2), Average(Close, Length3)) * 0.97;

end;

 

if Position = 1 and c > _entryprice then begin

   if c < ts then setposition(0, MARKET);

end;

 

if Position = 1 then setposition(0, sl);

 

 

寫完感覺邏輯沒錯,但回測跑出來進出場點都不太對,不曉得是哪裡出了問題,還請各位大大協助解答,謝謝。

排序方式: 標準 | 最新
Kelsier 發文於   2023/03/23

重新寫了一版,但回測還是有問題,全部都在同一根進出場,而且價位也不是開盤價或收盤價,不曉得是什麼原因導致,附上程式碼與邏輯說明,以及回測截圖,想請問小幫手能否協助解答,謝謝。

 

inputs:

    Length1(5), //MA5

    Length2(10), //MA10

    Length3(20), //MA20

    VolLength(10), //10日均量

    AmpThreshold(3), //震幅小於3%

    MA_Diff_Threshold(3), //兩兩均線差異小於3%

    VolumeThreshold(1), //成交量大於10均量N倍

    Num_Threshold(15); //至少N日震幅小於3%

 

variables:

    Amp(0), //震幅

    Num(0), //連續N日

    MA_Diff1(0), //MA5及MA10差異

    MA_Diff2(0), //MA5及MA20差異

    MA_Diff3(0); //MA10及MA20差異

 

Amp = (High - Low) / Open * 100; //高低點日震幅

 

MA_Diff1 = Maxlist(Average(Close, Length1), Average(Close, Length2)) - Minlist(Average(Close, Length1), Average(Close, Length2)) * (1 + MA_Diff_Threshold/100) ; //較高的均線-低的均線*1.03,數值小於0代表兩兩差異小於3%

MA_Diff2 = Maxlist(Average(Close, Length1), Average(Close, Length3)) - Minlist(Average(Close, Length1), Average(Close, Length3)) * (1 + MA_Diff_Threshold/100) ; //較高的均線-低的均線*1.03,數值小於0代表兩兩差異小於3%

MA_Diff3 = Maxlist(Average(Close, Length2), Average(Close, Length3)) - Minlist(Average(Close, Length2), Average(Close, Length3)) * (1 + MA_Diff_Threshold/100) ; //較高的均線-低的均線*1.03,數值小於0代表兩兩差異小於3%

 

if Amp > AmpThreshold then Num = 0; //當日震幅>3%時,Num=0

 

if Amp[1] <= AmpThreshold then Num = 1; //前一日日震幅<=3%時,Num=1

if Amp <= AmpThreshold then begin //當日震幅<=3%時,Num=Num[1]+1

   Num = Num[1]+1; //連續日震幅小於3%,Num才會累積

end;

 

condition1 = Num[1] >= Num_Threshold; //起漲前至少連續15根K線日震幅小於3%

condition2 = MA_Diff1[1] <= 0 and MA_Diff2[1] <= 0 and MA_Diff3[1] <= 0; //5MA、10MA、20MA糾結,兩兩差異小於3%

condition3 = Close > Close[1] * 1.03 and Volume > Average(Volume, VolLength) * (1 + VolumeThreshold) and Close > Maxlist(Average(Close, Length1), Average(Close, Length2), Average(Close, Length3)); //收盤價大於昨日收盤3%以上,且成交量大於10日均量*(1+1),且收盤價大於5、10、20三條均線

 

if Position = 0 and condition1 and condition2 and condition3 then setposition(1, MARKET); //當手上部位為0,且condition1、condition2、condition3符合時,進場做多

 

variables:

    ts(0), //移動停利

    sl(0), //停損點

_entryprice(0); //多單進場價格

   

ts = Average(Close, 5); //5日均線

 

if Position[1] = 0 and Position = 1 then begin //當前一根K線無部位,當根K線有多單部位時

   _entryprice = O; //進場價格=當根K線開盤價

   sl = Minlist(Average(Close, Length1), Average(Close, Length2), Average(Close, Length3)) * 0.97; //當根K線的5MA、10MA、20MA取低值,再*0.97當作停損點

end;

 

if Position = 1 and c > _entryprice then begin

   if c < ts then setposition(0, MARKET); //當多單在手且收盤價大於進場價格時,若收盤價跌破5日均線,平倉出場

end;

 

if Position = 1 then setposition(0, sl); //當多單在手時,掛單在sl的位置停損

Kelsier 發文於   2023/03/24

請問XQ小幫手有看到嗎?能否協助解答,謝謝。

Kelsier 發文於   2023/03/27

請問XQ小幫手有看到嗎?能否協助解答,謝謝。

XQ小幫手 發文於   2023/03/27

Hello Kelsier,

 

小幫手回覆時都是由討論區的後面往前面回覆。(會依據用戶發問帳號是否有訂閱調整順序)

所以如果您在同一篇文章推文的話會造成您的文章被往前推,反而讓小幫手看到問題的時間變晚。

 

由於您發問的帳號沒有訂閱,所以回覆的順位會較有訂閱的用戶下面。

目前沒有訂閱用戶的問題小幫手回覆到 3/18,而您發問的日期為3/21。

近來問題量不少,麻煩您發問後多等待一陣子。

 

至於您的問題,小幫手會先建議您使用 print將相關數值印出看原因為何。

且您最後一行為 if Position = 1 then setposition(0, sl);,在逐筆洗價的狀況下自然在買進觸發後的下一根Bar (下一根1分鐘Bar) 若沒有其他 setposition 觸發的話,賣出的價格比現在價格低的話自然會直接出場。

另外您可以參考 IntrabarPersist 語法。

不然您的變數在同一根Bar逐筆洗價時會無法保存數值。

 

麻煩您下次提供解析度更高的圖片。

Kelsier 發文於   2023/03/27

謝謝小幫手的回覆,想再請問以下問題:

且您最後一行為 if Position = 1 then setposition(0, sl);,在逐筆洗價的狀況下自然在買進觸發後的下一根Bar (下一根1分鐘Bar) 若沒有其他 setposition 觸發的話,賣出的價格比現在價格低的話自然會直接出場。

這是什麼意思呢?因為sl是進場當根的三條均線取低值再-3%,假設我的A股票進場價是100元,sl是90元,我想達成的效果是掛單在90元的位置(停損單),行情觸及的時候才會出場。

但您的意思好像是,在逐筆洗價的狀況下,如果沒有其他setposition觸發的情況下,只要價格低於100元(99元、98元、97元、、、)就會直接出場,即使還沒有觸及到原本設立的90元?

那該如何寫出只有在觸及90元的時候才會出場呢?

XQ小幫手 發文於   2023/04/07

Hello Kelsier,

 

if Position = 1 then setposition(0, sl); 這種寫法,在多方的狀況下只要洗價當下的成交價比 sl 高就會立即成交。

系統並不是預掛限價單,而是去賣出一張價格為 sl 的限價單。

就以您的例子來說,如果現在的價格是100 的話,下一張價格為90的賣單當然會立刻成交。

應該是成交價下到停損點的時候才丟出出場的限價單才對。

舉例來說:

if close <= sl and position = 1 then setposition(0, sl);

 

您可以參考系統內建的交易腳本,裡面有各種停損停利的寫法。

發表回覆
Close