爛系統

  •   831 
  • 最後發表   jianglin  2024 十月 16
jianglin 發文於   2024/07/04

每個月扣款一千塊

使用自動交易

結果卻被系統弄賠錢

明明觸發條件結果沒反應

每次更新後一堆狗屁倒灶的問題

讓我賠30萬 

真是花錢找罪受 

沒那個能力就不要推出來

 

  • 按讚來自於
  • SIMPLELIFE328
排序方式: 標準 | 最新
虎科大許教授 發文於   2024/07/04

造成問題的可能原因很多,先找出原因比較重要。你若願意將問題列出,也許我可幫忙找出原因。很多時候,執行結果不如預期,不一定是系統的問題。

  • 按讚來自於
  • SEJU0313
虎科大許教授 發文於   2024/07/04

Hi, jianglin,也許你不相信交易訊號錯誤(該有訊號卻沒出現或不該有訊號卻出現訊號)大部份的問題是出自策略開發者對XQ的運作模式不了解,但我可以舉一大堆例子證明這種問題經常是策略開發者造成的。礙於版面限制,我這裡僅舉三個例子當作教學範例。

(1)任務:在5分鐘頻率且逐筆洗價的情況下,若空手且K值大於50且KD出現黃金交叉,就進場。

if barfreq<>"Min" or barinterval<>5 then raiseRunTimeError("限用5分鐘頻率");

var: rsv5(0),k5(0),d5(0);

stochastic(9,3,3,rsv5,k5,d5);

condition1=k5>50 and k5 cross over d5;

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

這個交易腳本看起來似乎沒有問題,但若啟動策略,你會發覺技術分析圖表上的K值已經大於50且KD出現黃金交叉,但交易腳本卻沒有進場訊號。為什麼會這樣呢?其實,這個腳本計算的KD數值都是錯誤的,因為用預設讀取的100筆資料,計算技術指標是不夠的。若在腳本的第一行加上settotalBar(300); 問題即可解決。

(2)任務:在5分鐘頻率且逐筆洗價的情況下,若空手且即時價格高於過去三期最高價,就進場。

if barfreq<>"Min" or barinterval<>5 then raiseRunTimeError("限用5分鐘頻率");

condition1=c>highest(h[1],3);

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

這個腳本看起來也是沒有問題,但其實存在風險。假設過去三期最高價是99.90,且目前的K棒出現100的最高價,這時候理應出現進場訊號,但實際情況可能沒有出現訊號。這時候你可能會怪系統爛,但策略開發者應該要了解,在快市出現時,系統很可能會漏接Tick(這與你使用的頻寬及電腦效能有關)。若出現價格100的Tick只有1筆,且不巧漏接了,則沒有出現訊號是很正常的事。其實,有經驗的策略開發者會把condition1=c>highest(h[1],3);改成condition1=h>highest(h[1],3);。用h取代c,可避免Tick漏接,該有訊號卻沒有訊號的問題。

(3)任務:在5分鐘頻率且逐筆洗價的情況下,若即時價格高於過去三期最高價,就進場,且只進場一次。

if barfreq<>"Min" or barinterval<>5 then raiseRunTimeError("限用5分鐘頻率");

var: hasOrdered(false);

condition1=c>highest(h[1],3);

if hasOrdered=false and condition1 then 

      begin

            Buy(1,market);

            hasOrdered=true;

      end;

這個腳本看起來也沒有問題,但其實大有問題。若啟動策略,你會發覺即時價格已經高於過去三期最高價很多了,但一直沒有進場。為什麼會這樣呢?因為策略開發者忘記了策略啟動後會先跑預設的100筆歷史K棒,在這100根歷史K棒裡面,可能因為有一根的收盤價已經高於過去三期的最高價,而讓condition1變成true,如此一來,程式就無法進入if裡面去下單。當然,你可以考慮用if getinfo("IsRealTime")=0 then return;來略過歷史K棒,但這樣造成的問題更大,因為只要這5分鐘之內的即時價格高於過去三期最高價,就會一直下單,直到你的券商額度下滿為止。為什麼會這樣呢?因為策略開發者不清楚,在逐筆洗價下,變數的行為與非逐筆洗價的情況是不同的。儘管在第一次下單時,我們讓hasOrdered=true;,但下一個Tick洗價時,它又變回false,因此又會進到if裡面繼續下單。解決問題的方法是,在宣告hasOrdered變數時加上intrabarpersist。

在開發策略時,我們會遇到很多與預期不同的狀況。不如預期時,不要先怪罪系統,而應先思考是否自己的程式沒有顧慮到哪些條件或因素。這樣不斷地檢討,就會不斷地進步了。

XQYi 發文於   2024/07/05

所提,針針見血、有深痛之宴!

對於不熟悉系統運作邏輯,非專業有經驗的人處處是陷阱

這些止血措施,對XQ專業的人應該並非難事

如果可以再編譯時或執行時,根據腳本自動修正或提醒,越貼近消費者,血的饗宴就越少了!

但根據觀察,短時間應該很難著墨在消費者這塊,各卷商都在轉換,B2B現況餅比較需要處理。

  • 按讚來自於
  • SIMPLELIFE328
石頭 發文於   2024/07/06

感謝許教授無私分享,收穫很多。

FrankLi 發文於   2024/10/16

感謝教授分享, 這幾個錯誤案例很棒,

就算是老手, 一不小心也會踩到這些地雷

發表回覆
Close