延後5分鐘再setposition

  •   99 
  • 最後發表   小尼  2025 八月 11
小尼 發文於   2025/07/02

請教各路大神,如果我想在某條件滿足後,延遲5分鐘,再次檢查相同條件還是滿足,再做setposition,程式該怎麼寫呢?

頻率是日線,謝謝

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/07/02

符合條件時,記錄當下的Tick時間,然後用TimeDiff判斷目前時間與之前符合條件的時間差有沒有超過5分鐘,若有,再次判斷條件是否符合,若符合就下單。

小尼 發文於   2025/07/02

請教許教授,

按照您的思路,我在程式一開始宣告一個變數,並在第2行給初始值0,然後在condition1=true 時(表示初次滿足條件),設定outtime = currenttime,然後在時間>=5分鐘後,執行setposition。

例如:

var: outtime(0);

outtime = 0;

if condition1 then

begin

      if outtime = 0 then outtime = currenttime;

      if timediff(currenttime, outtime,"M") >=5 then setposition(1, close);

end;

 

我的疑問是,每一次tick跳動時,都會去執行第2行的outtime = 0,反而讓每次進入if condition1都當第一次滿足條件嗎?

還是outtime不要給初值0?

虎科大許教授 發文於   2025/07/02

var: intraBarPersist outtime(0);
var: intraBarPersist checked(false);
if isFirstCall("RealTime") then 
    begin
        outtime = 0;
        checked = false;
    end;
if condition1 and checked=false then 
    begin
        outtime = GetField("時間", "Tick");
        checked = true;
    end;
if condition1 
    and position = 0
    and checked = true 
    and timediff(GetField("時間", "Tick"), outtime,"M") >= 5 
then setposition(1, close);

小尼 發文於   2025/07/03

感謝許教授推薦使用 isFirstCall("RealTime") 這個新的函數,對於當日初次給值太有幫助了。

XQ說明網址: xs函數「isfirstcall」說明

其中有一句看了不是很懂:不會因為在盤中啟動腳本,才在即時區間的第一次洗價為 true,即時區間的第一次洗價要使用 isfirstcall("Realtime")。

若我在盤中才啟動腳本,那麼isfirstcall("Realtime") 直接就會判斷成true的意思嗎?  

虎科大許教授 發文於   2025/07/03

盤中啟動策略, isfirstcall("Realtime")會在啟動策略之後,即時價格進來的第一個Tick時為True,其他情況(包括開盤後)都是False。

小尼 發文於   2025/08/11

許教授您好,

我試著用您的範例加到我的程式裡並執行了1個月,後來發現 timediff(GetField("時間", "Tick"), outtime,"M") 永遠都是0,

原因是GetField("時間", "Tick") 和 outtime在每一個tick 都相同。

這是否表示,checked 在每次洗價都會被先更新成false,進而outtime 每次也跟著更新新的時間?

這樣代表intraBarPersist 沒有作用嗎?

虎科大許教授 發文於   2025/08/11

(1)condition1 and checked=false 時,記錄outtime,這個時間由於checked = true不會再被記錄,除非condition1=true及 checked=false 條件再次符合。後面任何Tick的時間(除了第一個Tick,因為時間與outtime相同,所以時間差距是0)都大於outtime,時間差距不會等於0。

(2)checked有用intraBarPersist宣告,除非你在程式其他地方有讓它等於false,不然outtime不會被更新。

發表回覆
Close