交易商品數量不對 & 下單逾時

  •   598 
  • 最後發表   Pony  2021 十一月 11
Pony 發文於   2021/10/22

小幫手你好:

前幾天測試交易碰到問題如下

1.下單數量不管是1張或多張,成交張數是正確,但原委託的部分都會顯示多一張,造成委託狀態變成部分成交?

2.使用1分K棒,尾盤及停損停利沒有確實出場,在交易回測的過程中都有符合進出點位,但下模擬帳戶時卻沒有觸發,語法皆使用範例修改,這部分跟沒有勾逐筆洗價有關係嗎?

3.自動交易中心,9點開盤時,若前幾分鐘才開啟策略,在準備商品時需要花很久時間,有建議什麼時候可以開啟自動交易嗎?可否像警示那樣設定排程時間開啟

4.刪除書號委託逾時,在想是不是因為第一點造成,因為帳號裡面已經有正確的部位,為何會產生這個問題

 

問題有點多,麻煩小幫手了  謝謝 !

附加文件

排序方式: 標準 | 最新
XQ小幫手 發文於   2021/10/25

Hello Pony,

 

關於問題1和問題4,已收到您寄過來的Log,並請工程師確認。

 

問題2有很多種可能。需要視您的腳本和交易商品的狀況而定。

小幫手列幾個可能:

1.您設定在13:25~13:30出場,可是這段時間股市是集合競價,XS不會在這段時間下單。需注意XQ顯示的時間為 Bar 開始的時間,所以132500代表的是 13:25 ~ 13:26 這段時間。

2.在您設定的時間點該商品沒有交易。若該根Bar沒有交易的話XQ不會下單。

3.若腳本同時有好幾個 setposition 在執行的話,只會執行位於腳本最上方的那一個。

若以上幾種都不是問題原因的話,需要麻煩您提供 自動交易中心匯出檔勾選(包含)交易腳本,以及出問題的商品名稱。

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

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

感謝。

 

問題3相關人士已經在評估讓自動交易也可以設定排程的功能。

Pony 發文於   2021/10/25

Hi 小幫手 :

問題2-1的做空範例

時間出場語法如下

 

if Position <0  and time >= 132000 then begin

SetPosition(0, MARKET);

alert("時間出場");

end;

停損停利語法如下

if Position <0  then begin

{ 依照成本價格設定停損/停利: 請注意當作空時, 判斷是否獲利的方向要改變 }

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

{ 停利 }

SetPosition(0, MARKET);

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

{ 停損 }

SetPosition(0, MARKET);

end;

end;

問題2-2  因為多個商品都是如此,所以猜測應該不是單根Bar沒有成交量造成

 

關於第2-3點有好幾個setposition在執行 會造成什麼問題嗎 ? 我想比較有可能是這個問題,假設我有三個條件出場 我會這樣寫

if Position <0 and condition1 then begin

SetPosition(0, MARKET);

end;

if Position <0 and condition2 then begin

SetPosition(0, MARKET);

end;

if Position <0  and condition3 then begin

SetPosition(0, MARKET);

end;

 

以上  謝謝!

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

Hello Pony,

 

2.1 時間出場問題除了語法外,還跟是否有逐筆洗價,頻率為何有關。

舉例來說,您的腳本如果是5分鐘頻率,沒有逐筆洗價的話。

那麼要運算 132000 這根Bar會是在 13:25 以後,此時已進入集合競價不會下單了。

建議您可以使用 currenttime 代替time,且使用逐筆洗價的話應該就不會遇到這狀況。

另外還有一點,如果使用日頻率的話,time 會回傳0。日頻率沒有時間欄位。

 

2.3 您舉的例子都是調整到相同的部位,所以會感覺不出差別。

小幫手舉個簡單例子:

condition1 = currenttime >= 120000;

if condition1 then setposition(1, market);

condition2 = currenttime >= 132000;

if condition2 then setposition(0, market);

這樣的狀況下,由於 condition1 在12點後一直都會是true,所以進場的setpositon將會一直執行。

就算到了13:20 condition2 亦為True後,出場的 setpositon 也不會執行,因為被進場的交易指令給卡死了。

同一時間只會執行一個交易指令,就算是有多個交易指令符合條件。

細節您可以參考 SetPositon 裡的說明。

 

關於您提供的Log,工程師反映說裡面沒有包含交易中心相關的Log。

希望麻煩您關閉XQ後再壓縮Log資料夾,並提供給我們。

感謝。

Pony 發文於   2021/10/26

Hi 小幫手 :

2.1 我使用的時間是一分鐘K棒,沒有逐筆洗價,出場語法如下,這樣的寫法不知道符合嗎

if Position <0  and time >= 132000 then begin

SetPosition(0, MARKET);

alert("時間出場");

 

end;

 

2.3只考慮進場後,可能有2-3個條件出場,才會這樣寫,所以我覺得問題應該是出在出場條件沒被觸發到

若是有其他指令互打這個問題,導致於,在回測上應該看得出差異才對?

至於出場條件,我的寫法上也是如同上面那段這樣寫,還是小幫手這邊有建議有多個出場條件且部位都要出清應該怎麼寫比較好呢 

 

log檔案我再補寄給工程師,謝謝 !

 

 

 

 

XQ小幫手 發文於   2021/10/28

Hello Pony,

 

2.1 小幫手覺得您的寫法無誤。只要13:20~13:25有成交且沒有其他交易指令同時執行的話,如果您原本持有空單的話會出場。

 

2.3 小幫手會建議您,同一個腳本裡不論是進場還是出場,都要確保同一時間只會有一個交易指令觸發。

    這樣發生錯誤時(比如說應該出場沒出場)用print在 debug 的時候會比較容易。

    如果同一時間可能會有兩個條件觸發的話,把您覺得該優先執行的寫在腳本上方。

    舉例來說好了,您的進場條件可能會和 13:20 後出場的條件同時觸發。

    如果進場指令寫在上方,那麼腳本就不會出場。

    相反的話,腳本就會先出場。(但需注意如果進場條件還是符合的,出場後還是會再度進場)

 

關於問題1跟4,工程師有找到可能的疑點並開始修復。目前是預計會包含在.06.05的版本之中。

Pony 發文於   2021/11/09

Hi 小幫手:

 

請問有預計.06.05版什麼時候上線嗎? 因為卡在這邊沒辦完成之後的交易。謝謝!

XQ小幫手 發文於   2021/11/11

Hello Pony,

 

目前相關人員正在驗證中,快的話大概下個禮拜中就會上線。

感謝。

發表回覆
Close