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

  •   246 
  • 最後發表   投資CC  2025 六月 06
投資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更簡單。

發表回覆
Close