如何運用AI修正XS程式碼錯誤

2Shares
Image

在使用量化交易實驗室的AI撰寫XS程式碼的時候,如果編譯出現錯誤,對於XS程式碼不熟悉的朋友,往往不知道解決,本文將會使用實際案例,分享我的解決方式,希望能幫助更多人順利的運用AI來寫程式。

1. 前言

現在很多人都在用AI來寫程式,使用XQ的你,是不是超級羨慕也去嘗試讓AI撰寫XS程式碼了呢? 相信你試過之後的結果都會很失望吧,你以為他給你的是XS程式碼,但常常都是其他軟體的語法。

Image Not Found

這樣的結果是很正常的,主要是因為網路上可供AI學習的XS資源並不多,無法讓AI有效的學習,只能拿其他程式來忽悠你了。

想要讓AI能較為正確的撰寫XS程式碼,是需要另外訓練的,而市場上,只有量化實驗室的AI有針對XS語法做訓練,能夠較為正確的寫出XS程式碼,為何我會寫較為正確呢? 因為AI還是有其侷限性,不可能每次都寫出100%正確的程式碼,有錯都是很正常的。

Image Not Found

既然AI會出錯,那學習如何debug就會是非常重要的事,尤其是對XS還不熟悉的朋友,就一定要培養這樣的能力,至於如何學,我也還沒想出啥系統化的方式,所以先分享我debug的方式,或許能對你有些幫助。

2. 案例說明

以下是網友詢問的問題,網友想要寫一個XS指標,能夠找出最近一段時間內的最高點、次高點、最低點跟次低點並畫出來,程式碼已經讓AI寫出來了,但一直無法編譯成功

Image Not Found

完整有問題的程式碼我放在最下面,想要練習debug過程的,可以拿去試試

3. Debug過程

3.1 先編譯了解有那些錯誤

當拿到程式碼的時候,我第一個步驟不是去解讀程式碼,自己程式能力也沒很好,還是先丟給XScript編輯器編譯,看看有怎樣的錯誤再說,編譯後出現了如下方圖片的錯誤訊息,似乎有一堆錯誤,看了是不是頭很暈呢?

Image Not Found

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

Image Not Found

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” 沒有宣告。

下面為程式碼~~~

Image Not Found

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

Image Not Found

3.3 儘量採用內建函數

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

Image Not Found

像這種錯誤,通常就是計算的邏輯上有問題,而你如果有常常在用量化交易實驗室AI,應該會發現一個狀況,就是AI很喜歡自己寫計算式,不愛用XQ內建的函數來處理,自己寫沒問題,但出錯要debug對較不同程式的人就是個很頭痛的事了

如下方這段程式碼,看不懂程式碼,也可以看備註的說明,是在每天繼續收盤價,看到這個,只要你有寫過XS程式碼,應該馬上會有個疑問,為何要寫的這麼複雜,XS要抓到不同天的收盤價,不就是用中括號加上距離現在幾根K棒就可以了嗎? 如想要取得兩天前的收盤價,就用close[2]或getfield(“close”,”D”)

Image Not Found

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

Image Not Found

想要知道有沒有內建可用的,有幾種方法

1. 可以試試查看函數列表,但這還是最好對函數有點熟悉的人會比較好找

2.直接問問AI有沒有啥的函數可以用,如我問XQ有什麼內建函數可以找出一段數列中第n個最高值,AI就很聰明的告訴我有NthHighest這個函數可以用,不過,AI有時候也會耍笨,這個時候就要用第三個方法了。

Image Not Found

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

Image Not Found

3.4 用內建函數替代原本的計算式

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

Image Not Found

Image Not Found

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

Image Not Found

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. 最終結果呈現

把指標放到主圖上,就能正確顯示網友需要的高低點的連線了~~

Image Not Found

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");

2Shares


發佈留言

相關文章

[AI] 定期定額投資績效計算頁面

定期定額投資的績效表現在XQ上並不容易回測,本文將會介紹我如何運用量化交易實驗室的AI,在短時間內就寫出一個可以計算定期定投入績效的XQ看盤頁面。

[VIP] 投資節目老師報明牌行不行

如果還沒看到前一篇的文章,可以先閱讀下,這篇主要是說明頁面我做了那些調整,跟我觀察到的心得分享,希望對大家有幫助。

投資節目老師報明牌行不行

前幾天在搜薄碩士論文的時候,看到一篇有趣的研究,研究標題是-投資理財節目異常推介有價證券與投資人行為及報酬率檢視-以上櫃公司為例,相信很多人都會跟我一樣想要知道老師報的明牌到底有沒有用吧,結論是大部分情況是有用,不過研究只有一年,到底現在還能不能用呢?用了個頁面讓大家自己研究研究

[VIP] XQ自動交易不採坑: 交易進場日跟選股一致了嗎? (月、季、年資料)

上一篇跟大家分享了把日資料選股條件寫成自動交易腳本的正確方式,這篇文章將要繼續來分享月、季、年資料選股條件在自動交易內的正確撰寫方式。

最近發文

加入我們

Categories

最新留言