語法轉換的問題

  •   158 
  • 最後發表   NICK TZ  2022 五月 06
NICK TZ 發文於   2022/04/23

您好

因上一則文章您提到在五分鐘逐筆回測的部分實際上並不是真正的逐筆 而是改為一分k跑一次

一直以來以為回測逐筆與實際逐筆相同,因此相信回測資訊下去進行程式交易

但報酬率總與回測有許多了落差 關於虧損就先不談了

我想問在我的警示設定中基礎及回測結果要如何做到相符

有幾個語法想要請教 下面幾個語法目前是5分鐘k棒 有什麼方法可以改為1分鐘k棒呢?

 getsymbolfield("tse.TW", "Close","5")[1]  前1~5分鐘 以此類推

 getsymbolfield("tse.TW", "Close","5")[2] 前6~10分鐘

volume[1]

volume[2]

psy(1)

psy(2)

volume[1]+volume[2] 前1~10分鐘總和 

 

我試著將其改為

average(getsymbolfield("tse.TW", "Close","1")[1],5

average(getsymbolfield("tse.TW", "Close","1")[6],5

average (volume[1],5)*5)

average (volume[6],5)*5)

psy(5)

psy(10)

average (volume,10)*10)

但1分k回測跑不出東西

依照xq的邏輯五分逐筆回測實際上是改為一分不逐筆

那麼我在實際執行時調整為一分不逐筆 實際執行與回測應該除了滑點之外就不會有差異

還有幾個語法也勞煩指導

k_Value(25,3)

k_Value(25,3)[1]

麻煩協助克服"逐筆回測"與實際"逐筆執行"之前的差異

目前會遭遇實際執行有進行交易 回測卻都沒有

如果兩者不能合致 那回測或者逐筆就沒有意義

排序方式: 標準 | 最新
XQ小幫手 發文於   2022/04/29

Hello NICK TZ,

 

小幫手不太懂您所謂的5分鐘K棒改為1分鐘K棒是什麼意思。

getsymbolfield("TSE.TW", "Close","5")[1] => 這取得的是前一根 TSE.TW 5分鐘頻率的收盤價。

getsymbolfield("tse.TW", "Close","5")[2] => 這取得的是前前根 TSE.TW 5分鐘頻率的收盤價。

 

舉例來說,現在是 11:18。

getsymbolfield("TSE.TW", "Close","5")[1] 會取得 11:10 ~ 11:15 的收盤價。(不是11:13~11:18的收盤價)

getsymbolfield("TSE.TW", "Close","5")[2] 會取得 11:05 ~ 11:10 的收盤價。(不是11:08~11:13的收盤價)

 

如果您使用在5分鐘頻率的話,volume就會是5分鐘Bar的成交量。

一樣是11:18的話。

volume => 11:15 ~ 11:18 的成交量

volume[1] => 11:10 ~ 11:15 的成交量

volume[2] => 11:05 ~ 11:10 的成交量

 

需注意 [n] 對應的是 前n根Bar的資訊,不是往回多少時間。

您在5分鐘逐筆洗價跟非逐筆洗價,[1]會取得的都會是上一根5分鐘Bar的資訊。

不會因為逐筆洗價而導致取到上1分鐘Bar的資訊。

 

average(getsymbolfield("tse.TW", "Close","1")[1],5)  => 這計算的會是前5根 TSE.TW Bar的收盤價平均

average (volume[1],5)*5) => 這計算的會是前5根成交量的平均

您用在甚麼頻率上,就是用該頻率的數值來計算,是否有逐筆洗價都是相同的。

因為是用已經完成的K棒 ([1])。

 

小幫手建議您可以使用print搭配date, currenttime 就可以觀察回測逐筆和非逐筆是如何運作的。

 

1分鐘非逐筆跟5分鐘逐筆是有差別的,一個取用的是1分鐘的K棒,一個取用的是5分鐘Bar。

假設是在 111800 這個時間點好了。 (XQ的time是以開始的時間為標記)

1分鐘非逐筆的Bar會是 11:18 ~ 11:19 的資訊。

5分鐘逐筆會是 11:15 ~ 11:19 的資訊。

 

k_Value 您在使用上有什麼問題麻煩敘述的更詳細些,小幫手才知道該如何回覆。

 

教學區內的文章有解釋XQ是如何運作的,建議您可以閱覽裡面的資訊。

NICK TZ 發文於   2022/05/02

hi 小幫手

我想應該是我表達不清楚

重新整理我的理解是否正確

貴公司的軟體再回測與雷達的功能

[同樣勾選頻率5分鐘逐筆,"回測"的條件實際是否是"以1分K進行一次"與"策略雷達"中的"真正的逐筆交易"不同]

上述是之前您在別的貼文中回覆

如果是這樣沒錯,目前所設定的策略是以"回測中的5分鐘逐筆"再做設計再投資的立場當然希望"實際執行會是跟回測結果相符"

但因貴司系統在同樣名稱"逐筆交易"但是在"回測"與"雷達"上的表現差異甚巨

造成長久以來回測與雷達執行不能相符

因此在系統造成的差異之下要如何重新編譯才能夠在貴司系統上令回測與實際執行相符

依據您上面的描述我想要達成下面的條件 但改由1分k去編寫要如何去調整呢?

如果您使用在5分鐘頻率的話,volume就會是5分鐘Bar的成交量。

一樣是11:18的話。

volume => 11:15 ~ 11:18 的成交量

volume[1] => 11:10 ~ 11:15 的成交量

volume[2] => 11:05 ~ 11:10 的成交量"

 

 

NICK TZ 發文於   2022/05/02

 

小幫手您好 這是您之前的回覆

所以我現在要將"回測中的五分鐘逐筆"交易條件在"雷達中調整為一分鐘不逐筆"

我目前得到的訊息理解是"五分鐘逐筆回測"等於"一分鐘不逐筆回測"等於"一分鐘不逐筆交易"

現在會用到的語法如下

(volume[2]+volume[3])/2)>((volume[2]+volume[3]+volume[4])/3)

high[9]+low[9]+close[9])/3)*volume[9]

 (psy(8)-psy(20)

time>080500 and time<130500 

(high[2]+high[3]+high[4])+(low[2]+low[3]+low[4]))/2)/5)>((low[2]+low[3])

time=132500

上述幾種寫法在回測中用五分鐘逐筆與將[x]*5並改為一分k不逐筆結果差很多

想請教小編如何編譯

 

 

XQ小幫手 發文於   2022/05/06

Hello NICK TZ,

 

小幫手認為不是您表達不清楚,而是您沒有理解小幫手說的回測中 5分鐘逐筆以1分K模擬 的意思。

 

5分鐘逐筆 不等於 1分鐘非逐筆,兩者只有 "1分鐘運算一次" 這點相同,這很重要。

 

5分鐘逐筆只是每分鐘執行一次,但所運用的資料還是5分鐘頻率的Bar,在該5分鐘Bar未完成時,是用1分鐘Bar的資訊組合起來的。

1分鐘非逐筆一樣是每分鐘執行一次,但運用的資料是1分鐘頻率的Bar。

您可以實際測試一下 print(date, time, currenttime, open, high, low, close); 在 5分鐘逐筆 和 1分鐘非逐筆 上,就比較容易理解。

 

將在一分鐘非逐筆的狀況下使用 [x]*5 這種作法並不會讓您的資料頻率變成5分鐘頻率,您要取用5分鐘頻率的資料,請使用GetField。

把volume 改為 GetField("Volume", "5")

high => getfield("High", "5")

low => getfield("Low", "5")

close => getfield("Close", "5")

PSY 由於沒有跨頻率,所以您需要自行複製內建函數腳本修改。

舉例來說:

input: Length(numeric);

PSY = 100 * CountIf(Close > Close[1], Length) / Length;

將裡面的 close 改為 getfield("Close", "5"),所以就會是:

100 * CountIfgetfield("Close", "5")> getfield("Close", "5")[1], Length) / Length;

發表回覆
Close