觸發次數

  •   243 
  • 最後發表   阿林  3 天前
阿林 發文於   2025/05/19

不好意思請教一下 以下腳本頻率一分鐘 假設

 if high <  GetField("收盤價", "D")[1] or low > GetField("收盤價", "D")[1] or

   low = GetField("收盤價", "D")[1] then ret = 1

我使用觸發方式是k棒單次內觸發

但我希望達到條件後 只觸發3次後 就別再觸發

請腳本要怎樣寫能限制他達條件後的觸發次數?

我自己有試過幾個方法都不行

再請教請教了 感謝!!!!

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

宣告一個變數,在每次觸發時加1。

var: intrabarpersist count(0);

if isFirstCall("Date") then count=0;

if count<3 and high <  GetField("收盤價", "D")[1] or low > GetField("收盤價", "D")[1] or

   low = GetField("收盤價", "D")[1] then

   begin

      count+=1;

      ret = 1;

   end;

阿林 發文於   2025/06/04

您好 許教授 我把腳本稍微改這樣比較好判讀

if barfreq <> "Min" or Barinterval <> 1 then RaiseRuntimeError("請設定頻率為1分鐘");

var: intrabarpersist count(0);

value1 = GetQuote("成交金額(元)");

if isFirstCall("Date") then count = 0;

if count < 3 and high < GetField("收盤價", "D")[1] and value1 >= 4000000000 or 

                 low < GetField("收盤價", "D")[1] and value1 >= 4000000000 or

     close < GetField("收盤價", "D")[1] and value1 >= 4000000000 then

       begin

      count += 1;

      ret = 1;

     end;

   print(date,currenttime,count);

count 確實有在紀錄 但可是卻沒有因為count>3 就開始停止觸發

還是一直觸發下去 請問可能問題在哪裡呢

 

 

 

 

虎科大許教授 發文於   2025/06/04

問題出在處理邏輯運算子錯誤。應該改成:

if count < 3 and (high < GetField("收盤價", "D")[1] and value1 >= 4000000000) or 

                 (low < GetField("收盤價", "D")[1] and value1 >= 4000000000) or

     (close < GetField("收盤價", "D")[1] and value1 >= 4000000000) then

阿林 發文於   2025/06/09

許教授您好 我腳本照這樣改一樣會一直觸發下去耶

並沒有在count < 3就停止觸發 

請問還有可能是什麼原因呢 感謝您

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

 

   if count < 3 then

      if (high < GetField("收盤價", "D")[1] and value1 >= 4000000000) or 

                 (low < GetField("收盤價", "D")[1] and value1 >= 4000000000) or

     (close < GetField("收盤價", "D")[1] and value1 >= 4000000000) then

      begin

         count+=1;

         ret=1;

      end;

 

 

阿林 發文於   2025/06/10

許教授您好

改這樣變成無法觸發耶

因為今日盤強 我有把high low close 改成>GetField("收盤價", "D")[1]

可是改成 if count < 3 then if

變成都沒有觸發任何股票 不知道是為何原因

然後我有試著改成這樣 if ret = 1 then count += 1;

也不行 都會一直觸發不會限制住 

阿林 發文於   2025/06/10

還有試著改這樣也不行

 

if barfreq <> "Min" or Barinterval <> 1 then RaiseRuntimeError("請設定頻率為1分鐘");

 

var: intrabarpersist count(0);

variable:intraBarPersist ret1(false);

variable:intraBarPersist ret2(false);

variable:intraBarPersist ret3(false);

 

value1 = GetQuote("成交金額(元)");

 

if isFirstCall("Date") then count = 0;

 

if ret1 = false and

              (high > GetField("收盤價", "D")[1] and value1 >= 2000000000) or 

 

                 (low > GetField("收盤價", "D")[1] and value1 >= 2000000000) or

 

               (close > GetField("收盤價", "D")[1] and value1 >= 2000000000) then 

begin ret = 1;

   ret1 = true;end;

 

if ret2 = false and ret1 = true and

              (high > GetField("收盤價", "D")[1] and value1 >= 2000000000) or 

 

                 (low > GetField("收盤價", "D")[1] and value1 >= 2000000000) or

 

               (close > GetField("收盤價", "D")[1] and value1 >= 2000000000) then 

begin ret = 1;

   ret2 = true;end;

 

虎科大許教授 發文於   2025/06/10

只覺得你的邏輯很奇怪,既然low>GetField("收盤價", "D")[1],那high一定也大於GetField("收盤價", "D")[1]。把你真正的想法表達出來,什麼情況要警示。警示三次用我提供的方式應該可以。寫法如下。你只要確認警示的條件是否正確即可。

if barfreq <> "Min" or Barinterval <> 1 then RaiseRuntimeError("請設定頻率為1分鐘");
var: intrabarpersist count(0);
if isFirstCall("Date") then count=0;
value1 = GetField("成交金額","D");
if count < 3 then
    if (high > GetField("收盤價", "D")[1] and value1 >= 2000000000) or 
        (low < GetField("收盤價", "D")[1] and value1 >= 2000000000) or
        (close > GetField("收盤價", "D")[1] and value1 >= 2000000000) then
        begin
            count+=1;
            ret=1;
        end;

發表回覆
Close