求助,時間過後,抓不到變數的值

  •   210 
  • 最後發表   努力中  2024 四月 01
努力中 發文於   2024/03/21

var:A(0) B(0) 

if currentTime>=095900 and currentTime<=100000 and 條件1 then A=close

也就是在9點59分時,條件1達成時,A=收盤價

回測時,只要在9點59後,包含超過10點,A都有等於收盤價,這邊OK

但在執行策略時,若時間超過10點,A就變成0

不懂為什麼回測正常,執行PRINT卻是0(60分K,開逐筆)

有想過再多一個變數B=A(無效),或是A<>0 then B=A(無效)

 

之前小編回覆如下:

"除非有賦予變數新的值,否則變數都會維持在最近一次所賦予的值。

故上面的範例中只要條件成立後,變數都會維持。"

 

請問我是哪搞錯了,真是想不透阿...

 

排序方式: 標準 | 最新
XS小編 發文於   2024/03/25

Hello 努力中,

 

小編推測您遇到的應該是變數沒有宣告為intrabarpersist的問題,可以參考連結說明。

簡單來說,若該根Bar在中間洗價時符合條件,但Bar結束時不符合條件的話,那麼變數A就會維持在當根Bar最後的狀態 (也就不會執行到 A=close)。

努力中 發文於   2024/03/25

某一項條件是minute(currenttime)=44

而實際執行策略時,每到44分時值會出現,過後又歸0

應該是跟這個有關

我有另設一個變數,當值<>值[1]時,B=A紀錄也沒用,

目標是60分頻率、開逐筆時,在每個K棒的最後一分鐘取值(44分、59分)

請問有什麼解決方法嗎,謝謝

努力中 發文於   2024/03/26

in開頭那個,一直都有宣告,只是提問簡化省略了,一樣沒辦法....

努力中 發文於   2024/03/26

而且最奇怪的是,前面有包含其他條件(K棒時間),但是PRINT卻會與44分這條件連動

time>=084500 and time<=124500 and minute(currenttime)=44

 

XS小編 發文於   2024/03/28

Hello 努力中,

 

小編並不知道您是如何撰寫的,不過須注意就算60分鐘頻率逐筆洗價回測時是每一分鐘運算一次,[1]取到的還是上一根60分鐘Bar的資料。

所以舉例來說您在 104400 的時候運算,變數[1] 會是 090000 這根Bar的資訊 (不論是否為intrabarpersist)。

若要在每個44分時保存當下和上個44分的資料,那麼會需要兩個變數,舉例來說:

var: intrabarpersist _value1(0), intrabarpersist _value2(0);

 

if minute(currenttime)=44 then begin

    _value2 = _value1;

    _value1 = close;

    end;

 

這樣 _value2 就會是上一次條件符合時的數值,而 _value1 就會是此次條件符合時的數值。

 

time>=084500 and time<=124500 and minute(currenttime)=44 這種寫法當然只會和44分連動,因為您條件中間是 and。

上面這段用中文解釋就會是 時間介於 08:45 到 12:45 之間,且分鐘為44分。

如果您希望的是 時間介於 08:45 到 12:45 之間,或是分鐘為44分,那麼應該是:

(time>=084500 and time<=124500) or minute(currenttime)=44

 

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

努力中 發文於   2024/03/28

多設一個變數,在44分取值這辦法試過了不行啊..............

在一開始發文有提到,"'多一個變數B=A(無效)""

 

而下面我就是要這樣用途沒錯的,也就是期貨早盤每個60分K棒的最後一分鐘取值

time>=084500 and time<=124500 and minute(currenttime)=44 這種寫法當然只會和44分連動,因為您條件中間是 and。

上面這段用中文解釋就會是 時間介於 08:45 到 12:45 之間,且分鐘為44分。

努力中 發文於   2024/03/28

我再重新說明一下情況,寫法如下

var: intrabarpersist A(0)

if hour(currenttime)>=09 and hour(currenttime)<=12 and minute(currenttime)=44 and close>open then A=close

也就是早盤每當44分01秒到59秒時,不論是回測或執行策略當下A都可以=close

但是過了44分之後,執行策略A=0,而回測不會

就算多一個var: intrabarpersistB(0)

44分時讓B=A,一樣只有在策略當下抓不到值,推測是某項原因讓A變成0,才會讓B也等於0

環境是60分K、有開逐筆,可能回測時,一分鐘才洗一次價有關

但是詳細我研究不出來

不過我把這些時間因素拿掉之後hour(currenttime)>=09 and hour(currenttime)<=12 and minute(currenttime)=44

A都會正常=close

想知道為何會因為時間條件導致歸零

努力中 發文於   2024/03/29

綜合小編回覆跟測試,可能是在60分K中,無法用currenttime來取值

比如time=0845 and currenttime=44 then A=close 

等於在44分時,A才會等於收,其他時間A都會(0),而這是不同頻率洗價的邏輯

我猜可以用數次的方式,數到第60次的時候取值,開新K時重新數次,但是我用

value1=minute(currenttime)[1]

value2=minute(currenttime)

發現辦不到,因為實際在跑時value1=value2,無法計數

既然不能用currenttime這因子,請問還有其他方式嗎

 

XS小編 發文於   2024/04/01

Hello 努力中,

 

小編這邊簡單測試不會發生您所說的狀況 (參考附圖,為了確保在指定的最近時間28分觸發觸發小編將 close>open 條件移除)。 

麻煩您提供 自動交易中心匯出檔包含交易腳本 以及 XQ Log 來檢驗。

Log資料夾(預設路徑:C:\SysJust\XQLite\LOG)直接壓縮後提供即可。

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

感謝。

附加文件

發表回覆
Close