在使用量化交易實驗室的AI撰寫XS程式碼的時候,如果編譯出現錯誤,對於XS程式碼不熟悉的朋友,往往不知道解決,本文將會使用實際案例,分享我的解決方式,希望能幫助更多人順利的運用AI來寫程式。
1. 前言
現在很多人都在用AI來寫程式,使用XQ的你,是不是超級羨慕也去嘗試讓AI撰寫XS程式碼了呢? 相信你試過之後的結果都會很失望吧,你以為他給你的是XS程式碼,但常常都是其他軟體的語法。

這樣的結果是很正常的,主要是因為網路上可供AI學習的XS資源並不多,無法讓AI有效的學習,只能拿其他程式來忽悠你了。
想要讓AI能較為正確的撰寫XS程式碼,是需要另外訓練的,而市場上,只有量化實驗室的AI有針對XS語法做訓練,能夠較為正確的寫出XS程式碼,為何我會寫較為正確呢? 因為AI還是有其侷限性,不可能每次都寫出100%正確的程式碼,有錯都是很正常的。

既然AI會出錯,那學習如何debug就會是非常重要的事,尤其是對XS還不熟悉的朋友,就一定要培養這樣的能力,至於如何學,我也還沒想出啥系統化的方式,所以先分享我debug的方式,或許能對你有些幫助。
2. 案例說明
以下是網友詢問的問題,網友想要寫一個XS指標,能夠找出最近一段時間內的最高點、次高點、最低點跟次低點並畫出來,程式碼已經讓AI寫出來了,但一直無法編譯成功

完整有問題的程式碼我放在最下面,想要練習debug過程的,可以拿去試試
3. Debug過程
3.1 先編譯了解有那些錯誤
當拿到程式碼的時候,我第一個步驟不是去解讀程式碼,自己程式能力也沒很好,還是先丟給XScript編輯器編譯,看看有怎樣的錯誤再說,編譯後出現了如下方圖片的錯誤訊息,似乎有一堆錯誤,看了是不是頭很暈呢?

其實,有很多錯誤似乎是一樣的,我們可以點錯誤描述那照錯誤名稱排序,就可以得到如下圖的排列結果,是不是頓時覺得錯誤少了許多呢

3.2 先解決簡單的錯誤
當編譯有錯誤的時候,可能大部分的人會把所有錯誤一次都丟給AI去修正,但有的時候,這樣反而會越改問題越多,我的建議是,每次解決一兩個問題,這樣就算沒調整好,自己要debug也較容易。
另外,有些問題的產生是有因果關係的,把簡單的問題修正後,很有可能其他的問題就解決了還有就是,看到錯誤不定都要AI幫你改,有時跟AI來來回回反而浪費時間,簡單的錯誤可以嘗試自己改,順便培養程式的能力。以下先來修正兩個錯誤
錯誤1: Daily開頭為保留字,目前版本不支援DailyClose語法
這個錯誤,應該很容易理解,就是名稱有問題,不能用Daily做開頭,由於這個錯誤出現在好幾個地方,所以我會偷懶點,讓AI去幫我改,避免漏改了。
錯誤2: “dailyClose” 沒有宣告,請用 Vars: 的方式宣告,冒號後面是變數名稱再用括號填入預設值。例如: Vars:varA(100); 如果要宣告陣列請用 Arrays: 冒號後面是名稱再用 [] 設定維度與大小,括號填入預設值。例如 Arrays:arr1[10](0);
這個錯誤應該也算簡單好解決,找到原始的程式碼,可以看到DailyClose是個陣列,但是寫成
array: dailyclose ;
跟上面的範例相比,是不是就很容易看出dailyclose後面,缺了維度與大小,如果不知怎麼填,可以看看函數說明,或是讓AI幫你改寫,我下的prompt如下
以下程式碼出現兩個錯誤,請幫我修正
1. 20250415v32329「Daily」開頭為保留字, 目前版本不支援「dailyClose」語法。
2. 20250415v32313變數 “dailyClose” 沒有宣告。
下面為程式碼~~~

很幸運的,上面兩個錯誤修正後,編譯就成功了

3.3 儘量採用內建函數
編譯成功後,想說丟到指標應該就能畫出來了吧,果然,事情哪有這麼簡單,出來的壓力支撐數值都為0

像這種錯誤,通常就是計算的邏輯上有問題,而你如果有常常在用量化交易實驗室AI,應該會發現一個狀況,就是AI很喜歡自己寫計算式,不愛用XQ內建的函數來處理,自己寫沒問題,但出錯要debug對較不同程式的人就是個很頭痛的事了
如下方這段程式碼,看不懂程式碼,也可以看備註的說明,是在每天繼續收盤價,看到這個,只要你有寫過XS程式碼,應該馬上會有個疑問,為何要寫的這麼複雜,XS要抓到不同天的收盤價,不就是用中括號加上距離現在幾根K棒就可以了嗎? 如想要取得兩天前的收盤價,就用close[2]或getfield(“close”,”D”)

還有下面這段程式碼,看備註是要取得最近一段時間的最高點跟次高點,以及最低點跟次低點,此時可以先想想,XS的內建函數是不是就有可能做到呢?

想要知道有沒有內建可用的,有幾種方法
1. 可以試試查看函數列表,但這還是最好對函數有點熟悉的人會比較好找
2.直接問問AI有沒有啥的函數可以用,如我問XQ有什麼內建函數可以找出一段數列中第n個最高值,AI就很聰明的告訴我有NthHighest這個函數可以用,不過,AI有時候也會耍笨,這個時候就要用第三個方法了。

3. 第三個方式是大家最熟悉的,請出谷哥大神搜一搜,我下的搜尋指令是”XQ 找最高點跟次高點”,從搜尋結果中,我們就可以看到相關的討論或是函數說明,進去仔細看下,就可以確定是要用nthhighest這個函數了

3.4 用內建函數替代原本的計算式
經過上面確認有內建函數可以用之後,就可以讓AI幫忙來改寫了,收盤價問題跟Nthhighest函數的prompt如下


最終改寫出如下的程式碼,從原本70多行的程式碼縮減到14行,且程式碼也乾淨許多

3.5 手動調整錯誤
程式寫到這,應該沒啥錯誤了,但眼尖的你,可能會發現還是有點問題,如Nthhighest是需要三個參數的,但程式碼只有兩個,還有就是如果設定Settotalbar,在指標上就不會畫太長,而這點小錯誤,我大概就是手動自己修正了,修改如下
input: N(126, "近N日 (交易日) 數");
var: H1(0), H2(0), L1(0), L2(0);
//SetTotalBar(N);
H1 = NthHighest(1, GetField("收盤價"),N);
H2 = NthHighest(2, GetField("收盤價"),N);
L1 = NthLowest(1, GetField("收盤價"),N);
L2 = NthLowest(2, GetField("收盤價"),N);
Plot1(H1, "壓力 H1");
Plot2(H2, "壓力 H2");
Plot3(L1, "支撐 L1");
Plot4(L2, "支撐 L2");
4. 最終結果呈現
把指標放到主圖上,就能正確顯示網友需要的高低點的連線了~~

5. 總結
以上就是整個Debug的過程,給大家參考,不過,每個問題的解決方式都不一樣,可以把我上面的方式交互運用,應該能幫助您更好的運用AI,另外,真的要說下,如果你想要用AI撰寫XS程式碼,建議還是要學習XS基礎,這樣會讓你用的更順手,這個XQ推出的XS實戰七門課,就看看吧。
最後,如果你對本文用的AI有興趣,可以到量化交易實驗室註冊下帳號,可以免費試用,試用後覺得不錯,可以付費,或是訂閱XQ的年方案,A+策略網有合作促銷,可以免費兌換量化交易實驗室的AI使用喔
6. 程式碼
下面提供原本跟修正後的程式碼,供大家練習與比較
6.1 原本程式碼
以下是原本問題的程式碼,大家可以用我上面的方式試試,看能否改出來
input: N(126, "近N日 (交易日) 數");
var:
i(0), dayCount(0),
nowClose(0),
diff(0),
minHigh1(999999), minHigh2(999999),
minLow1(999999), minLow2(999999),
H1(0), H2(0), L1(0), L2(0),
lastDate(0);
// 建立用來儲存每日收盤價的陣列
array: dailyClose ;
// 只在每天最後一根K棒(13:30)記錄收盤價
if Date <> lastDate and Time = 1330 then begin
lastDate = Date;
// 若已超過 N 日,將最舊的移除
if dayCount < N then
dayCount = dayCount + 1
else begin
for i = 0 to N - 2 begin
dailyClose[i] = dailyClose[i + 1];
end;
end;
// 存入當天的收盤價
dailyClose[dayCount - 1] = Close;
end;
// 開始計算最接近現在價格的兩個高點與低點
nowClose = Close;
minHigh1 = 999999; minHigh2 = 999999;
minLow1 = 999999; minLow2 = 999999;
H1 = 0; H2 = 0; L1 = 0; L2 = 0;
for i = 0 to dayCount - 1 begin
diff = AbsValue(dailyClose[i] - nowClose);
// 高點邏輯:找比當前價高的最接近的兩個價
if dailyClose[i] >= nowClose then begin
if diff < minHigh1 then begin
minHigh2 = minHigh1;
H2 = H1;
minHigh1 = diff;
H1 = dailyClose[i];
end
else if diff < minHigh2 then begin
minHigh2 = diff;
H2 = dailyClose[i];
end;
end;
// 低點邏輯:找比當前價低的最接近的兩個價
if dailyClose[i] <= nowClose then begin
if diff < minLow1 then begin
minLow2 = minLow1;
L2 = L1;
minLow1 = diff;
L1 = dailyClose[i];
end
else if diff < minLow2 then begin
minLow2 = diff;
L2 = dailyClose[i];
end;
end;
end;
// 畫出支撐與壓力線
Plot1(H1, "壓力 H1");
Plot2(H2, "壓力 H2");
Plot3(L1, "支撐 L1");
Plot4(L2, "支撐 L2");
6.2 最終程式碼
以下為最終完成的程式碼
input: N(126, "近N日 (交易日) 數");
var: H1(0), H2(0), L1(0), L2(0);
//SetTotalBar(N);
H1 = NthHighest(1, GetField("收盤價"),N);
H2 = NthHighest(2, GetField("收盤價"),N);
L1 = NthLowest(1, GetField("收盤價"),N);
L2 = NthLowest(2, GetField("收盤價"),N);
Plot1(H1, "壓力 H1");
Plot2(H2, "壓力 H2");
Plot3(L1, "支撐 L1");
Plot4(L2, "支撐 L2");
發佈留言
很抱歉,必須登入網站才能發佈留言。