股價突破近N日高點,XS語法這樣寫是否正確

  •   1.3K 
  • 最後發表   Tofu  2023 六月 28
Tofu 發文於   2023/06/10

問題一:

如題,想寫一個警示的語法在策略雷達使用,想要股價盤中突破前4根日K股價高點時啟動,如下

value1 = highest(GetField("High", "D")[1], 4);

if close > value1 then ret = 1;

請問這樣寫正確嗎?

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

問題二:如果想將警示意思改成盤中股價突破近4日「實體K」高點,改成這樣子寫

value1 = highest(GetField("open", "D")[1], 4);

value2 = highest(GetField("close", "D")[1], 4);

if close > value1 and close > value2 

then ret = 1;

想請問以上兩個寫法否正確呢?或是有更精簡的寫法呢~

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

問題三:

如果是以上這兩個寫法,那在雷達的「資料讀取」部分,是不是不用設定太多筆數,比如我只要設個5筆就好?因為第一項Getfield是固定的值而且頻率是日K,不需要即時運算那麼多根K棒。還是說因為我這個雷達需要用1分K來執行,所以要抓前四天所有1分K的資料他才有辦法運算,也就是我資料讀取要設定至少5天的1分K總量呢?

以上3個問題,不知道理解是否正確,謝謝大家了!

 

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

 Hello Tofu,

 

close > value1 這樣會是當價格大於前4根日K股價高點時都會符合。

如果是要突破的話用 cross over 或是 xfMin_CrossOver 會比較適合。

 

close > value1 and close > value2 可以改為 close > maxlist(value1, value2)。

 

您發文的寫法因為沒有用到前期值,所以資料讀取筆數可以設為1筆或是近幾筆即可。

但因為有用到前4日的資料,所以讀取筆數需要設為日頻率4筆以上,或是換算成分鐘頻率所需的筆數長度。

關於 資料讀取筆數 和 資料引用筆數 可以參考 資料讀取範圍與腳本執行的關係 裡的說明。

Tofu 發文於   2023/06/12

謝謝小幫手,經您的建議,我修正如下

1.

value1 = highest(GetField("High", "D")[1], 4);

if close cross Above value1 then ret = 1;

2.

value1 = highest(GetField("open", "D")[1], 4);

value2 = highest(GetField("close", "D")[1], 4);

if close cross Above maxList(value1, value2) then ret = 1;

以上這樣應該可以對嗎?用cross over/above的話,好處是穿越過了後,不會再每一根K棒重複觸發對嗎?不然用原本大於的話,即使股價一路突破上去,每根K棒訊號可能都會觸發一次

 

另外關於讀取筆數,所以如果我是設定1分K頻率,那就必須設定(每天有4個半小時,共270根1分K)所以至少要270x4=1080筆對嗎?

如果用頻率用5分K,那就要設定54x4=216筆(一天有54根5分K)

但如果是有種情況是當天已經1點多了才觸發,但以當時的K棒往回算4天份,可能會抓不到4天前第一根日K棒的數值?所以我讀取筆數要連同當日一起設定進去一共5天份嗎?比如1分K的話就是要270x5=1350筆這樣

不曉得我這樣的表達有沒有清楚,謝謝小幫手了!

 

 

 

 

XQ小幫手 發文於   2023/06/13

 Hello Tofu,

 

是的,cross over 是突破的那根Bar才會觸發,不像大於容易持續觸發。

 

highest 需要的是資料引用筆數不是資料讀取筆數。

您需要的是引用足夠長度的筆數 (setbackbar(5, "D");),而不是需要設定1080筆的資料讀取筆數 (當然這樣設定也會有足夠的引用筆數)。

 

資料讀取筆數 是在腳本有用到變數的前期值的時候,為了確保有足夠長度的變數資料 (變數要腳本有運算才會有值),因此需要特別設定。

您腳本中的狀況由於會使用到 value1 和 value1 的前期值,所以會是1筆。

若您使用 xfMin_CrossOver 且用日頻率的話,才會需要到 270 根Bar。(包含前一天收盤的資料)

Tofu 發文於   2023/06/18

謝謝小幫手,所以我將語法修改如下:

1.

setbackbar(5, "D");

value1 = highest(GetField("High", "D")[1], 4);

if close cross Above value1 then ret = 1;

2.

setbackbar(5, "D");

value1 = highest(GetField("open", "D")[1], 4);

value2 = highest(GetField("close", "D")[1], 4);

if close cross Above maxList(value1, value2) 

then ret = 1;

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

然後資料「讀取」筆數只要選擇1筆也可以,因為「引用」的部分已經由setbackbar這個先抓入前五天日K級別的資料了對嗎

而這個雷達,不管我用1分K、5分K、30分K之類的下去跑,基本上都不會影響觸發結果

差別在於訊號啟動的時間是在各指定頻率收K的瞬間,而如果我選逐筆洗價,則是會往下一個級別去做判定,比如頻率1分K,則逐筆洗價的結果會每個tick出來電腦會多判斷一次,有符合就觸發,這樣對嗎?

最後謝謝小幫手耐心解釋,學到很多!

XQ小幫手 發文於   2023/06/20

 Hello Tofu,

 

是的,資料讀取筆數只要設為1筆,確保腳本可以比較 cross above 即可。(當然設長一點也不會有影響,就是多算幾筆)

至於逐筆洗價的話,即時的狀態下不論什麼頻率都是商品有洗價 (交易) 時腳本就會運算。(快市時可能多筆洗價腳本才運算一次)

而回測的話則是1分鐘頻率用 OHLC,其他頻率用1分鐘頻率來模擬。

 

網站上有教學區,裡面有XS語法的基礎和應用可以閱覽。

Tofu 發文於   2023/06/28

謝謝小幫手,學到很多!

發表回覆
Close