開盤後第3分鐘才觸發進場條件的寫法請問

  •   48 
  • 最後發表   阿哲DR5  2025 九月 12
阿哲DR5 發文於   2025/09/12

許老師及大家好!

我想要在剛開盤的時候把當下的報價放到 value1 這個變數,090100 的報價放到 value3 這個變數,090200 的報價放到 value5 這個變數,然後根據下面的 condition 去做進場的動作。

我遇到的問題是本來應該 090200 才進場,可是一開盤 090000 就進場了,請問程式碼要如何修改呢?謝謝

 

var: intrabarpersist hasRet(false);

if getsymbolinfo("買賣現沖") = true then 
begin 

    if time = 090000 then begin
    value1 = close;
    value2 = volume;
    end;

    if time = 090100 then begin
    value3 = close;
    value4 = volume;
    end;

    if time = 090200 then begin
    value5 = close;
    value6 = volume;
    end;

    condition1 = value5 >= value3 or value3 >= value1 or value5 >= value1;
    condition2 = value4 > value2 or value6 > value4 or value6 > value2;
    condition3 = value5 >= 50;
    condition4 = value5 <= 500;
    condition5 = average(getField("成交量", "D")[1], 5)>10000;

    if condition1 and condition2 and condition3 and condition4 and condition5 then
    begin   
        if isFirstCall("Date") then hasRet=false;
        if date=currentDate and hasRet=false then 
           begin
               hasRet=true;
               setposition(1);
           end;
    end;

end;    

Value7 = GetQuote("漲停價");


if hasRet=false and position <> 0 then
   begin 
        if close>=value1*1.03 or close=Value7 or close<=value1*0.95 then 
           begin
               hasRet=true;
               setposition(0);
           end;
   end;


if position <> 0 and time = 103000 then setposition(0);

 

 

 

 

 

 

 

 

虎科大許教授 發文於   2025/09/12

(1)你的問題出在一開盤只有value1、value2是開盤的數值,value3~value6都是前一個交易日的數值,當5個condition都是true時,就會觸發進場訊號。判斷條件是否成立,應該在value1~value6的數值都更新為今天的數值,亦即090300才開始判斷。

(2)你需要學習有效率地撰寫程式。爾後我在週末特訓班開設『如何有效率地撰寫程式』課程,務必來學習。判斷是否可買賣現沖,應該在啟動策略之後只執行一次,而不是從開盤到收盤一直在判斷,另外若判斷不可買賣現沖,就應該停止該商品的監控,而不是整天的每個Tick都在判斷。

(3)由於使用time等於090000、090100、090200、090300判斷,為了避免邏輯錯誤,應限制使用者只能選擇1分鐘頻率。

if barfreq<>"Min" or barinterval<>1 then raiseRunTimeError("限用1分鐘頻率");
if getInfo("isRealTime")=0 then return;
if getsymbolinfo("買賣現沖") = true then raiseRunTimeError("禁止現沖,停止監控!");
if time = 090000 then 
    begin
        value1 = close;
        value2 = volume;
    end;
if time = 090100 then 
    begin
        value3 = close;
        value4 = volume;
    end;
if time = 090200 then 
    begin
        value5 = close;
        value6 = volume;
    end;
if position=0 then
    begin 
         if time = 090300 then
            begin
                condition1 = value5 >= value3 or value3 >= value1 or value5 >= value1;
                condition2 = value4 > value2 or value6 > value4 or value6 > value2;
                condition3 = value5 >= 50;
                condition4 = value5 <= 500;
                condition5 = average(getField("成交量", "D")[1], 5)>10000;
                if condition1 and condition2 and condition3 and condition4 and condition5 then setposition(1);
            end
        else if time > 090300 then raiseRunTimeError("交易結束,停止監控");
    end
else
    if time > 090300 then
        if close>=value1*1.03 
            or close=GetField("漲停價") 
            or close<=value1*0.95 
            or time = 103000 
        then setposition(0);

 

 

  • 按讚來自於
  • A124316908
發表回覆
Close