用XS寫盤中偵側 但 於 盤後測試發生的問題 ?

  •   419 
  • 最後發表   JK1234  2020 六月 29
JK1234 發文於   2020/06/02

小編您好:

 有幾個問題困擾我一陣子,就是我用XS寫了一個盤中偵側,但先用於盤後進行驗證與除錯,目前發生的問題是

用我寫的XS程式用策略雷達裡的 單次洗價,在 5/31的跑單次洗價有篩到個股,於6/1盤中時也有順利篩出個股來,

但我在 6/1盤後在15:07 有用單次洗價,也成功的篩出個股來,但於15:22 再使用單次洗價就篩不出任何個股,是什麼

原因造成這個問題 ? (畫面資料請見圖P1,2,3,4)

再者 我有幾個問題

1. 單次洗價 與 執行回測 的差別在哪裡 ?

2. 我有寫一隻XS策略用單次洗價就篩不到個股,都是用回測才看的篩到什麼個股,是什麼原因造成?

 

 

p1p2p3p4

附加文件

排序方式: 標準 | 最新
XQ小幫手 發文於   2020/06/05

Hi JK1234

其實單次洗價模式雖然會洗資料讀取筆數的資料,但是會不會觸發判斷其實是最後的那一根K會不會觸發

查看了您的腳本,您是使用1分K搭配逐筆洗價。

那您的value2跟value3,就不會是20日均量,也不會是3日均量,這可能是其中一個原因

建議您可以把volume也指定抓日頻率。

-----------------------------------

單次洗價比較偏向於驗證性質,小編會搭配print的語法,在盤後的時候驗證數值是否正確
盤中的時候也會只是判斷當下時點符不符合條件,但單次洗價是不會替您下單的。

取得的數值會依照您的資料讀取筆數而定,向您設定為預設值200,那就會是那一個時點,往前抓兩百筆資料

回測就比較偏向,過去的這段期間,當達成條件的時候就會買進或賣出,這段期間的報酬率如何。

希望有解決您的疑惑,謝謝。

JK1234 發文於   2020/06/14

你好小編 ~

感謝回復,以下問題再次請教

1. 改用策略跨頻率的寫法 getfield如下

=================================================================

問題 1 :在策略跨頻率的寫法  “盤中即時成交累積量”  的獲取是要用 a ? b ? 或者a 與b皆可 ?

a. Value4 =volume[0];
b. Value4 = GetQuote("DailyVolume");

問題 2: 延續問題1,在策略跨頻率的寫法下

如果是必需用 b 的getquote 寫法 ,那若用 a 這種寫法得到的資料是什麼?

=================================================================

問題 3: 盤中如何獲取 “昨量比” 之數值(XQ欄位裡有這個),查不到有函數可以用是不是可用自行算的 “value12”

value11 =GetField("Volume", "D")[1],

value12 =value11 /  volume[0];     // getfield取得前一日 “日頻率資料”  除以 “盤中即時成交累積量”

=================================================================

問題 4:

 我主要就是要使用單次洗價的功能確認觸發點,是不是如我想的驗證。故可否提供寫法範例,謝謝

 

 您的回答如下:

單次洗價比較偏向於驗證性質,小編會搭配print的語法,在盤後的時候驗證數值是否正確

盤中的時候也會只是判斷當下時點符不符合條件。

=================================================================

問題 5:

使用回測在日頻模式下,

5.1 :資料讀取 是不是以收盤價最後一根1分K往回算(09:00-13:30)有270根1分K,共需讀取 270筆資料,故預設值200

          筆無法包到開盤時的全部資料,我的理解是這樣,不知是否正確 ?

5.2 :資料讀取 若直接選回測當日,是不是就是自動抓取 270筆資料,我的理解是這樣,不知是否正確 ?

 

 您的回答如下:

 取得的數值會依照您的資料讀取筆數而定,向您設定為預設值200,那就會是那一個時點,往前抓兩百筆資料

 =================================================================

 

以下為XS敘述

==============================================================

value1= ((highd(1)-lowd(1)) / closed(2))*100 ;   //前一日振幅

value2 = average(GetField("Volume", "D")[1], 20); //誇頻率取得 20日 Volume 資料
//value2=average(volume,20);

value3 = average(GetField("Volume", "D")[1], 3);  //誇頻率取得 3 日 Volume 資料
//value3=average(volume,3);

Value4 =volume[0];
//Value4 = GetQuote("DailyVolume");

value5 = (GetField("high", "D")[1]); // 誇頻率取得 前1 日 high 資料

Value6 = GetQuote("VolumeRatio");

value7= getquote("pretotalvolume");

if
 
  close >= value5           // 今日中盤後突破前一日高點
   
   and value3 >= 2000   // 3日均量大於等於 2000
  
   and value2 >= 3000  //  20日均量大於等於 1000
 
   and close >= 20      //股價太於20
    
  then ret=1;

 

XQ小幫手 發文於   2020/06/16

Hi JK1234,

問題 1 :在策略跨頻率的寫法  “盤中即時成交累積量”  的獲取是要用 a ? b ? 或者a 與b皆可 ?

a. Value4 =volume[0];

b. Value4 = GetQuote("DailyVolume");

小幫手會用以下語法表示跨頻率的寫法「盤中即時日成交累積量」的獲取

value1 = GetField("成交量","D");

 

問題 2: 延續問題1,在策略跨頻率的寫法下

如果是必需用 b 的getquote 寫法 ,那若用 a 這種寫法得到的資料是什麼?

getquote語法無跨頻率,故不能使用b的寫法。a的寫法「Value4 =volume[0];」不是跨頻率的寫法,以下的寫法才是跨頻率的寫法

value1 = GetField("成交量","D");

問題 3: 盤中如何獲取 “昨量比” 之數值(XQ欄位裡有這個),查不到有函數可以用是不是可用自行算的 “value12”

「昨量比」需自行運算,例如以下範例語法,供您參考,

if GetField("成交量","D")[1] <> 0 then 
    value1 = GetField("成交量","D") / GetField("成交量","D")[1]
else
    value1 = value1[1];

 

問題 4: 我主要就是要使用單次洗價的功能確認觸發點,是不是如我想的驗證。

單次洗價模式,不適合用來確認條件觸發點,適合拿來確認相關運算數值是否正確,例如 EMA 運算出來的數字是不是正確的。

若想要確認觸發點,可以使用回測或者實測功能,搭配 Print 語法去檢驗相關判斷後的數值是否正確,回測部分小幫手猜想您應該已會使用;實測部分,就是在開盤前執行雷達,待收盤後,蒐集 Print 相關數據,再去檢驗其結果是否如您所想,


問題 5:使用回測在日頻模式下。

5.1 :資料讀取 是不是以收盤價最後一根1分K往回算(09:00-13:30)有270根1分K,共需讀取 270筆資料,故預設值 200 筆無法包到開盤時的全部資料,我的理解是這樣,不知是否正確 ?

預設值 200 筆,是指開始日期前的 200 筆 K 棒就開始在跑資料蒐集數據運算,也就是前一日的 10:01~13:29 這 200 根  1 分K 棒已開始在運算,故不會有您擔心的事情發生,可以回測以下的警示腳本範例語法,記得開啟「啟動腳本內的指令」,最後在到查看 Print 檔案,就能釐清癥結點(預設路徑:C:\SysJust\XQlite\XS\Print)

value1 += 1;
print(date,time,value1);

5.2 :資料讀取 若直接選回測當日,是不是就是自動抓取 270筆資料,我的理解是這樣,不知是否正確 ?

如果資料讀取筆數是 200 筆,則會自動抓取「前」200 日的資料,一樣可以用 5.1 的範例語法去查看,

 

以上方向與說明供您參考,謝謝。

 

JK1234 發文於   2020/06/20

小幫手您好,謝謝您的回應,

我又有新的問題請教您

 1. 在 “1分K的頻率” 下抓取 “日K資料” 才叫跨頻率(使用Getfield取得日K資料),若是用GQuote取1分K資料就不算是跨頻率也能正確使用

    ,這樣理解是否正確 ?

2. 在 “1分K的頻率下,我要判斷開盤09:01~09:05,前5根 1分K,我的問題是我的XS觸發點是要計數到第5根1分K就開始判斷 K[0], K[1], K[2]

     K[3], K[4 ] 或者 是第6根才觸發去抓 K[1], K[2], K[3,] K[4], K[5] ?

      2.1 目前我不確定是第5根1分K open 價時就觸發或者是 有close 價才觸發 ?所以才會問您是用 第5根1分K就開始判斷

      2.2 或者要用第6根1分K 去觸發抓 K[1], K[2], K[3,] K[4], K[5] ?

3. 我在新寫XS敘述裡 1分K頻率裡宣告 抓取 Value4 = GetQuote("DailyOpen");  ,我的理解是我抓到的是當日 日K的 開盤價,這樣是否正確

    ?

    3.1XS敘述裡 1分K頻率裡宣告 抓取 Value8 = GetField("Volume","D"); ,我的理解是我抓到的是當日觸發點 日K的 成交量累積值,這樣是

    否正確(我使用第6根K觸發,故這裡Value8 是不是第是第 1至第6根 的成交量累積值) ?

    3.2 在 1分K頻率 Volume 是成交累積量 ?還是個別K線的成交量 ?

    3.3 若在此XS述途裡 引用 open[0] 是不是就是第6根1分K的 open價 ? 而 open[1] 則是第5根1分K的 open價

                   以上問題,靜待回覆

 

============================================================================

Value3 = GetField("close","D")[1];    //前一日收盤價 (value3)

Value5 = GetField("open","D")[1];     //前一日開盤價 (value5)

Value4 = GetQuote("DailyOpen");       //取得當日開盤價 (value4)
//value4 = Getfield("open");            //取得當日開盤價 (value4)

Value6 = GetField("high","D")[1];     //前一日最高價 (value6)

Value7 = highest(GetField("high","D")[1],20) ;   //20日內的最高價 (value7)

Value8 = GetField("Volume","D");       //取得當日查詢的總成交量

//settotalbar(5);

if barfreq <> "Min" or barinterval <> 1 then raiseruntimeerror ("本腳本僅適用1分鐘線");

variable:KBarOfDay(0);

if date<>date[1] then KBarOfDay=1 else KBarOfDay+=1 ;

if KBarOfDay=6 then

begin

value1 = highest(high[1],5) ;                //取前5根一分K的最高價(09:01 ~ 09:05)


end;

if value1 < value4                           //前5根一分K的最高價(value1)要 小於 今日的開盤價(value4)

  and  value4 * 100 >= value3 *100.4           //今日的開盤價要 大於 前一日收盤價 0.4% 以上
 
  and  value4 * 100 <= value3 *102.6           //今日的開盤價要 小於 前一日收盤價 2.6% 以下
 
  and value1 * 98.6 > close[1] *100           //第6根一分K觸發程式執行時(用第6根的收盤價計算)此時價格需小於 (value1:前五根一分K的最高價) 的 1.4%

  and value8 >= 300                          //觸發程式執行時成交量要有300張
 
  and value4 > value3                       //今日的開盤價(value4) 大於 前一日收盤價(value3)
 
   then Ret=1;

============================================================================

XQ小幫手 發文於   2020/06/22

Q1:在 “1分K的頻率” 下抓取 “日K資料” 才叫跨頻率(使用Getfield取得日K資料),若是用GQuote取1分K資料就不算是跨頻率也能正確使用,這樣理解是否正確?

A1:不建議使用 GQuote 取資料做任何運算,原因是 GQuote 報價欄位無法回測。GQuote 只能取得最新的資料,無法跨頻率。

 


 

Q2:在 “1分K的頻率下,我要判斷開盤09:01~09:05,前5根 1分K,我的問題是我的XS觸發點是要計數到第5根1分K就開始判斷 K[0], K[1], K[2],K[3], K[4 ] 或者 是第6根才觸發去抓 K[1], K[2], K[3,] K[4], K[5] ?

A2:小幫手會使用第五根結束、第六根開始成長時,去抓 K[1], K[2], K[3,] K[4], K[5]  來運算,供您參考,

 


 

Q3:我在新寫XS敘述裡 1分K頻率裡宣告 抓取 Value4 = GetQuote("DailyOpen");  ,我的理解是我抓到的是當日 日K的 開盤價,這樣是否正確?

A3:不建議使用 GQuote 取資料做任何運算,原因是 GQuote 報價欄位無法回測。1分K頻率裡撰寫 Value4 = GetQuote("DailyOpen");  表示,value4 抓到的是當日 日K的 開盤價。

 


 

Q3.1XS敘述裡 1分K頻率裡宣告 抓取 Value8 = GetField("Volume","D"); ,我的理解是我抓到的是當日觸發點 日K的 成交量累積值,這樣否正確(我使用第6根K觸發,故這裡Value8 是不是第是第 1至第6根 的成交量累積值) ?

A3.1:如果是在第六根K棒結束時,在 1分K頻率裡宣告 抓取 Value8 = GetField("Volume","D");  則 Value8 是第 1至第6根 的日成交量累積值,以上方向供您參考。

 


 

Q3.2 在 1分K頻率 Volume 是成交累積量?還是個別K線的成交量?

A3.2 在 1分K頻率 Volume 是個別K線的成交量。

 


 

Q3.3 若在此XS述途裡 引用 open[0] 是不是就是第6根1分K的 open價 ? 而 open[1] 則是第5根1分K的 open價

A3.3 open[0] 為當前1分K的 open 價;open[1] 則是前一根1分K的 open 價。

JK1234 發文於   2020/06/23

Q2:在 “1分K的頻率下,我要判斷開盤09:01~09:05,前5根 1分K,我的問題是我的XS觸發點是要計數到第5根1分K就開始判斷 K[0], K[1], K[2],K[3], K[4 ] 或者 是第6根才觸發去抓 K[1], K[2], K[3,] K[4], K[5] ?

A2:小幫手會使用第五根結束、第六根開始成長時,去抓 K[1], K[2], K[3,] K[4], K[5]  來運算,供您參考,

 

 

Q1: 小幫手您好~~使用第六根K的觸發點是第六根K的open or close 觸發 ?

Q2:一分K的生成是open就形成還是到close 才算是一根K線的才完成?(此問題是下方XS敘述,KBarOfDay=6 時第六根K的觸發點是open 還是 close ?

if date<>date[1] then KBarOfDay=1 else KBarOfDay+=1 ;

if KBarOfDay=6 then

 

 

XQ小幫手 發文於   2020/06/29

Hi JK1234,

Q1: 小幫手您好~~使用第六根K的觸發點是第六根K的open or close 觸發 ?

端看您的策略決定,不過如果是小幫手的話,會比較傾向用第六根的open,因為個人認為這個點位比較好用語法抓。


 Q2:一分K的生成是open就形成還是到close 才算是一根K線的才完成?

A2:當下的這一分K若有Open,則前一分K的K線才算成長完成。

 

以上說明與方向供您參考,謝謝。

發表回覆
Close