自動交易log時間與實際委託成交時間不符,且交易不正常

  •   514 
  • 最後發表   Mick  2021 五月 10
Mick 發文於   2021/04/13

在log中,是09:00:03才開始有第一筆紀錄

而且03~04秒出現了三次""交易指令""的紀錄

但實際上在09:00:02就已經成交了.....

 

LOG中05秒的時候系統要取消交易抽單,但卻失敗了(因為實際上已成交)

然後!!!第一張圖05分時就跳出錯誤,就沒有再繼續執行程式了

導致錯失程式碼內的停損點,後來手動停損損失了不少....

今天也有其他個股是停損,但是就沒有這個問題

 

之前跑模擬單時也是有同樣跳出錯誤的狀況,但因為是模擬單我沒去注意LOG與實際時間

而且當時就算跳錯誤,也都有依照程式碼正常完成停損停利的平倉

今天用實單去跑因為虧錢所以要檢查原因,就發現這個問題

請問小幫手能協助給個解釋嗎,不然花了錢買功能,卻又無法正常使用甚至虧錢,實在苦惱

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

Hello Mick,

 

經詢問工程師後,需要麻煩您提供 XQ Log 來進行進一步的檢驗。

您可以直接將檔案上傳,或是Mail至客服信箱 XQservice@XQ.com.tw且附上討論文章連結網址。

 

非常感謝。

GaryChiang 發文於   2021/04/15

Mick:

我也在測試, 但一直不敢真的上線! 一直有遇不完的神奇事情!!! 

我開了一個討論區, 希望大家能分享經驗!

https://www.facebook.com/groups/500156048013646

Mick 發文於   2021/04/20

今天又來給我搞異常了

2637沒下到單就算了 (但也不行一直跳異常阿)

前面三檔跳異常後就沒有再執行程式,也就沒有執行停損這件事

因為這樣就讓我多賠2萬多,到底是在幹嘛

請問小幫手LOG檔去哪裡找? 我看C:\SysJust\XQLite\LOG 這裡面有很多檔案 是哪一個呢?

XQ小幫手 發文於   2021/04/20

Hello Mick,

 

麻煩您直接將 C:\SysJust\XQLite\LOG 這檔案夾直接壓縮即可,不用從裡面選出檔案。

您可以直接將檔案上傳,或是Mail至客服信箱 XQservice@XQ.com.tw且附上討論文章連結網址。

待您提供 XQ Log 後會直接交由工程師檢查問題原因。如果到時有其他需要的話會在告知。

感謝您的幫忙。

Mick 發文於   2021/04/20

Hello Mick,

 

麻煩您直接將 C:\SysJust\XQLite\LOG 這檔案夾直接壓縮即可,不用從裡面選出檔案。

您可以直接將檔案上傳,或是Mail至客服信箱 XQservice@XQ.com.tw且附上討論文章連結網址。

待您提供 XQ Log 後會直接交由工程師檢查問題原因。如果到時有其他需要的話會在告知。

感謝您的幫忙。

Hi 小幫手 剛剛已將LOG壓縮檔寄至您提供的信箱

我還有另一篇文是回測問題,今天也有將您要求的檔案附在Mail附檔中了

請幫忙查詢問題所在,感謝

.

XQ小幫手 發文於   2021/04/21

Hello Mick,

 

已收到您提供的 XQ Log, 並轉交給工程師檢查原因。

有進一步消息會再告知您。

 

另一篇討論區的問題也已經回覆在該篇文章下。

感謝

Mick 發文於   2021/04/26

Hello Mick,

已收到您提供的 XQ Log, 並轉交給工程師檢查原因。

有進一步消息會再告知您。

另一篇討論區的問題也已經回覆在該篇文章下。

感謝

Hi 小幫手 今天又發生一樣的問題了

而且數量是四個,是還好有回檔一點我趁機手動停損掉 但還是多賠了

不過說到底....這種狀況應該是不允許發生的吧....

 

以6217為例

另外

也不知道為什麼 明明程式碼內指令只下一次 且有用變數控制

但自動交易中心卻出現N次交易指令 然後後面還出現一堆無效交易指令
原因是寫目標部位與目前部位相同所以不執行,但這段程式碼應該連執行都不該執行才對吧?

(我在setposition指令後面就另外加了變數去控制不要重複執行)

以8103舉例

 

程式碼與LOG檔之前有提交過了,這段期間內程式碼內容沒有大變動

真的不知道是XQ問題還是券商問題 是不是XQ跟券商API串接時有delay而造成的?

這樣下去真的不是辦法,再請小幫手請XQ盡快協助解決這個問題,謝謝

 

XQ小幫手 發文於   2021/04/27

Hello Mick,

 

已經將您的 Log 轉交給工程師。

可以得知的是 1414.TW, 2030.TW, 1609.TX 這三樣商品都是因為刪單錯誤導致停止交易,這部分預計在接下來的版本中作修復。

2637.TW 的話需要麻煩您去問卷商,因為根據 Log 顯示這是由於您尚未簽署新版第一/二上市櫃風險預告書。(KY商品)

 

由於您提到您所用的策略和之前另外一封mail寄來的一樣,所以小幫手就以那封策略所附的腳本作說明。

首先,無效的交易指令是因為您的變數並不是 IntrabarPersist 的 (細節請參照連結),這會導致您的變數實際上在 Bar 結束以後才改變。

 

另外,由於得知了錯誤是出在快速的刪單所導致,所以小幫手會將進場策略修改為:

var: class1(0), IntraBarPersist tmp(0), IntraBarPersist tmp2(0),firstkbartop(0),overfirstkbar(0),firstkbarlowest(0);

if condition1 and tmp = 0 and time < 090100 and opend(0) < value4 and getinfo("isrealtime") = 1 then begin    //確保只有運行在即時的狀況下才會下單

    setposition(class1, market);     //或是open,主要是讓這價格不要因為價格一值變動而導致快速的下單和刪單

    highprice = value1;              //紀錄移動停利點

    tmp = 1;

    overfirstkbar = 0; 

    end;

 

tmp2 的部分也相同。

 

或是把 tmp 改為 filled

if condition1 and filled = 0 and time < 090100 and opend(0) < value4 and getinfo("isrealtime") = 1 then begin    //確保只有運行在即時的狀況下才會下單

    setposition(class1, market);     //或是open,主要是讓這價格不要因為價格一值變動而導致快速的下單和刪單

    highprice = value1;              //紀錄移動停利點

    overfirstkbar = 0; 

    end;

if filled > 0 then begin

......

 

這樣的話在此問題修復前應該也比較不會出錯誤而導致自動交易中斷。

感謝。

Mick 發文於   2021/04/27

非常感謝小幫手!!

KY的問題當天晚上回家看紀錄才知道是我沒簽,我當下已進行簽署了

 

另外,看了您修改的程式碼後,有個問題想請教

您說把 setposition(class1,value1) 的 value1 改成market

但我下一行 highprice = value1 是要記錄進場點,若我把這裡的value1改成filledavgprice的話會不會出錯?

畢竟掛market單不見得一定是成交在value1這個值 (value1 = addSpread(close,1) )

我不確定在程式執行完setposition這個指令後馬上又執行highprice變數的改變會不會來不及?

假設執行了setposition下單到實際成交經過了2毫秒,但在經過1毫秒時就已經執行到 highprice = value1這行了

這時候若value1改成filledavgprice的話filledavgprice應該會沒有數值才對,這樣會不會無法正確把進場點記錄到highprice這個變數?

(又或者說其實我的這個擔心並不會發生XD?)

 

我有想到另一個方式

把highprice = value1這行往下移,移到 if tmp = 1之後再執行

 

不知道兩種方式那種比較不會出錯?

1. highprice = value1 位置不變,但將value1改為filledavgprice

2. highprice = value1 移到tmp = 1之後,且將value1 改為 filledavgprice

 

 

tmp的部分沒辦法改成filled > 0

如您可見的,我同一個程式內有兩種策略,所以才用tmp去判斷要執行哪一個

若將tmp改為filled 的話兩段不同的策略會打架吧XD?

 

最後再請教一個問題,intrabarpersist的部分,依照您所說若沒有加這個函數,我的變數會在下一根K棒才會改變

那照這邏輯,若我每一項變數都加上intrabarpersist會有問題嗎?

有沒有什麼狀況是不必要加上這個函數的?

 

Mick 發文於   2021/04/27

我後來想到一個辦法

用condition1或condition2去判斷就好,這樣就可以避免掉tmp這個變數的問題

同時也可以用filled了,不同condition剛好可以代替tmp去判斷要執行哪一段程式

 

但highprice紀錄進場價的問題還是想不透

我剛用了上面我講的兩種方式,回測結果差異很大

系統在模擬時一個會用K棒最低價為入場點,另一個反而是用最高價當入場點QQ

顯示更多回應 發表回覆
Close