跨頻率布林通道計算問題

  •   1K 
  • 最後發表   iker  2023 一月 11
iker 發文於   2022/07/15

我用以下寫法執行跨頻率布林通道運算,腳本頻率為1分K,欲計算的是15分K的布林通道,想做1分K價格穿越15分K布林通道上下緣進場的策略回測:

input: BOLLINGBANDPERIOD(20, "布林通道期數");
input: BOLLINGBANDRANGE(2.8, "上下寬度");

var: bollingBandUp(0); // 布林通道上緣
var: bollingBandDown(0); // 布林通道下上緣

bollingBandUp = bollingerband(xfMin_GetValue("15", close, 1), BOLLINGBANDPERIOD, BOLLINGBANDRANGE);
bollingBandDown = bollingerband(xfMin_GetValue("15", close, 1), BOLLINGBANDPERIOD, -1 * BOLLINGBANDRANGE);
print(DateToString(date), TimeToString(time), "bollingBandUp", NumToStr(bollingBandUp,2), "| bollingBandMA20", NumToStr(Average(xfMin_GetValue("15", close, 1), 20),2), "| bollingBandDown", NumToStr(bollingBandDown,2), "| close", NumToStr(close,0), "| xfMin_GetValue('15', close, 1)", NumToStr(xfMin_GetValue("15", close, 1),0));

但回測結果print出來,發現使用 xfMin_GetValue("15", close, 1) 取到的值雖然是正確的,但透過布林通道公式換算出來的結果有明顯的偏差:

同樣腳本如果是執行15分K的話,就能確實計算出與技術分析線圖相同的布林通道數字:

請問為什麼跨頻率明明取得正確的收盤價,卻沒有辦法計算出正確的布林通道數字呢?

查過 xf 系列也沒有布林通道的專用計算語法,是哪個設置有問題嗎?

  • 按讚來自於
  • alf
排序方式: 標準 | 最新
蕎伊斯 發文於   2022/07/15

你先檢查看看跨頻運算的資料長度是否足夠,在1K頻率加上這行試試

setBackBar(60, "15");//程式所需3倍運作資料寬度

 

 

iker 發文於   2022/07/16

測試過了,加上 setBackBar(60, "15") 之後

用 xfMin_GetValue("15", close, 1) 結果是:

用 xfMin_GetValue("15"close0) 結果是:

看起來都跟 15分K 計算出來的數字差很多

XQ小幫手 發文於   2022/07/21

Hello iker,

 

BollingerBand 第一個參數要的是數列,應該是要使用 getfield("Close", "15") 才對。

xfMin_GetValue 是當您想取不同頻率變數的資料時才使用的。

您的腳本應該修改為

input: BOLLINGBANDPERIOD(20, "布林通道期數");

input: BOLLINGBANDRANGE(2.8, "上下寬度");

 

var: bollingBandUp(0); // 布林通道上緣

var: bollingBandDown(0); // 布林通道下上緣

 

bollingBandUp = bollingerband(getfield("Close", "15"), BOLLINGBANDPERIOD, BOLLINGBANDRANGE);

bollingBandDown = bollingerband(getfield("Close", "15"), BOLLINGBANDPERIOD, -1 * BOLLINGBANDRANGE);

這樣 xfmin_getvalue("15", bollingBandUp, 1) 取得的就會是上一根15分鐘Bar的資訊。

附帶一提 xfmin_getvalue("15", bollingBandUp, 0) 取得的數值應該是根 bollingBandUp 是相同的,因為最新的資料(收盤價)不論是哪個頻率都是相同的。

iker 發文於   2022/07/21

感謝小幫手,我改用 GetField("收盤價", "15') 試試

不過如您說明「 xfMin_GetValue是當您想取不同頻率變數的資料時才使用的。」,我看完 xfMin 系列函式說明原本認知也是這樣,所以才想說跨頻率是否應該使用這個方式獲取資料,沒有想到跨頻率應該還是要直接使用 GetField 來拿。

不曉得 xfMin_GetValue 的用意是不是比較局限於在其他頻率額外做運算後的結果值(如您舉例的xfmin_getvalue("15", bollingBandUp, 1))? 如果是的話,希望能在 xf 或 xfMin 系列說明 裡更明確解釋什麼情境才應該用到這兩種,避免有其他用戶也誤會這個用法。

iker 發文於   2022/07/21

小幫手,我實際改用 GetField("收盤價", "15") 之後,在其他程式碼不變的情況下嘗試跑1分K回測,無論是選擇逐筆或非逐筆,反而都會出現回測異常...

(就算能跑出回測結果,進出場次數也是 0 次)

iker 發文於   2022/07/22

昨晚試了幾種方式,都無法正確在1分K計算出當下15分K的布林通道上下緣(無論是每分鐘print一次還是每15分鐘print一次都對不上)

能不能麻煩小幫手提供一段程式碼是能在交易策略回測時(逐筆/非逐筆都可以),能在每一分K計算布林通道時都print出當前15分K的布林通道上下緣呢?

感謝您

XQ小幫手 發文於   2022/07/29

Hello iker,

 

xfMin_GetValue 是用來取得 變數 在特定頻率下的前期值。

這一般來說是用來取得單一數值,而非數列。

如果您要在執行1分鐘頻率下的腳本中取得其他頻率之前某根Bar (ex. 前1根Bar) 的變數數據的話,可以使用 xfMin_GetValue。

因為 value1[1] 會是前1根1分鐘Bar的value1資料,而 xfMin_GetValue("15", value1, 1) 會是前一根15分鐘Bar的 value1資料。

您可以實際測試上面連結中的範例,會比較容易懂。

 

GetField 取得的是特定頻率的 數列資料 ,所以若您要運算不同指標之類的函數的話,都是使用此函數。

舉個簡單例子:

value1 = getfield("Close", "15");

value2 = xfmin_getValue("15", value1, 1);

value2 會和 getfield("Close", "15")[1] 相等,但 value2[1] 和 getfield("Close", "15")[2] 是不會相等的。

 

由於您並沒有提供完整腳本,所以小幫手自行增加了買進賣出條件作回測,可以正常執行。(參考附圖)

如果還是問題的話,麻煩提供 完整腳本 以及 回測設定(截圖亦可)。

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

感謝。

 

 

附加文件

iker 發文於   2023/01/09

Hi 小幫手

因為這題後來嘗試了幾次還是不知道怎麼做才對,想延續著問一下幾個問題:

1. 請問 xf 跟 xfMin 是不是都不支援期貨近月全日盤?

2. 我原本的布林通道是想做到透過執行頻率 1 分K來提高「在 15 分K畫完之前,滿足布林通道條件就進場」訊號的敏感度,避免實際收盤並沒有超過當期的 15 分K 布林上下緣就觸發。等於進場條件參考的布林通道數值是需要即時運算的,想知道有什麼方式可以準確算出這個值呢?我怎麼調整都無法達成與 15 分K 圖上的布林通道相似的情況,不知道能否使用我原問題中的腳本語法,提供一個寫法參考的範例?

感謝!

XQ小幫手 發文於   2023/01/11

Hello iker,

 

1. 是的,如果您查詢相關函數的話上面有備註:商品類型僅支援台股。不支援XS選股、XS選股自訂排行與XS選股回測。

 

2. 上面的範例鐘就可以計算15分鐘頻率的值。(參考附圖)

另外小幫手不懂您所謂的 在 15 分K畫完之前,滿足布林通道條件就進場 要怎麼 避免實際收盤並沒有超過當期的 15 分K 布林上下緣就觸發。

就算您使用1分鐘頻率並觸發了,在15分鐘的Bar還沒結束前,收盤價與通道的值都還是會改變。

在最新一根Bar上的值,1分鐘頻率和15分鐘頻率會是相同的。

舉個簡單的例子,如果您的條件是 收盤價大於上通道的話 (close >= bollingBandUp),那麼15分鐘逐筆洗價的狀況下會和1分鐘逐筆洗價同時觸發 (只要腳本有同時運算的話)。

 

至於 1分K價格穿越15分K布林通道 的範例的話,首先你要決定的是要:

前一根1分鐘Bar的收盤價小於/大於 [前一根15分鐘Bar的15m布林通道/前一根1分鐘Bar的15m布林通道],當下這根1分鐘Bar的收盤價大於/小於 [前一根15分鐘Bar的15m布林通道/前一根1分鐘Bar的15m布林通道]。

如果是前一根1分鐘Bar的15m布林通道,那麼直接使用 cross over / cross under 就可以了。

 

若是前一根15分鐘Bar的15m布林通道的話,您可以用變數來保存上一根15分鐘Bar的值。

舉例來說:

 

value1 = getfield("Time", "15");

if value1[1] <> value1 then begin   //兩者不同的時候表示15分鐘頻率換Bar

    value2 = bollingBandUp[1];      //前一根15分鐘Bar的上通道

    value3 = bollingBandDown[1];    //前一根15分鐘Bar的下通道

    end;

 

condition1 = close[1] < value2 and close >=  bollingBandUp;  //向上跨越上通道

condition2 = close[1] > value3 and close <= bollingBandDown;  //向下跨越下通道

iker 發文於   2023/01/11

好的,我再試試看

謝謝小幫手

發表回覆
Close