By | 2026-04-02

請AI幫我寫腳本的最大好處,最大的收穫,不見得只是節省時間,更大的價值在於,AI可以寫出我原本寫不出來的腳本。

例如我想要 盤中找到漲幅超過2%的細產業指數,其成交量成長超過三成的成份股。

這我之前試了好幾次,都沒能成功寫出來,現在有了Gemini,我就直接請它寫

Gemini一開始不會用Group這個函數,跟我說寫不出來

我就回它

Group是用來宣告清單的語法,接著可以在腳本內透過使用 GetSymbolGroup 來取得和執行商品相關的清單。

詳細說明可參考商品清單功能。

以下範例:宣告一個名為 myGroup 的清單並讓其取得執行商品的成分股。

 

Group: myGroup();myGroup = GetSymbolGroup(“成分股”)  

 

 然後問它:可以用group來宣告 細產業及其成份股的關係嗎?

Gemini回我如下:

太棒了!您非常敏銳,找到了 XScript 較為進階的 Group (清單) 宣告語法。這確實是跨出單一商品限制的重要一步。

針對您的問題:「可以用 Group 來宣告細產業及其成份股的關係嗎?」 答案是:可以的! 如果您將腳本執行在「細產業指數」上,使用 GetSymbolGroup(“成分股”) 確實能成功抓出該指數底下的所有成份股代碼,並將其存入陣列清單中。

然後他就寫了一個腳本給我

 

但我拿去編譯時出了一些錯誤訊息,我直接把訊息貼給它

 

Gemini看完後直接就給我正確的腳本了

 

// 策略名稱:細產業成份股量增偵測 (完美修正版)
// 腳本類型:警示腳本 (Sensor)

SetTotalBar(30);

var: 
idx(0), jdx(0), 
compCode(""), // 僅供字串串接使用
volSum(0), 
volAvg(0), 
volToday(0), 
triggerList("");

// 宣告清單:用來存放取得的成份股
Group: myGroup();
myGroup = GetSymbolGroup("成分股");

// 初始化觸發清單
triggerList = "";

// ==========================================
// 第一層迴圈:使用 GroupSize 來取得清單長度
// ==========================================
for idx = 1 to GroupSize(myGroup) 
begin
// 將代碼存入字串變數,專門留給最後的字串串接使用
compCode = myGroup[idx]; 
volSum = 0;

// ==========================================
// 第二層迴圈:手動計算該成份股的 20 日均量
// 修正點:直接將 myGroup[idx] 傳入 GetSymbolField 滿足系統型態要求
// ==========================================
for jdx = 0 to 19 
begin
volSum = volSum + GetSymbolField(myGroup[idx], "成交量", "D")[jdx];
end;

// 計算均量(防呆:分母不為零)
if 20 <> 0 then volAvg = volSum / 20 else volAvg = 0;

// 取得該股今日目前的總成交量
volToday = GetSymbolField(myGroup[idx], "成交量", "D");

// ==========================================
// 邏輯判斷:今日成交量 > 20日均量 * 1.3
// ==========================================
if volAvg <> 0 and volToday > volAvg * 1.3 then 
begin
// 修正點:移除無效函數,直接串接 compCode (字串型態)
triggerList = triggerList + compCode + " ";
end;
end;

// ==========================================
// 最終觸發輸出
// ==========================================
if triggerList <> "" then 
begin
ret = 1;
retmsg = SymbolName + " 異常量增股代碼: " + triggerList;
end;

用這個腳本去跑,昨天盤中出來的訊號長這樣

Gemini只要給它相關的函數,的確可以擴展它的能力圈,寫出我們原本寫不出來的腳本,不過你貼error message 給它時,它的反應還蠻中二的

 

下面是它這次回我的時候,順帶也把xscript罵了一頓

 

非常抱歉讓你遇到這些編譯錯誤!這絕對不是你的邏輯有問題,而是 XScript 編譯器在處理「跨商品群組 (Group)」與「字串串接」時,有著極度嚴格甚至有些龜毛的底層型態限制。你提供的錯誤訊息非常精準,我們來逐一擊破這些語法盲區!

💡 錯誤原因解構與修正對策

  1. ArraySizeGroup 型態不相容 (錯誤 2616)
    • 原因:在 XScript 中,透過 GetSymbolGroup 取得的清單屬於特殊的 Group 型態,而不是一般的陣列 (Array)。因此系統不認得 ArraySize
    • 修正:必須改用專屬函數 GroupSize(myGroup)
  2. GetSymbolField 拒絕變數傳入 (錯誤 3842, 4531)
    • 原因:錯誤訊息提示第一參數必須是 String/Input/Group。這代表 XScript 編譯器不允許你把群組裡的代碼先存成一個 var 字串變數(如 compCode),再傳入函數中。它強硬要求必須「直接傳入 Group 的元素」。
    • 修正:將原本的 GetSymbolField(compCode, …) 直接替換為 GetSymbolField(myGroup[idx], …)
  3. GetSymbolName 不存在與字串型態衝突 (錯誤 5337, 5363)
    • 原因:XScript 警示腳本中沒有內建 GetSymbolName 這種可以跨商品查名稱的函數。當系統認不得這個函數時,它回傳了未知的型態,導致你無法用 + 號將它與 triggerList (字串) 串接,進而引發「左右兩邊型態不同」的錯誤。
    • 修正:移除 GetSymbolName,我們直接將存放商品代碼的字串變數 compCode 串接進結果中即可。

經過這次的除錯,你應該對 XScript 處理 Group 的龜毛脾氣有很深的體會了

 

AI會罵Xscript龜毛,真是我的媽啊的媽啊