變數宣告問題

  •   78 
  • 最後發表   麥叔  2025 十二月 19
麥叔 發文於   2025/12/19

 

var: bClosePosition(False);
var: b30Ktick(False);
var: intrabarpersist bTrailingStop(False);
var: intrabarpersist bFirstTime(True);

value1=Minute(CurrentTime);
value2=Second(CurrentTime);

if (CurrentTime>=084500 and CurrentTime<134500) then begin // 日盤
    print("日",value1,b30Ktick); //第一個印出b30Ktick
    if (value1=15 or value1=45) then b30Ktick=True 
    else begin
        b30Ktick=False; //後來加的
        bFirstTime=True;
    end;
    print("-",b30Ktick); //第二個印出b30Ktick
    end;

 

以上是程式一開始。我發現,bTrailingStop沒被設定為TRUE前,b30Ktick行為就是,第一個印出b30Ktick是FALSE,如果符合條件式,第二個印出就是TRUE,完全依照邏輯走。但是當程式後面bTrailingStop=TRUE後,b30Ktick在第一個印出的地方就是TRUE。有逐筆洗價,每次一開始,b30Ktick應該被初始化為FALSE才是,為什麼第一個印出會被干擾而變成TRUE?

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

若你希望b30Ktick每個Tick造成的改變都會被保留下來,需要用intrabarpersist宣告。

麥叔 發文於   2025/12/19

許教授,我不希望被保留,但是目前我看到的是,被保留了,為什麼?

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

程式會跑歷史K棒,在前一個交易日結束時,b30Ktick一直為True。

若要每天初始化為0,需要在程式最前面加入:

var: intrabarpersist b30Ktick(false);

if isFirstCall("Date") then b30Ktick=false;

 

麥叔 發文於   2025/12/19

許教授,var: b30Ktick(false); 這裡的初始設定,false沒有用?

因為這裡我不要保留b30Ktick的值,我希望每次進來跑,都被initial為false

我是用30分K,為什麼 print("日",value1,b30Ktick); 這裡會印出TRUE? 不是應該印出false嗎?

 

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

var: intrabarpersist b30Ktick(false);

要加intrabarpersist,且結合isfirstCall處理。為何不試著用我建議的做看看呢?

麥叔 發文於   2025/12/19

許教授,解法我知道,在上面的程式,有個註解 //後來加的,那就解決了。

但是,我還是想知道XQ怎麼編譯的,var: b30Ktick(false); 這表示程式一開始,會給b30Ktick初始值false,如果我程式一開始加一行 b30Ktick=flase; 也可以解決。但,這一行b30Ktick=flase; 在宣告的時候,不就compiler會做嗎?

我搞不懂的是,區域變數,每個tick程式開跑,它的初始值不是false?

我不需要b30Ktick被記憶,只要每個tick進來,它是false即可

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

宣告b30Ktick為False,只會在第一根K開始執行時為False,爾後這個變數會在每根K執行時沿用前一根K的數值。按照你的程式,歷史K棒跑完時,該變數都是True,所以開盤第一個Tick也會顯示True。

若要每個Tick洗價時,b30Ktick都先變成False,只需要在抓秒數的陳述式,亦即value2那一行的下一行(第8行)寫入

b30Ktick=False;

麥叔 發文於   2025/12/19

謝謝許教授您的耐心回答,我跳到我之前問你的貼文,繼續請教您,再次感謝

發表回覆
Close