指定欄位資料尚未更新 - 交易模組

  •   57 
  • 最後發表   charlie1234  2021 十一月 19
charlie1234 發文於   2021/11/08

小幫手好

用交易模組抓董監持股佔股本比例,出現圖片內的錯誤,就算加了[1],也是一樣出現錯誤

if getfield("董監持股佔股本比例", "M")>0.1 then setposition(1);

如果我沒記錯,小幫手說過,最新資料還沒出來時,會使用現在有的資料當最新資料

不會有抓到未來資料的問題,既然是這樣,又怎麼會有這個錯誤訊息出現呢?

請小幫手協助

 

另外,之前提出好幾個問題,不知工程師那邊解決了嗎?  有的問題都有一個月了

策略常研發到一半就沒法繼續了,一直在等待,實在有點累啊

 

另外,建議像凱衛一樣用個軟體bug的問題追蹤表,方便大家追蹤了解進度,

https://www.multicharts.com.tw/roadmap/bugtracker.aspx

 

 

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

Hello charlie1234,

 

小幫手這邊測試取前期值時可以正常執行,及時與回測都可以。(參考附圖)

需要麻煩您提供 測試的腳本、如何測試 以及 XQ Log 來檢驗。

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

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

感謝。

 

小幫手不太確定您是在哪個問題時看到 最新資料還沒出來時,會使用現在有的資料當最新資料 這部分的,不過就小幫手所知並不是所有資料都會這樣。

舉例來說 大戶持股人數 在即時狀況下使用會出錯,因為本週的資訊還沒有更新,但加上[1]就不會有問題。

如果該資料有更小的頻率,舉例來說您1分鐘頻率的腳本在盤中呼叫 getfield("Close", "D") 好了,那麼他回傳的數值會是當下的1分鐘頻率收盤價。

 

目前您提出的問題中工程師已修復的如下:

法人買賣超數據不正確

回測採用還原值問題

除權息日資料落差有點大

回測錯誤:不支援此頻率

 

感謝您的建議,小幫手會轉告知相關人士作參考。

附加文件

charlie1234 發文於   2021/11/10

謝謝小幫手回應

我記得是晚上的時候回測的,且我現在回測還是有這個錯誤

不是所有的股票都顯示這個錯誤,有部分顯示這個錯誤,這也是很怪的地方,請小幫小再了解下

請一次多放幾檔股票回測,您的回測只有一檔股票,或許剛好沒問題,謝謝

 

 

input: ProfitEx(10,"獲利出場%"), LostEx(10,"虧損出場%");

if  getfield("董監持股佔股本比例", "M")[1]>0.1 then setposition(1);

if position>0 and filled>0 and (close>=filledavgprice*(1+ProfitEX*0.01) or close<=filledavgprice*(1-LostEx*0.01)) 
then setposition(0);

 

 

charlie1234 發文於   2021/11/10

 另外,您提到

 

小幫手會使用現在有的資料當最新資料 這部分的,不過就小幫手所知並不是所有資料都會這樣。

舉例來說 大戶持股人數 在即時狀況下使用會出錯,因為本週的資訊還沒有更新,但加上[1]就不會有問題。

 這段話我是否可以理解為,XQ在資料的取用邏輯上有不一致的狀況,不然怎麼會發生有時要加上[1],有時不要呢?  以您說的大戶持股人數,正常情況當周資料還沒有,不就是抓上周的嗎? 上週的資料應該是被當作是最新的,也不需要加[1]? 這種不一致的問題是不是該去做調整呢?

之前還遇過取到未來值的狀況,所以對於是否加[1],也一直嚷我非常混淆,不知道小幫手這有無一個判斷標準,何時該加[1],還是不該加[1] ,才不會有抓到未來值,或是出現最新資料還沒出來的問題

 

之前問題是否修正,我再看看,謝謝小幫手

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

Hello charlie1234,

 

小幫手測試過後確實有些商品會發生您所說的情況。

請工程師看過後發生的原因是因為這些商品除了當月外前一月也沒有資訊。

會再研究該如何處理。

 

主要有兩種情況會需要使用前期資料:

1.

當日盤後更新資料。

這部分您可以使用 getfielddate 來判斷資料日期。

如果是盤中運算的話則建議一律取前期值。

 

2.

集保周末更新資料。

這部分您可以參考內建的選股策略 千張大戶增持。

裡面會作週資料的判別。

如果是盤中運算的話則建議一律取前期值。

 

所有的資料欄位都可用 getfielddate 取得對應的欄位資料日期。

您可以使用此函數來判斷是否要使用前期值。

大略可以分成下面兩種情形:

無值,對位錯誤 -> getfielddate會取得0。

無值,往前對位 -> getfielddate會取得前期日期。

charlie1234 發文於   2021/11/12

謝謝小幫手回應

有關是否要加[1],會測跟盤中是否都一樣,還是說會有回測要加[1],實際在盤中就不需要的狀況呢?

 

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

Hello charlie1234,

 

小幫手覺得如果要讓回測和實際執行時維持相同的狀況,會讓兩者盡量相同。

也就是說,都取[1]會比較合適。

至於回測時加[1],盤中就不需要的狀況小幫手到是沒有印象有遇過。

關於是否要取前期值的簡單判別,小幫手詢問相關人士得知的是:

財報欄位一般都會向前對位,也就是 無值,往前對位 -> getfielddate會取得前期日期。

籌碼欄位大多在盤後才更新,會是 無值,對位錯誤 -> getfielddate會取得0。

charlie1234 發文於   2021/11/18

小幫手好

繼續上面的交易不加[1],但是選股加[1]的問題

今天看XQ的FB剛好看到一個例子,也是我常在寫選股策略時的困擾

這篇我常用的選股策略系列之11~ K在低檔回升且外資投信同步買超

程式碼如下

settotalbar(100);
var:rsv1(0),k1(0),d1(0);
stochastic(9,3,3,rsv1,k1,d1);
condition1=k1 cross over 20;
value1=GetField("外資買賣超","D");
value2=GetField("投信買賣超","D");
condition2=value1>500 and value2>200;
if condition1 and condition2 then ret=1;

 

GetField("外資買賣超","D") 和 GetField("投信買賣超","D")都沒有加[1]   1. 這個跟小幫手上面給的建議好像不符 2. 當天的選股,要在盤後才能做選股,所以不加[1],是正確的 3. 回測時 (廣達、日線、20210105-20211107),系統也很聰明,會是隔天開盤進場   以廣達為例,我增加print指令,訊號出現日期為20210818,進場日為20210819 Print顯示的是訊號出現那天的數值,這樣也沒錯 20210818.000000 565.000000 20210818.000000 

settotalbar(100);
var:rsv1(0),k1(0),d1(0);
stochastic(9,3,3,rsv1,k1,d1);
condition1=k1 cross over 20;
value1=GetField("外資買賣超","D");
value2=GetField("投信買賣超","D");
condition2=value1>500 and value2>200;
if condition1 and condition2 then begin
    ret=1;
    print(date, GetField("外資買賣超","D"),getfielddate("外資買賣超"));
end;

然而,同樣的程式碼,放到雷達,就好像有問題

同樣是日線,進場逐筆的情況,不管選下期開盤價或是當期收盤價,通通都是2021/8/18進場
同樣是日線,進場逐筆的情況,選當期收盤價,進場日期是8/18, 選下期開盤價,進場日期是8/19

問題就出現在策略為何會8/18進場?

用雷達print,採用逐筆的方式,可以比較清楚呈現,就是20210818當天回測時,投信買賣超資料是有出現的

就是說,盤中已經用了當天收盤後才應該有的數值做判斷,取用了未來值

而小編上面說的(下方),似乎並未發生

無值,對位錯誤 -> getfielddate會取得0。

無值,往前對位 -> getfielddate會取得前期日期

20210818.000000 91300.000000 565.000000 20210818.000000 
20210818.000000 91400.000000 565.000000 20210818.000000 
20210818.000000 91500.000000 565.000000 20210818.000000 
20210818.000000 91600.000000 565.000000 20210818.000000 
20210818.000000 91700.000000 565.000000 20210818.000000 
20210818.000000 91800.000000 565.000000 20210818.000000 
20210818.000000 91900.000000 565.000000 20210818.000000 
20210818.000000 92000.000000 565.000000 20210818.000000 
20210818.000000 92100.000000 565.000000 20210818.000000 
20210818.000000 92200.000000 565.000000 20210818.000000 
20210818.000000 92300.000000 565.000000 20210818.000000 
20210818.000000 92400.000000 565.000000 20210818.000000 

以今天這樣回測,我也才注意到選股的回測會自動隔天進場

而雷達模組如果用到盤後資料,是需要人工選隔天,且進場還不能選逐筆,這個不知貴公司是否有提供這樣的說明?

或是在選股模組不加[1],但放到雷達要加[1],這樣才能保持回測的一致性

但我覺得,不管如何選,回測時能取用到未來值,這就是本身系統的bug問題

消費者肯定不會預期到,自己竟然會取用到未來值,系統應該要能判斷啊,不是嗎?

當然啦,要公司修這這一問題,我想是很難的,牽涉太廣

但建議

1. XQ能在有關盤後數據說明那,提供更清楚的警示說明

2. 或可有個防呆視窗通知,在使用盤後資料回測時,提醒無法選逐筆跟當期收盤,或甚至自動不給選

 

不然,真的會發生回測是聖杯,上線變靠北了

 

最後,還有個建議,希望貴公司也能考慮獎勵下討論區發掘出bug的網友,咱們花錢買模組,是要開發策略,

不是在幫貴公司debug的啊,常常為了bug,花一堆時間去確認,好歹也給些點數,可以換取月租減免吧

不然真的唉.........

附加文件

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

Hello charlie1234,

 

小幫手沒有說過 交易不加[1],但是選股加[1]。

倒不如說是相反的。

 

首先,您要理解:

選股只能使用日頻率或以上,且當日資料只能在盤後運算。

這代表的意義是選股的運作時間一定是在盤後,而這些在盤後才有的欄位應用在同一日上是合理的。

因此選股的回測一定是隔日進場,您在今日運算完後觸發條件,但已經收盤了,所以才會在隔日進場。

 

雷達則是可使用頻率最廣的,從分鐘頻率到年頻率都有。

所以當您在分鐘頻率使用時,自然無法取得這些今日盤後才更新的資料欄位,要使用 [1] 才合理。

進場時可以選擇使用觸發當下的收盤價,或是下一根

 

自動交易最高可使用頻率為日,且強制使用逐筆洗價,所以運作時基本上可以當作日頻率以下。

因此也是使用 [1] 才合理。

 

小幫手上面之所以建議 外資買賣超 要加上 [1] 是因為您前面都在討論交易腳本回測。

 

第二,關於逐筆洗價的運作邏輯:

1分鐘頻率的逐筆洗價,會將1分鐘Bar拆分成 OHLC 4個Ticks來模擬。

1分鐘以上的頻率逐筆洗價,會用1分鐘Bar來模擬。

您策略雷達勾選逐筆洗價時會在8/18進場的原因是當日策略會以1分鐘Bar來模擬運算,所以當期收盤價或是下期開盤價都會是當日,差別這是觸發的1分鐘Bar還是下一根1分鐘Bar。

 

回測時當然都會有資料,因為資料早已經更新,所以您一定可以取得。

只有在無值,也就是該日沒有資料的狀況下,getfielddate 才會有小幫手上敘的狀況。

這就是為什麼小幫手上面建議您如果在交易腳本裡作回測是要加上[1]才符合道理。

像投信買賣超這種盤後才更新的欄位在XSHelp上會說明,另外在腳本中使用插入欄位時也會有說明。(參考附圖)

 

這些設定上的細節您可以參考教學區裡面選股、雷達、自動交易中心裡的說明。

 

您的建議小幫手會轉告相關人士作參考。

附加文件

charlie1234 發文於   2021/11/19

 

感謝小幫手回了這麼大一篇 :)

您說的我都理解,

只是覺得能讓人抓到未來的數值不盡合理就是了

 

 

 

 

發表回覆
Close