我想寫一個自動交易腳本
請問如何在五分k的頻率中,
引用一分k頻率的開高低收值?
五分頻率抓一分頻率可以用getfield來指定頻率,舉例要抓前3分鐘收盤價就可以用getfield("close","1")[3],特別要注意的是已完成的K棒和未完成的K棒都要從最新的時間往前算3分鐘。
Hello Tim0511,
小幫手補充,XQ的時間是以Bar開始的時間作註記。
所以5分鐘頻率 090000 代表著 09:00 ~ 09:05 這段時間的資料。
與這根Bar相對應的1分鐘Bar會是 090000, 090100, 090200, 090300, 090400。
其中如果在5分鐘Bar完成後執行的話,getfield("close","1") 取得的會是 090400 這根Bar的資訊。
若是在 09:03:20 的時候執行的話 (逐筆洗價),getfield("close","1") 取得的會是 090300 這根Bar的資訊。
另外,所有頻率的當期close都會是相同的,因為都會是最新一筆成交價。
您可以搭配使用 print 函數,將1分鐘對應的時間日期一併print出來,會比較容易理解XQ運作的方式。
不好意思,我寫出來的結果不是我要的,可能我還不太了解。
假設A指標是運用在1分頻率中,B指標是運用在5分頻率中
我是要在B指標中去取得A指標的值。
所有頻率的當期close都會是相同的,因為都會是最新一筆成交價。
在1分的頻率中要抓5分頻率的開高收低,
其中收盤的部分假設
Close5in=getfield("close","5")
但是我如何抓取前一根5分k的收盤價?
Close5min[1],出來的還是1分鐘K棒的前一根收盤價。
因為我的條件會用到5分K的close>close[1]
getfield("close","5")[1] 就可以抓前一根五分K
但是在一分鐘的頻率中,是一分鐘跑一次
getfield("close","5")[1]的值是每分鐘在變動
這樣在1分鍾計算出來的訊號就跟5分鍾計算出來的訊號不一樣
...Close5min[1],出來的還是1分鐘K棒的前一根收盤價。
...
感覺你遇到的情況跟我在 跨頻率布林通道計算問題 問的類似。
XS 這裡用了一個不好理解的方式去實作變數 [1] ,一般我們理解給一個變數塞值的時候,就會預期那個變數控制的內容是不變的。但實際上 XS 的變數內容有跨頻率的問題,所以當你想要針對變數取前一個值,實際上你是用當前頻率去取值,導致使用者很容易誤以為這個方式是直接操控指定頻率的值。
以你的舉例 Close5min = GetField("close", "5") 來說,你預期 Close5min[1] 會是 GetField("close", "5") [1],但實際上 XS 在跑的時候你是用一分K跑這個腳本,所以 Close5min[1] 實際是去拿前1分K的時候 GetField("close", "5") 是多少,並不是你預期的 GetField("close", "5") [1]
btw 就算理解了這點,我也遇到跟你相同的問題且沒有成功解決。
當時嘗試用15分或30分K頻率的布林通道上下緣當成進出場點,但實際腳本想用1分或5分K頻率去判斷是否形成黃金或死亡交叉,卻怎樣都無法在1分或5分K取到預期的布林通道上下緣數值,上下緣數值怎麼取都有偏移量,而且隨著時間越長,偏移越大。拉長 setBarBack、setTotalBar 的區間也沒有
Hello Tim0511,
變數是跟著執行頻率在動。
如果執行在1分鐘頻率上:
getfield("close","5")[1] 會是前一跟5分鐘Bar的收盤價。
value1 = getfield("close","5");
value1[1] 會是前一跟1分鐘Bar那時所取到的5分鐘Bar收盤價。
所以舉例來說,如果您要計算5分頻率的10MA的話,那麼就會是 average(getfield("Close", "5"), 10)。
這樣就是抓最近10根5分鐘Bar來計算平均。
value1 = getfield("Close", "5");
average(value1, 10) 則會是最近10根1分鐘Bar value1 的平均。
Hello iker,
小幫手不知道您是怎麼作的,不過布林通道跨頻率可以這樣寫:
BollingerBand(getfield("Close", "30"),20,2)
這樣用在1分鐘上就會計算出30分鐘頻率的布林通道。
附圖裡可以看到相同的時間點,30分鐘頻率和1分鐘頻率計算出的值是會相同的。
感謝 musashi 和 iker 的熱心回覆。
8 評論