警示時間&回測&腳本編譯

  •   464 
  • 最後發表   NICK TZ  2022 五月 27
NICK TZ 發文於   2022/04/25

您好

目前執行的腳本是以五分鐘編寫,因應逐筆回測實際並非真正逐筆而是一分鐘 所以重新撰寫

但兩者回測(五分鐘逐筆/一分鐘不逐筆)同樣時間績效(購買時間及次數)還是不同

(依照小編的說法應該要能夠相同/回測中五分鐘逐筆等於一分鐘執行一次) 

也或許是我編譯語法轉換沒有成功

因此想請教是否有其他設定 在不更改腳本的情況下 可以用五分鐘的腳本[Barinterval=5]

用一分鐘的雷達執行讓回測與實際執行相符

累計了許多問題 再麻煩小編

謝謝

排序方式: 標準 | 最新
NICK TZ 發文於   2022/04/26

嗨  小編

現行腳本5分K

((high[5]+low[5]+close[5])/3)*volume[5]

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

改為1分K請問如何撰寫

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

Hello NICK TZ,

 

五分鐘逐筆 和 一分鐘不逐筆 並不相同。

五分鐘逐筆是每分鐘運算一次腳本,但使用的還是5分鐘頻率的資料。

而一分鐘不逐筆雖然也是每分鐘運算一次腳本,但使用的會是1分鐘頻率的資料。

舉例來說:

五分鐘逐筆 在 9:03 運算時使用open的話,取得的會是 09:00 開始的價格。(該根5分鐘Bar的開始價格)

而一分鐘不逐筆其得的會是 09:03 開始的價格。(該根1分鐘Bar開始的價格)

如果您在一分鐘不逐筆使用Getfield("Open", "5") 的話,就會和五分鐘逐筆一樣,取得 09:00 開始的價格。

 

所以您下面的範例,如果要使用在1分鐘頻率上的話,那麼應該要用 GetField 取得所需頻率 (5分鐘)。

((getfield("High", "5")[5] + getfield("Low", "5")[5] + getfield("Close", "5")[5]) / 3) * getfield("Volume", "5")[5]

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

運算出來的結果就會和5分鐘頻率逐筆洗價的結果相同。

NICK TZ 發文於   2022/05/06

謝謝小幫手

經過測試

"((getfield("High", "5")[5] + getfield("Low", "5")[5] + getfield("Close", "5")[5]) / 3) * getfield("Volume", "5")[5]"這個部分是沒問題的

"getsymbolfield("tse.TW", "Close","5")[5]"但這裡還是沒辦法一致

另外請教psy(10)的轉換語法

 

謝謝

 

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

Hello ,

 

小幫手這邊用 print(date, time, currentTime, getsymbolfield("tse.TW", "Close","5")[5]); 測試在5分鐘逐筆以及1分鐘非逐筆上,兩者currenttime相同時取得的資訊會是相同的。

您可以實際print出來比較,或是改用指標腳本直接畫在圖上。

需要麻煩您告知您是如何使用讓小幫手研究。

 

PSY內建函數如下:

input: Length(numeric);

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

您只需要改成您要的頻率即可,舉例來說5分鐘頻率的話:

input: Length(numeric);

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

 

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

NICK TZ 發文於   2022/05/11

哈瞜 小幫手

我這邊測試的方法是

一分鐘不逐筆

if getSymbolField("tse.TW", "Close","5")>getfield("close", "5")

then ret=1;

 

五分鐘逐筆

if getsymbolfield("tse.TW", "Close","5")>close then 

 ret=1;  

出場

if time=133000 then

用指數測試

同樣區間結果不相同 ret=1;

NICK TZ 發文於   2022/05/11

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

編譯時說Length 在警示上跟指標型態不同

我是需要用在警示上

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

Hello NICK TZ,

 

您出場腳本的time在5分鐘頻率會回傳該根Bar開始的時間,所以133000會在13:30~13:35 這段時間內都符合因此連續觸發。

建議您可以改成 getfield("Time", "1") 或 currenttime,且5分鐘頻率出場時也需要用逐筆洗價,兩者就會相同。

附上回測報告供您參考。

 

input: Length(numeric);

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

這只能用在函數腳本上。

 

如果您不想寫函數腳本想直接撰寫在警示或指標腳本的話,可以這樣寫:

input: Length(10);

var: _psy(0);

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

 

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

附加文件

NICK TZ 發文於   2022/05/17

hi 小幫手

感謝您的指導 

我將出場條件改為

 

if getfield("Time", "1")=133000 then

 ret=1;  

兩者還是不同 測試如附件資料

 

如果關於psy要編譯的條件

在同樣回測條件五分鐘逐筆要等於一分鐘逐筆

if (psy(20)-psy(40))/psy(40)>=0.8

要如何轉換呢?

 

 

 

附加文件

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

 Hello NICK TZ,

 

關於兩者不同的部分,小幫手確認後進場時間和價格應該是相同的,但算出的報酬率卻有差別,這邊會請工程師確認。

 

關於psy計算的部分,如同小幫手上面所說,您可以固定使用getfield("Close", "5")來撰寫 psy "函數" 腳本,或是用上面範例中的 _psy 來計算 20 期和 40 期的5分鐘頻率psy。

附上範例的指標腳本供您參考,您只要改使用 PSY_5min 即可。

 

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

NICK TZ 發文於   2022/05/21

感謝小幫手

psy的部分我再試試看

兩者不同的部分我去進逐筆看過進場時間

是大部分相同 還是有少分不同

所以績效才會有差異

 

顯示更多回應 發表回覆
Close