/// 腳本類型:指標腳本
// 腳本名稱:Group統計大於均線百分比
使用AI幫忙編程式最後能跑出來的資料,好像會跟著股票的數量呈反比。
如果是電子全部下面指標可以顯示3個月,上市普通股全部只有一個月
這種問題不知道是AI程式的邏輯問題? 還是是資料讀取有上限?
想請問要怎麼處理呢
沒看到程式碼,很難得知問題出在哪裡。照理說,使用日資料,不應該只得到這麼少的指標數據。
你的程式碼有問題。你把原始碼貼上來,我來修改看看。
/// 腳本類型:指標腳本
// 腳本名稱:Group統計大於均線百分比
// ----------------------------------------------------------------------------
// 0. 強制擴大歷史資料引用範圍 (幫助老股回溯)
// ----------------------------------------------------------------------------
// 提醒:指標回溯長度仍受限於群組內上市時間最短的股票,但此設定能盡量回溯。
SetTotalBar(500);
// ----------------------------------------------------------------------------
// 1. 設定參數與變數宣告 (請遵守 XS 規範:var 只含名稱與初始值)
// ----------------------------------------------------------------------------
// 檢查執行頻率:此腳本只支援日K或還原日K
if BarFreq <> "D" and BarFreq <> "AD" then
raiseRunTimeError("此腳本只支援日K或還原日K");
input: _TargetGroup(group, "指定群組"); // 指定欲統計的股票群組名稱 (例如: 上市普通股)
input: _MALength(60, "均線期數"); // 將 MA 期數的參數保留,並在迴圈內使用
var: _Idx(0); // 遍歷股票清單用的索引變數
var: _Count(0); // 統計符合「站上均線」條件的股票家數
var: _TotalSize(0); // 群組內的總股票檔數
var: _Percent(0); // 符合條件家數佔總家數的百分比
// ----------------------------------- 計算變數 -----------------------------------
var: _PriceSum(0); // 計算 MA 時的收盤價總和
var: _MAValue(0); // 計算出的 MA 數值
var: _CurrentClose(0); // 取得前一日收盤價 (判斷基準)
var: _j(0); // 遍歷 MA 期數用的索引變數
var: _HistoryClose(0); // 取得歷史收盤價
var: _ValidBarCount(0); // 有效 K 棒數量
// ----------------------------------------------------------------------------
// 2. 執行運算:統計符合站上前日均線條件的家數
// ----------------------------------------------------------------------------
_Count = 0; // 將計數器歸零
_TotalSize = GroupSize(_TargetGroup);
_Percent = 0; // 將百分比結果初始化
// 判斷條件:確保群組內有股票 //
if _TotalSize > 0 then
begin
// 遍歷群組中的每一檔股票,索引從 1 到總檔數 //
for _Idx = 1 to _TotalSize
begin
// --- 核心邏輯:檢查歷史資料是否足夠,不足則跳過所有計算 ---
// ?? 判斷:檢查該股票在 _MALength 期前是否有收盤價
// 只有當 GetSymbolField 能夠取到 _MALength 期的資料時,我們才執行後續的計算區塊。
if GetSymbolField(_TargetGroup[_Idx], "Close", "D")[_MALength] > 0 then
begin
// 該股票有足夠的歷史資料,可以計算 MA
// 1. 初始化總和與有效K棒計數
_PriceSum = 0;
_ValidBarCount = 0;
// 2. 遍歷 MA 期數,取得該股票過去 N 日的收盤價總和
for _j = 1 to _MALength
begin
// 取得 N 期前的收盤價
_HistoryClose = GetSymbolField(_TargetGroup[_Idx], "Close", "D")[_j];
// 只將有效的 (收盤價 > 0) 資料納入計算
if _HistoryClose > 0 then
begin
_PriceSum = _PriceSum + _HistoryClose;
_ValidBarCount = _ValidBarCount + 1;
end;
end;
// 3. 計算 MA 數值
if _ValidBarCount > 0 then
_MAValue = _PriceSum / _ValidBarCount
else
_MAValue = 0;
// 4. 取得判斷基準:前一日收盤價 (Close[1])
_CurrentClose = GetSymbolField(_TargetGroup[_Idx], "Close", "D")[1];
// 5. 判斷是否站上均線
if _CurrentClose > 0 and _MAValue > 0 and _CurrentClose > _MAValue then
_Count = _Count + 1;
end; // End of if GetSymbolField... > 0 (資料足夠的股票才進行計算)
end; // End of for _Idx
// 計算百分比:符合條件家數(_Count) / 總家數(_TotalSize) * 100 //
_Percent = (_Count / _TotalSize) * 100; // 計算結果為百分比
end;
// ----------------------------------------------------------------------------
// 3. 繪製結果
// ----------------------------------------------------------------------------
// 繪製結果:Plot1 繪製計算出的百分比序列 //
Plot1(_Percent, "大於均線百分比");
5 評論