每個月扣款一千塊
使用自動交易
結果卻被系統弄賠錢
明明觸發條件結果沒反應
每次更新後一堆狗屁倒灶的問題
讓我賠30萬
真是花錢找罪受
沒那個能力就不要推出來
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。
在開發策略時,我們會遇到很多與預期不同的狀況。不如預期時,不要先怪罪系統,而應先思考是否自己的程式沒有顧慮到哪些條件或因素。這樣不斷地檢討,就會不斷地進步了。
感謝許教授無私分享,收穫很多。
感謝教授分享, 這幾個錯誤案例很棒,
就算是老手, 一不小心也會踩到這些地雷
5 評論