自動交易for迴圈計數問題

  •   284 
  • 最後發表   wei15  2024 六月 21
wei15 發文於   2024/06/19

想請問一下各位大大,我使用for迴圈來計數今天收盤價>前面幾天的收盤價,但發現列印出來的數據,沒有達到大於500根K棒,還是會全部列印出來,無法break跳脫。(有測試把close改成volume就可以正常跳脫break然後計數,改成close就不行,想請問哪裡寫錯了呢?)

備註:
自動交易設定1分鐘逐筆交易跨頻率在抓計數。
以下附列印圖、股價圖與程式碼

setbackBar(500,"D");
if  GetInfo("IsRealTime")=0 then return;

if not GetSymbolInfo("買賣現沖") or 
       GetSymbolInfo("注意股") or   
       GetSymbolInfo("累計異常注意股") or 
       GetSymbolInfo("處置股")     
then raiseRunTimeError("不能當沖");

if average(GetField("成交量", "D"),5)<1000 then raiseRunTimeError("成交量不足");
if GetField("收盤價", "D")[1]*1.1<GetField("收盤價", "D") then raiseRunTimeError("今日不可能達成");
if GetField("收盤價", "D")>200 then raiseRunTimeError("股價過高不交易");


var:ccount(0),u(0);
if ccount=0 and u=0  then begin
    if GetField("收盤價", "D")>GetField("收盤價", "D")[1] then begin
        for u=1 to 500 
        begin
        if GetField("收盤價", "D")>GetField("收盤價", "D")[u] then ccount+=1;
        if GetField("收盤價", "D")<GetField("收盤價", "D")[u] then break;
        end;
    end;
end;   

if  ccount=500 then begin
alert("一個滿500=",close,"C=",ccount);
end;

var: intraBarPersist ct(0);
if ct=0 then begin ct=CurrentTime;
end;

if currentTime<>0  and ct<>0 and  ccount<>0 then begin
    if currentTime>timeAdd(ct,"M",5) then begin
        print("五分鐘通知1次",ccount);
        ct=0;
    end;
end;

附加文件

排序方式: 標準 | 最新
wei15 發文於   2024/06/21

剛測試一下還是不行,輸出結果一樣有問題,下面的函數我會參考參考,謝謝您的回覆!

虎科大許教授 發文於   2024/06/21

你的問題出在對逐筆洗價的變數行為不了解;而且,也不明白每個TICK進來時,都需要將ccount這個變數歸零。若某個TICK剛好是該1分K的最後一個TICK,且符合計算ccount的條件,則運算後的ccount會被保留給下一根K棒的所有TICK洗價。當它已經有數值了,就再也進不去if ccount=0 and u=0  then裡面,看到的結果就是ccount沒有跑滿500,卻離開迴圈。其實,它根本沒有機會進入迴圈。你試著把下列程式碼修改一下,將if ccount=0 and u=0  then begin這行刪除,並以ccount=0;取代。記得最後一個end;要刪除。

if ccount=0 and u=0  then begin

    if GetField("收盤價", "D")>GetField("收盤價", "D")[1] then begin

        for u=1 to 500 

        begin

        if GetField("收盤價", "D")>GetField("收盤價", "D")[u] then ccount+=1;

        if GetField("收盤價", "D")<GetField("收盤價", "D")[u] then break;

        end;

    end;

end;   

改成

ccount=0;

if GetField("收盤價", "D")>GetField("收盤價", "D")[1] then begin

        for u=1 to 500 

        begin

        if GetField("收盤價", "D")>GetField("收盤價", "D")[u] then ccount+=1;

        if GetField("收盤價", "D")<GetField("收盤價", "D")[u] then break;

        end;

    end;

發表回覆
Close