求助~關於創新高後五分鐘後沒再創高的警示腳本,回測跟實際使用時跳出訊號的位置跟想法不同

  •   660 
  • 最後發表   倪阿胖  2024 十二月 08
倪阿胖 發文於   2023/10/04

小幫手你好

最近學習XS腳本大概一個月左右

寫了一個做空當沖用的警示腳本

以下是語法

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

// 僅適用於1分鐘線 

if barfreq <> "Min" or barinterval <> 1 then raiseruntimeerror("本腳本只適用於1分鐘線");

// 設定一個變數紀錄當日最高價 

var:_high(0);

//只在當日執行

if currentdate <> date then return;

// 更新當日最高價

if high > _high then _high = high;

// 設定一個變數紀錄最後創高的時間

var:_time(0);

//更新最後創高的時間

if close = _high then _time = time;

//如果收盤價小於當日最高價,且距離最後創高的時間超過五分鐘,則訊號觸發(9:05~11:00之間執行且漲幅低於6%)

if close < _high and time >= _time + 500   and Time  > 090500 and Time  < 110000 AND Close < CloseD(1)*1.06 then ret = 1;

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

想請教小幫手

1.五分鐘後的語法可以這樣寫嗎?因為時間數值是090000,所以試試看+500可不可行,目前是使用TimeDiff(time,_time,"M")>=5 

2.目前我碰到的回測狀況創高後五分鐘不過高會跳訊號,然後五分鐘後過高的k棒也跳訊號,跟想像中創高後五分鐘不過高才跳訊號不同,實際盤中測的結果也是相同,只要一過高就觸發訊號~請小幫手看看我是不是哪邊邏輯寫錯了

如附圖11 ,12訊號點都不對,只有13是正確的

感謝小幫手

 

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

 Hello 倪阿胖,

 

時間的加減法可以參考 timeaddtimediff

TimeDiff(time,_time,"M")>=5 是可以的。

 

需注意,currentdate在回測中是等同於date,且腳本中沒有每日重置 _high 跟 _time。

故在回測時可能會抓到非今日的高點和對應時間。

另外 TimeDiff(time,_time,"M")>=5 這樣撰寫的話不只是5分鐘,而是5分鐘和以後的Bar。

可以些改為 TimeDiff(time,_time,"M")=5,但需注意若該商品在該分鐘沒有成交的話,策略沒有運算就不會觸發。

 

建議可以在腳本中加上 print 函數將相關數值印出,這樣會比較好檢查問題原因。

如果還是有問題的話,麻煩提供 警示腳本、回測的設定 (截圖或回測報告) 及有問題的商品和日期時間來確認。

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

感謝。

倪阿胖 發文於   2023/10/11

超級謝謝小幫手

完全沒注意到是因為沒有重置

加上了一段每日重置的語法

if date <> date[1]

then begin 

_high=0;

_time=0;

end;

目前回測的結果初步是正確了
我再試試看小幫手的建議加上PRINT幫忙找問題

 

黑牛 發文於   2024/04/04

可依請問小幫手改完之後的完整寫法嗎~看不懂要修改哪邊?感謝

XQ小幫手 發文於   2024/04/25

Hello, 黑牛.

// 僅適用於1分鐘線
if barfreq <> "Min" or barinterval <> 1 then raiseruntimeerror("本腳本只適用於1分鐘線");

// 設定一個變數紀錄當日最高價
var:_high(0);

// 設定一個變數紀錄最後創高的時間
var:_time(0);

//只在當日執行
if currentdate <> date then return;

if 
    date <> date[1]
then begin
    _high=0;
    _time=0;
end;

// 更新當日最高價
if high > _high then _high = high;

//更新最後創高的時間
if close = _high then _time = time;

//如果收盤價小於當日最高價,且距離最後創高的時間超過五分鐘,則訊號觸發(9:05\~11:00之間執行且漲幅低於6%)
if close < _high and time >= timeadd(_time, "M", 5) and Time > 090500 and Time < 110000 AND Close < getfield("Close", "D")[1] * 1.06 then ret = 1;

加在變數宣告之後,這樣每日日期有變化的第一跟bar,

會將變數歸零,

在後續的版本會有"IsFirstCall"可以使用在變數歸零,

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

https://www.xq.com.tw/learn

 

謝謝。

黑牛 發文於   2024/12/08

請問小幫手要如何抓創高那根K棒的低點?

虎科大許教授 發文於   2024/12/08

value1=getbaroffset(date, _time);

value2=low[value1]; //創高K棒的最低價

發表回覆
Close