自動交易→條件不成立依然會觸發 非常危險的BUG

  •   971 
  • 最後發表   GammaCEO  2022 六月 17
GammaCEO 發文於   2022/03/22

小幫手您好

想請您看看下面腳本所執行的自動交易被觸發的條件為何?

為什麼一開盤就馬上被觸發?腳本其他商品都沒發生,唯獨這支

商品:1612 宏泰 頻率:1分鐘 逐筆洗價:啟用 資料讀取筆數:5 策略部位:依庫存

PRINT內容

腳本內容

if CurrentTime = 085955 then tg=0 ;
if CurrentTime = 085955 then sp=0 ;
if CurrentTime = 085955 then oc=0 ;

value1=FilledAvgPrice*1.01618;
value2=FilledAvgPrice*1.03236;
value3=FilledAvgPrice*1.06472;
value4=FilledAvgPrice*1.095;
//cross Below
condition1=close cross Below value1 or close cross Below value2 or close cross Below value3 
or close>=value4;
condition2=currentTime>=090000 and close>FilledAvgPrice ;

if Position >= 1  and tg=0 and condition1 and condition2 then 
begin       
    SetPosition(0,label:="平倉");{ 停利 }
    tg=1;
    oc=close-tp;
    value88=round((oc-FilledAvgPrice)*Position,2);
    Alert(text("1.已平倉",NumToStr(value88,2)));
end;

if currentTime>=132500 then return;

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

Hello GammaCEO,

 

就您提供的部分腳本看起來,condition1應該是不會觸發才對。

需要麻煩您提供 自動交易中心匯出檔勾選(包含)交易腳本、(如果有的話) 自動交易執行紀錄匯出檔 以及 XQ Log 來檢驗。

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

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

感謝。

GammaCEO 發文於   2022/03/28

小幫手您好,LOG檔已經寄出,再煩請工程師查明觸發原因為何。

謝謝!

XQ小幫手 發文於   2022/03/29

Hello GammaCEO,

 

根據您提供的腳本,須注意 開盤清零的部分 不一定會執行到。

因為XQ是洗價時運算 (逐筆洗價的話),所以除非剛好在 085955 跟 090000 有tick交易不然腳本不會運算,變數也不會歸0。

 

此狀況發生的原因小幫手推測可能是因為在預讀筆數時運算庫存為0,所以 value1 ~ value4 為0,而在遇讀筆數運算完成調整初始部位後,value1 ~ value4 就計算出該有的值。

此時只要收盤價小於 value1 的話,就符合 cross below (當期小於等於,前一期大於)。

而您的收盤價也大於庫存成本,所以condition1和condition2同時符合。

您可以加上 GetInfo("TradeMode") = 1 看能否解決,像是:

condition1=(close cross Below value1 or close cross Below value2 or close cross Below value3 or close>=value4) and GetInfo("TradeMode") = 1;

condition2=currentTime>=090000 and close>FilledAvgPrice and GetInfo("TradeMode") = 1;

 

小幫手也會請相關人員確認您提供的Log看問題是否符合上述猜測。

 

GammaCEO 發文於   2022/03/29

感謝小幫手專程回覆

若照小幫手所推測是預讀筆數的某值高於value1,然後一開盤cross below value1,

那也要前日有tick > value1才符合推測,但觀察前一日預讀筆數內並未有任一根KBar > value1,

觀察print內容也的確是如此。

還有,策略啟動時間是08:45左右,啟動當下就已經偵測到並顯示庫存部位,沒理由在開盤後調整部位還是為0,造成程式無法依撰寫的腳本內容去正確執行進出場,但我還是會照小幫手建議的加上getinfo("trademode")=1 再Run看看,希望別再發生類似的狀況,畢竟這全是真實交易非模擬,更應謹慎去面對。

 

 

 

XQ小幫手 發文於   2022/03/31

Hello GammaCEO,

 

已和相關人士確認過,是和小幫手預想的狀況一樣。

策略啟動時的步驟為: 

策略啟動 => 準備商品資料 => 資料預讀筆數運算 => 設定初始部位 => 開始及時洗價

 

所以在資料預讀筆數運算的期間 filledavgprice 為0,因此 value1 ~ value4 自然都為0。

在這段時間內 收盤價都會大於 value1 ~ value4,除非收盤價為0。

 

接著設定初始部位,此時 filledavgprice 才會有值,接著進入及時洗價。

此時 value1 ~ value4 才不會是0。

如果任何一個變數大於當下收盤價的話,condition1就會是True。

GammaCEO 發文於   2022/03/31

Hello GammaCEO,

已和相關人士確認過,是和小幫手預想的狀況一樣。

策略啟動時的步驟為: 

策略啟動 => 準備商品資料 => 資料預讀筆數運算 => 設定初始部位 => 開始及時洗價

所以在資料預讀筆數運算的期間 filledavgprice 為0,因此 value1 ~ value4 自然都為0。

在這段時間內 收盤價都會大於 value1 ~ value4,除非收盤價為0。

接著設定初始部位,此時 filledavgprice 才會有值,接著進入及時洗價。

此時 value1 ~ value4 才不會是0。

如果任何一個變數大於當下收盤價的話,condition1就會是True。

所以說這就是BUG沒錯!

承小幫手所言,自動交易只能設定在開盤後啟動,開盤前所抓取的filledavgpriceposition都不會納入計算,

正常來說自動交易設定成可依庫存來計算成本和部位,XQ透過API連線到券商主機就能抓取及時庫存與成本,

在預讀筆數時就該導入數值,而不是等第一根tick出現後才開始計算庫存和成本,這也是貴公司獨立開發出來要和XS雷達做區隔的進階版交易策略不是嗎?

既然多了部位成本計算的功能,卻無法在開盤第一根tick精準使用腳本內建函數cross above 和 cross below來偵測並執行交易,這樣不如我直接用XS雷達並直接在腳本輸入部位建倉成本來執行或許還更有效率。

最後,您在句尾說的:如果任何一個變數大於當下收盤價的話,condition1就會是True。這句的意思是預讀洗價時的close是有被納入策略腳本去運算,因為尚未取得部位成本所以close為0,因此第一根tick出現觸發condition1內的close>=value4 ?!

如果是這樣更證明XS自動交易存在著用戶無法掌控的危險因子,有需要再調整和改善的空間,我是不介意繼續當白老鼠,但也希望XQ團隊能正視所有XS程式的問題核心所在並去做修正,而不是要用戶去修改交易方式來適應程式,這樣才能解決所有用戶問題,不會本末倒置。

謝謝小幫手!

  • 按讚來自於
  • RFJU0111
  • sb04870487
shuiwang 發文於   2022/04/05

資料讀取筆數 設0  or 加上 GetInfo("TradeMode") = 1 

很贊同這段話:

如果是這樣更證明XS自動交易存在著用戶無法掌控的危險因子,有需要再調整和改善的空間,我是不介意繼續當白老鼠,但也希望XQ團隊能正視所有XS程式的問題核心所在並去做修正,而不是要用戶去修改交易方式來適應程式,這樣才能解決所有用戶問題,不會本末倒置。

  • 按讚來自於
  • YYFrankLi0813
  • greg750
XQ小幫手 發文於   2022/04/11

 Hello GammaCEO and shuiwang,

 

小幫手會將您們的意見轉告相關人士。

感謝。

GammaCEO 發文於   2022/05/18

小幫手您好

關於自動交易的BUG何時能修復?

因為該設定的都設了

腳本該加的該改的也都加了改了

但就是無法正確抓到正確的Position去計算FilledAvgPrice

導致一開盤有大於成本的tick就會執行賣出

這真會讓人氣到吐血啊

拜託和相關開發人員溝通溝通,看看能否解決這惱人的BUG

昨天6235(華孚)出包一次

今天9945(潤泰新)再來一次...真不知道該說什麼了

XQ小幫手 發文於   2022/05/23

Hello GammaCEO,

 

小幫手上面的解法有誤。

由於FilledAvgPrice要到預讀筆數運算結束後才會有值,所以就算讓腳本在即時洗價的部分才運算,還是會出現相同的錯誤。

測試了一下,為了避免這樣的狀況,可以多加上一個條件,就是使用FilledAvgPrice運算的變數的前期值不為0。

condition3 = value1[1] <> 0 and value2[1] <> 0 and value3[1] <> 0 and value4[1] <> 0;

由於 condition1 中的 cross below 是用當期和前期值來判斷,所以只要確認前期值不為0,就可以避免因為啟動時預讀筆數FilledAvgPrice為0導致value1 ~ value4運算為0的狀況。

 

關於策略啟動時的步驟:

策略啟動 => 準備商品資料 => 資料預讀筆數運算 => 設定初始部位 => 開始及時洗價

這部分,相關人員討論後目前是不會進行修改。

 

另外,關於您提到的這一點 正常來說自動交易設定成可依庫存來計算成本和部位。

自動交易目前只有在啟動的時候會透過API讀取當下的庫存與成本。

顯示更多回應 發表回覆
Close