用XQ+Gemini寫策略雷達

By | 2026-03-19

以下是我問Gemini的話

“現在是下午一點20分,目前股價是當日最高價,今天漲幅超過3%,成交量超過2000張,過去20天從來沒有單日漲超過2%,符合這些條件的股票請觸發”,這幫我把這段敘述寫成XSCRIPT的策略雷達腳本

下面是它的回答全文

是一個非常經典且實戰價值極高的**「尾盤異動突破」**策略!

您設定的這幾個條件組合起來非常巧妙:

  1. 過去20天從沒漲超過2%:代表這檔股票被市場徹底遺忘,籌碼極度沉澱,沒有當沖客或短線客在裡面攪和。

  2. 今天漲幅過3% 且 成交量過2000張:代表今天有實質的大資金介入,打破了長期的沉悶。

  3. 下午1:20 且 收在最高價:這是一天當中「最關鍵的表態時刻」。主力願意在尾盤收最高,代表他們完全不怕隔天的賣壓,甚至準備要直接做隔日沖或是發動波段。

我已經將您的 「🛡️ XScript 語法與 XQ 欄位避坑清單 V5」 視為最高準則。針對盤中雷達的特性,我特別使用了 GetField("...", "D") 來精準抓取跨頻率的當日總量與最高價,並用 Highest 函數優雅地處理了過去 20 天的沉寂狀態。

以下是為您量身打造的**「尾盤沉寂爆發雷達腳本」**:

Delphi

// 策略名稱:尾盤沉寂爆發與創高突破雷達
// 策略類型:策略雷達 (請設定於 1分鐘線 或 Tick 頻率執行)

SetTotalBar(30); // 確保有足夠天數計算過去 20 天的日線漲跌幅

var:
    refPrice(0), dailyHigh(0), dailyVol(0), pastMaxGain(0),
    isTimeMatch(false), isHighestPrice(false), isGainMatch(false), isVolMatch(false), isQuietPast(false);

// ==========================================
// 1. 時間濾網:下午 1:20 (13:20:00) 之後
// ==========================================
// 實務上通常設定為大於等於該時間,確保 1:20 之後只要觸發條件就通知
if Time >= 132000 then
    isTimeMatch = true
else
    isTimeMatch = false;

// ==========================================
// 2. 當日價量條件:漲幅 > 3% 且 累積成交量 > 2000張
// ==========================================
refPrice = GetField("參考價", "D");
dailyVol = GetField("成交量", "D");

// 防呆機制:確保參考價大於 0 才計算漲幅,避免新股或異常資料報錯
if refPrice > 0 and (Close - refPrice) / refPrice * 100 > 3.0 then
    isGainMatch = true
else
    isGainMatch = false;

if dailyVol > 2000 then
    isVolMatch = true
else
    isVolMatch = false;

// ==========================================
// 3. 創高條件:目前股價等於當日最高價
// ==========================================
dailyHigh = GetField("最高價", "D");

// 盤中即時價格等於今日最高價 (強勢表態)
if Close = dailyHigh then
    isHighestPrice = true
else
    isHighestPrice = false;

// ==========================================
// 4. 籌碼沉澱條件:過去 20 天從來沒有單日漲超過 2%
// ==========================================
// 抓取過去 20 天 (從昨天 [1] 開始往前算) 的最大單日漲幅
pastMaxGain = Highest(GetField("漲跌幅", "D")[1], 20);

if pastMaxGain <= 2.0 then
    isQuietPast = true
else
    isQuietPast = false;

// ==========================================
// 綜合篩選與觸發
// ==========================================
if isTimeMatch and isGainMatch and isVolMatch and isHighestPrice and isQuietPast then
begin
    ret = 1;
    // 雷達觸發時,推播顯示輔助判斷欄位
    outputfield1((Close - refPrice) / refPrice * 100, "今日漲幅(%)");
    outputfield2(dailyVol, "今日累積總量");
    outputfield3(pastMaxGain, "近20日最大漲幅(%)");
end;

💡 策略雷達實戰設定小提醒

把這支程式放到 XQ 的**「策略雷達」**時,建議的執行頻率設定為 「1分鐘線」「洗價:逐筆洗價」。這樣只要時間一跨過 1:20,系統就會即時掃描全市場,把剛好拉到最高價的沉澱飆股直接推播到您的畫面上!

拉著我到xscript編輯器中開啟一個新腳本

接著把gemini寫的腳本複製貼上後按編譯,然後就出現了一大堆的錯誤訊息

看完這些訊息之後,我整理完大約就三個問題,於是我跟Gemini說

變數宣告中不能使用到daily這個字串,在警示腳本中不能使用漲跌幅,要自己算,在警示腳本中沒有支援outputfield

於是它重寫了一個腳本

// 策略名稱:尾盤沉寂爆發與創高突破雷達 (警示腳本專用版)
// 執行頻率:1分鐘線 或 Tick

var:
refPrc(0), highToday(0), volToday(0), gainToday(0),
i(0), pastGain(0), 
isTimeMatch(false), isHighestPrice(false), isGainMatch(false), isVolMatch(false), isQuietPast(true);

// ==========================================
// 1. 時間濾網:下午 1:20 (13:20:00) 之後
// ==========================================
if Time >= 132000 then
isTimeMatch = true
else
isTimeMatch = false;

// ==========================================
// 2. 當日價量條件:漲幅 > 3% 且 累積成交量 > 2000張
// ==========================================
refPrc = GetField("參考價", "D");
volToday = GetField("成交量", "D");

// 手動計算今日漲幅
if refPrc > 0 then
gainToday = (Close - refPrc) / refPrc * 100
else
gainToday = 0;

if gainToday > 3.0 then
isGainMatch = true
else
isGainMatch = false;

if volToday > 2000 then
isVolMatch = true
else
isVolMatch = false;

// ==========================================
// 3. 創高條件:目前股價等於當日最高價
// ==========================================
highToday = GetField("最高價", "D");

if Close = highToday then
isHighestPrice = true
else
isHighestPrice = false;

// ==========================================
// 4. 籌碼沉澱條件:過去 20 天從來沒有單日漲超過 2%
// ==========================================
// 警示腳本無「漲跌幅」欄位,需利用日線收盤價迴圈手動計算
isQuietPast = true; // 預設為沉寂,只要抓到一天漲幅過大就判定失敗

for i = 1 to 20 begin
// 計算過去第 i 天的漲幅:(第i天收盤 - 第i+1天收盤) / 第i+1天收盤 * 100
if GetField("收盤價", "D")[i+1] > 0 then begin
pastGain = (GetField("收盤價", "D")[i] - GetField("收盤價", "D")[i+1]) / GetField("收盤價", "D")[i+1] * 100;

// 若過去20天內有任何一天單日漲幅大於 2%,則不符合沉寂條件
if pastGain > 2.0 then
isQuietPast = false;
end;
end;

// ==========================================
// 綜合篩選與觸發
// ==========================================
if isTimeMatch and isGainMatch and isVolMatch and isHighestPrice and isQuietPast then
begin
ret = 1;
// 警示腳本專屬推播語法:利用 retmsg 將即時數據推送到手機或電腦通知
retmsg = "尾盤突擊!量:" + NumToStr(volToday, 0) + "張, 漲幅:" + NumToStr(gainToday, 2) + "%";
end;

這次編譯就過了,沒有任何問題了

而且Gemine自己會整理這些錯誤的部份,以下是它的回應

這三個痛點完全切中警示腳本(Strategy Radar)最常遇到的實戰地雷:

  1. daily 字串污染:連變數名稱的部分字串都不能碰到 daily,必須徹底改名(例如改成 volTodayhighToday)。

  2. 漲跌幅 欄位不支援:警示腳本中不支援直接呼叫漲跌幅,必須老老實實用 (今日收盤 - 昨日收盤) / 昨日收盤 * 100 來手動推算。

  3. 沒有 OutputField:警示腳本是盤中即時觸發的,沒有選股清單那種九宮格欄位,如果要在觸發時看到資訊,必須改用 retmsg (回傳訊息) 來推播文字

實戰修正亮點

  1. 變數大掃除:徹底消滅了所有含有 daily 的變數,改為 highTodayvolToday 等安全命名。

  2. 手寫迴圈算漲幅:在 condition 4 中,我們用了一個完美的 for 迴圈,往前推算 20 天的日線收盤價 GetField("收盤價", "D")[i]。一旦發現過去某天漲幅超過 2%,isQuietPast 就會直接變成 false

  3. 完美替代 OutputField:腳本最後使用了 retmsg 搭配 NumToStr(數值轉字串函數),這樣當條件觸發時,您的 XQ 警示彈窗或手機 APP 推播,就會直接顯示**「尾盤突擊!量:2500張, 漲幅:3.15%」**,連切進去算都不用算!

 

這樣就完成了一個警示雷達的腳本,而Gemine也學會了寫XSCRIPT裡的一些語法