策略無法執行或安控失敗

  •   368 
  • 最後發表   桂桂  2023 二月 23
桂桂 發文於   2023/01/11

小幫手您好

在學習過程中在XQ文章中看到一個策略文

編譯/回測  都可以成功

但實際跑模擬單會出現以下問題

1:安控失敗(設定策略以及實際部位限制1(但實際上都沒有就顯示失敗) )  已解決~~ 謝謝

2:有出現漲停股票,但策略卻無執行動作

PS:設定日線/模擬單跑(上市上櫃普通股全部)

 

以下為XS腳本

if barFreq <> "D" then RaiseRunTimeError("請使用日線");

var: intraBarPersist lastdate(0); { 用來判斷換日 }

var: intraBarPersist dayposition(0); { 每一日剛開始時的部位}

var: intraBarPersist placeorder(false); { 今日觸發了沒 }

// 換日時只跑一次

if date <> lastdate then begin

lastdate = date;

placeorder = false;

dayposition = Position;

if dayposition <> dayposition[1] then begin

SetPosition(dayposition[1]);

dayposition = dayposition[1];

end; 

end;

if close=getField("漲停價", "D") then begin

placeorder = true;

SetPosition(Position+1);

end;

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

另一個問題

小台 用ATR策略去執行

編譯腳本及回測都正確

我有用主圖疊圖(ATR通道)去察看進出點都正確

但實際跑單時候會出現還沒到觸發點就先觸發的情形

比如觸發ATR上通道買進一張(回測試可以的)

但實際執行時候  ~ 卻會在奇怪的地方下單

我的疑問是:回測都正常沒問題而是執行出現問題!  這樣因該根XS腳本無關對嗎?

有發生過類似問題嗎?

 

~~~~~~~~~~~~

股票上漲超過4%以上買進一張

IF close cross over close[1]*1.04

請問小幫手我這樣語法哪裡錯誤嗎?

測試時候他好像只有跨越4%會下單,如果當下開盤就4%以上的就不會觸發 

iF close cross over close[1]*1.04 then begin

placeorder = true;

SetPosition(Position+1);

end;

 

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/01/12

Hello 桂桂,

 

1.麻煩您提供 自動交易中心匯出檔勾選(包含)交易腳本、問題發生的日期時間和商品名稱 以及 XQ Log 來確認。

Log資料夾(預設路徑:C:\SysJust\XQLite\LOG)直接壓縮後提供即可。

您可以直接將檔案上傳,如果檔案過大的話也可以保存到雲端後將連結Mail至客服信箱 XQservice@XQ.com.tw 且務必附上 討論文章連結網址(小幫手才能盡早處理)。

 

另外小幫手建議您可以在腳本中加上print來檢查相關條件與變數,或許會比較容易看出問題原因。

 

2.小幫手推測可能是因為逐筆洗價,所以當該根Bar盤中洗價時條件符合,但到了收盤時條件卻不符合。

如果希望在該根Bar結束確定條件有符合才進場,您可以取消勾選逐筆洗價,或是用上一根Bar來判斷。

舉例來說:

condition1 = 您的條件;

if conditoin1[1] and position = 0 and filled = 0 then setposition(1, market);

若還是有問題,麻煩您如同上述提供相關的檔案和資訊來檢查。

 

3.cross over 是穿越,您的價格必須從下方向上突破才會符合。

如果您只要大於的話,可以用 > 來判斷,像是 ir close > close[1] * 1.04。

桂桂 發文於   2023/01/16

關於問題2 我是使用日線,逐筆洗價不能選擇

我測試了

第一種

condition1 =  CurrentTime >= entry_time and close > close[1]*1.095  ;

 

if condition1[1] and position = 0 and filled = 0 then setposition(1, market);

 

第二種

if CurrentTime >= entry_time AND  close > close[1]*1.095 then begin

 

SetPosition(1); 

 

end;

 

兩種在9.5%~漲停都不會有動作

下面是整個腳本

 

input: entry_time(091000, "觸發時間");

var: intraBarPersist lastdate(0); { 用來判斷換日 }

var: intraBarPersist dayposition(0); { 每一日剛開始時的部位}

var: intraBarPersist placeorder(false); { 今日觸發了沒 }

 

if barFreq <> "D" then RaiseRunTimeError("請使用日線");

 

if date <> lastdate then begin

lastdate = date;

placeorder = false;

dayposition = Position;

if dayposition <> dayposition[1] then begin

SetPosition(dayposition[1]);

dayposition = dayposition[1];

end; 

end;

 

// 底下是觸發條件

//

 

if CurrentTime >= entry_time AND  close > close[1]*1.095 then begin

 

SetPosition(1); 

 

end;

 

回測編譯都沒問題,不知道是哪裡出錯

 

XQ小幫手 發文於   2023/01/18

Hello 桂桂,

 

小幫手會建議您在腳本中加上print,來確認腳本有沒有如您所想的運作。

另外,在使用交易指令前用 position 和 filled 來控制比較不會出錯。

因為在每次洗價時若條件符合 setposition 就會執行,只要價格有變化的話,就會進行刪單再下單的動作。

在測試時也可以考慮使用 market 市價單,避免因為限價下出而沒有成交的狀況。

 

若還是有問題的話,麻煩如上述提供自動交易中心匯出檔勾選(包含)交易腳本、問題發生的日期時間和商品名稱 以及 XQ Log 來確認。

Log資料夾(預設路徑:C:\SysJust\XQLite\LOG)直接壓縮後提供即可。

您可以直接將檔案上傳,如果檔案過大的話也可以保存到雲端後將連結Mail至客服信箱 XQservice@XQ.com.tw 且務必附上 討論文章連結網址(小幫手才能盡早處理)。

桂桂 發文於   2023/02/02

好~ 我再試試看

請問小幫手

我想要寫 9.5% +3檔買進

如以漲停則用市價單買進

請問這樣會有衝突嗎?

因為如果下單時剛好在緩漲試戳試駕單無法打進去,委託失敗,

我目前適用安控設定大於9.5 +3檔買進

請問小幫手能給個範本或建議嗎

 

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

Hello 桂桂,

 

您可以使用 if ... else if ... 的方式來撰寫,確保若兩個條件都符合時只會執行其中一個。(萬一發生9.5% + 3檔就過漲停的狀況)

若下出的價格大於漲停的話會以漲停價下出。

 

如果在暫緩交易的情況下下出市價單的話,會因為被退單導致錯誤。

要避免這樣的狀況小幫手會建議您可以改下漲停價的限價單就不會出錯。

桂桂 發文於   2023/02/03

if CurrentTime >= entry_time 

 

and close=getField("漲停價", "D") then begin

 

SetPosition(1, market); 

 

end

 

else IF close > close[1]*1.095 then begin

 

SetPosition(1);  

 

END;

 

小幫手我改這樣

安控設定限價單

 

想法是漲停市價單下

9.5%以上限價單

有哪裡要修正的嗎~~

桂桂 發文於   2023/02/06

請問小幫手

延伸上面漲停策略

想設定一個出場方式

方向是如果價格在漲停停時就不執行固定停損利

不知道語法怎麼表達~ 再請小幫手協助一下~

 

 

if Position = 1 and Filled = 1 and close=getField("漲停價", "D") 不執行停損停利

 

and else 

 

then begin

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

 

if profit_percent > 0 and Close >= FilledAvgPrice*(1+0.01*profit_percent) then begin

{ 停利 }

SetPosition(0);

end else if loss_percent > 0 and Close <= FilledAvgPrice*(1-0.01*loss_percent) then begin

{ 停損 }

SetPosition(0);

end;

end;

桂桂 發文於   2023/02/07
XQ小幫手 發文於   2023/02/08

Hello 桂桂,

 

if CurrentTime >= entry_time and close=getField("漲停價", "D") then begin

    SetPosition(1, market); 

    end

else IF close > close[1]*1.095 then begin

    SetPosition(1);  

    END;

 

這樣寫的話 CurrentTime >= entry_time 只有在 close=getField("漲停價", "D") 時會判斷,close > close[1]*1.095不會納入。

另外小幫手建議在作交易時將position 和 filled 納入條件,可以參考此篇文章

 

如果要在漲停時不執行固定停損停利的話,其實只要反向思考,在停損停利的條件中加上 close <> getField("漲停價", "D") 即可。

像是

if profit_percent > 0 and Close >= FilledAvgPrice*(1+0.01*profit_percent) and close <> getField("漲停價", "D") then begin

{ 停利 }

    SetPosition(0);

    end 

else if loss_percent > 0 and Close <= FilledAvgPrice*(1-0.01*loss_percent) and close <> getField("漲停價", "D") then begin

{ 停損 }

    SetPosition(0);

    end;

 

另外小幫手補充,小幫手回覆時都是由討論區的後面往前面回覆。(近來會依據用戶是否有訂閱調整順序)

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

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

桂桂 發文於   2023/02/08

 小幫手您好 

關於第一個部分

condition1 = CurrentTime >= entry_time ; 

condition2 = close > close[1]*1.095 ;

condition3 = close=getField("漲停價", "D");

 

if Position = 0 and filled = 0 and condition1 and condition2 then begin

SetPosition(1);               { 以限價買進 }

end else 

if Position = 0 and filled = 0 and condition2 and condition3 then begin

SetPosition(1, MARKET);               { 以市價買進 }

end;

第二部分

if Position = 0 and filled = 0 and close > close[1]*1.095 then begin

   SetPosition(1);

 

想請小幫手幫我看一下這樣有語病嗎? 用position 和 filled 方式

 

小幫手能幫我翻譯一下 這語法的中文語譯嗎?

close <> getField("漲停價", "D")

不太懂 "  <>  "  這符號在XS語法裡面代表什麼意思...

不好意思~誤會回覆文章的方式!  造成困擾很抱歉

 

謝謝您耐心解釋教學

 

提問

if Position = 0 and filled = 0 and close > close[1]*1.095 then begin

if close > close[1]*1.095 then begin

我想知道為什麼上者會比較好一點?

 

顯示更多回應 發表回覆
Close