關於XQ變數宣告是否有Static宣告

  •   387 
  • 最後發表   投資CC  2025 十二月 19
投資CC 發文於   2025/06/05

想針對此做確認,一般程式語言有static的宣告用於靜態變數。
我要用來做一個barcount的設計,如果台股股票開盤前15分鐘做barcount的累計。我是否要將barcount宣告成static?

以下是我的策略片段,計畫寫成是1分鐘k當沖策略,關於程式裡面的variable,是否需要將barcount宣告成static?
因為程式會每分鐘執行一次,這樣barcount又會成為0?想確認此點問題。(註解也寫在下方)

if barfreq <> "Min" or barinterval <> 1 then raiseRunTimeError("本腳本只適用於1分鐘線");

 

variable:barcount(0),avg15vo(0),openvo(0),totalvo(0),H15(0),L15(0),_range(0);

if date <> date[1] then barcount=1 else barcount+=1;

 

if barcount = 15 then //AM09:15(09:14:59)

begin

H15 = highest(high,15); //前15分鐘最高價

L15 = lowest(low,15); //前15分鐘最低價

totalvo = volume[0] + volume[1] + volume[2] + volume[3] + volume[4] + volume[5] + volume[6] + volume[7] + volume[8] + volume[9] + volume[10] + volume[11] + volume[12] + volume[13] + volume[14]; //前15分鐘的K棒總成交量(因為前面的程式barcount計算,直到第15根if barcount = 15才會進行此條件式)

    avg15vo = totalvo/15; //開盤前15根bar的平均量

end;

 

if L15 <> 0 then _range=H15/L15-1;

 

condition1 = false;

 

if barcount > 15 and close > H15 and _range >= 0.01 and avg15vo/GetField("成交量","D")[1] > 0.10 and GetField("成交量","D")[1] > 1000 then

begin

condition1 = true;

retmsg = "ORB當沖多策略開盤前15根平均成交量與前一日成交量比多10%";

end;

 

//15分鐘後,當下開盤價大於今日前15分鐘的最高價

//且

//前15分鐘的最高價與最低價差距>1%

//且

//前面15根bar的平均量佔昨日成交量的10%以上

//且

//前日成交量要大於1000張的股票

//這樣衡量開盤平均15分鐘的成交量如果已經佔昨日收盤的成交量的10%,表示交易活躍。

//此為第一層濾網,此第一層濾網用1分k的前15分鐘做判斷,從1800多檔股票篩選出合適的股票。

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

(1)XQ沒有靜態變數。變數都是策略中止才會被從記憶體剔除。策略執行期間,每根K棒執行一次,變數會被保留並往下傳遞數值,所以上一根K棒的變數會將運算後的變數值傳給下一根K棒,並不會被歸零。

(2)善用XQ內建函數可精簡程式碼及提升執行效率。非逐筆洗價時的程式碼如下:

if barfreq <> "Min" or barinterval <> 1 then raiseRunTimeError("本腳本只適用於1分鐘線");
variable:barcount(0),avg15vo(0),openvo(0),totalvo(0),H15(0),L15(0),_range(0);
if date <> date[1] then barcount=1 else barcount+=1;
if barcount = 15 then
    begin
        H15 = highest(high,15); //前15分鐘最高價
        L15 = lowest(low,15); //前15分鐘最低價
        avg15vo = average(v,15); //開盤前15根bar的平均量
    end;

(3)你的需求雖然可以用barcount處理,但用Time更簡單。

if barfreq <> "Min" or barinterval <> 1 then raiseRunTimeError("本腳本只適用於1分鐘線");
variable:avg15vo(0),openvo(0),totalvo(0),H15(0),L15(0),_range(0);
if Time=091400 then
    begin
        H15 = highest(high,15); //前15分鐘最高價
        L15 = lowest(low,15); //前15分鐘最低價
        avg15vo = average(v,15); //開盤前15根bar的平均量
    end;

投資CC 發文於   2025/06/06

了解了,謝謝教授。這裡用Time更簡單。

麥叔 發文於   2025/10/29

請問許教授,我今天遇到變數每個tick來,都是初始值,並沒有如您所說,紀錄上一次的值。請問是為什麼? 有甚麼設定不對嗎?

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

變數需要用intrabarpersist宣告才行。

麥叔 發文於   2025/10/30

謝謝許教授,變數加上intrabarpersist宣告就可以了。但是Position要怎麼處理?

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

Position 是系統內建、唯讀變數,不需要宣告,直接使用即可。只是要注意,洗價完成之後,它才會改變。

麥叔 發文於   2025/10/31

我沒說清楚,我是說,每個tick來,我就會執行程式一次,每次都會進場,但是,這只要第一次有進場就好。要如何處理?

截圖圖片

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

if position=0 and condition1 then setposition(1,market); //condition1是你的進場條件

麥叔 發文於   2025/11/04

謝謝許教授,我找到問題了,原來是我的setposition(1,market),其中有一個只寫成setposition(market)

麥叔 發文於   2025/12/19

許教授,續我在另外一個題目提問的。這裡也是區域變數,但是,每次都是初始值,您提到變數需要用intrabarpersist宣告就可以是static的全域變數。但是我再另外那個題目,b30Ktick卻是一直用前面的值,即使是新的30分TICK來,也還是不會變成false,是為什麼?

 

顯示更多回應 發表回覆
Close