MATLAB 在數據分析、可視化領域無可替代,但其腳本語言特性導致大規模文件讀取效率較低。通過編寫 MEX (MATLAB Executable) 函數,我們可以用 C/C++ 實現底層高速文件解析,再將結構化數據無縫傳遞給 MATLAB 進行後續建模與繪圖。本文完整記錄一個讀取通達信格式(.day)股票日線數據的 MEX 接口開發過程。
通達信 .day 文件每條記錄固定 32 字節,對應以下結構體:
typedef struct {
DWORD dt; // 日期,如 20031110
DWORD k_price; // 開盤價 * 0.01
DWORD h_price; // 最高價 * 0.01
DWORD l_price; // 最低價 * 0.01
DWORD s_price; // 收盤價 * 0.01
float s_tolmoney; // 成交金額(億)
DWORD bur_tol; // 成交量
DWORD unknown; // 保留字段
} ST_K_DATE;
mexFunction 是 MEX 的唯一入口,參數說明:
nlhs, plhs[]:輸出參數個數與數組nrhs, prhs[]:輸入參數個數與數組(此處:股票代碼字符串、讀取天數)mxGetString 獲取股票代碼,mxGetPr 獲取天數。D:\jcb_hxzq\vipdoc\sh\lday\sh600477.day)。fseek 定位到文件末尾前 N 條記錄,一次性 fread 讀入內存緩衝區,避免逐行讀取開銷。mxCreateStructArray 創建包含「日期、開盤價、最高價、最低價、收盤價、成交金額、成交量」7 個字段的結構體數組,並逐字段填充 double 型數據(價格已轉換為實際值)。> mex welcom.c
> [s, kp, hp, lp, sp, tm, vol] = welcom('600477', 10);
> candle(kp', lp', sp', kp', 'red'); % 繪製 K 線圖

該接口將文件 I/O 耗時從秒級降至毫秒級,為後續在 MATLAB 中進行技術指標計算、策略回測、機器學習特徵工程奠定了高性能數據基礎。可進一步擴展支援分鐘線、Tick 級數據,或封裝為通用數據讀取工具箱。