:HQChart與通達信公式實戰(zhàn))
簡介這份資源面向微信小程序開發(fā)者與股票行情應(yīng)用愛好者提供滬深及港股K線圖、走勢圖的完整實現(xiàn)方案并支持通達信語法解析適合具備一定前端基礎(chǔ)、希望在小程序內(nèi)搭建專業(yè)行情圖表的開發(fā)者參考。壓縮包共72個文件約1.14MB以JavaScript源碼為主輔以WXML、WXSS、JSON等小程序頁面與配置文件另含HTML、CSS演示頁、PNG圖標素材及字體文件結(jié)構(gòu)覆蓋行情模塊用例、分時圖、歷史K線圖與公式解析等核心部分。目前已有1078人學習下載熱度較高。讀者可從中獲取小程序行情圖表的目錄組織方式、數(shù)據(jù)獲取與處理思路、圖表渲染與手勢交互實現(xiàn)以及通達信指標公式的解析邏輯便于快速搭建或二次開發(fā)自己的股票分析小程序。1. 小程序里畫滬深港股K線為什么HQChart是繞不開的選項做過行情類小程序的人多半有過這種經(jīng)歷產(chǎn)品經(jīng)理丟過來一句“滬深和港股都要K線、分時、指標全上最好還能寫通達信公式”你打開開發(fā)者工具發(fā)現(xiàn)Canvas畫蠟燭圖本身不難難的是后面那一長串——前復權(quán)除權(quán)缺口、港股半日市、指標公式解析、十字光標聯(lián)動、雙指縮放慣性。自己從零擼一套兩周后大概率卡在“公式解析”和“性能”兩個黑匣子里。HQChart這類方案之所以被反復提起就是因為它把行情圖這塊最難啃的部分做成了可配置的組件滬深、港股、美股、期貨都能接還內(nèi)置了一套接近通達信語法的公式引擎。這篇筆記就圍繞“微信小程序 滬深/港股K線 通達信語法”這條線把選型理由、接入步驟、參數(shù)配置和踩過的坑講清楚適合已經(jīng)會寫小程序、正準備接行情圖的開發(fā)者也適合想評估這套方案值不值得投入的技術(shù)負責人。2. 拆開HQChart它到底替你做了哪些臟活2.1 行情圖的三層結(jié)構(gòu)與小程序的適配難點一套完整的行情圖拆開看是三層數(shù)據(jù)層負責K線、分時、盤口、指標數(shù)據(jù)的獲取與緩存渲染層負責把數(shù)據(jù)畫成蠟燭、均線、成交量柱交互層負責縮放、拖動、十字光標、長按查看。自己寫的話渲染層用小程序Canvas 2D勉強能扛但交互層在移動端要做慣性滾動和雙指縮放幀率很容易掉到30以下。HQChart把這套東西封裝成組件內(nèi)部用離屏Canvas做預渲染把靜態(tài)部分和動態(tài)部分分開滾動時只重繪變化區(qū)域。它同時支持Web和小程序兩套渲染后端小程序端走的是Canvas 2D接口避開了舊版Canvas的諸多限制。這意味著你不需要自己去處理設(shè)備像素比、滾動慣性、邊界回彈這些瑣碎但極耗時間的細節(jié)。2.2 通達信語法引擎公式不是字符串替換那么簡單很多人以為“支持通達信語法”就是把公式里的MA、EMA替換成JS函數(shù)實際遠不止。通達信公式有一套自己的執(zhí)行模型變量按周期逐根計算REF、HHV、LLV這類函數(shù)依賴歷史序列跨周期引用還要處理數(shù)據(jù)對齊。HQChart的公式引擎把這些函數(shù)做成了內(nèi)置算子你傳入公式字符串它解析成語法樹后按K線序列逐根求值。常見指標如MACD、KDJ、BOLL都有內(nèi)置實現(xiàn)自定義公式則通過配置項掛載。這里有個關(guān)鍵點公式里的參數(shù)如MA的周期需要你在配置里聲明引擎不會自動推斷。港股和滬深在交易日歷上不同公式計算時如果數(shù)據(jù)序列有缺口結(jié)果會偏所以數(shù)據(jù)源必須保證連續(xù)性。2.3 滬深與港股的數(shù)據(jù)結(jié)構(gòu)差異滬深和港股在K線數(shù)據(jù)上最明顯的差異是交易時段和復權(quán)方式。滬深有集合競價、連續(xù)競價、午休港股還有半日市和臺風休市。HQChart本身不提供數(shù)據(jù)它只負責畫數(shù)據(jù)要你自己從行情源拉。常見做法是后端統(tǒng)一轉(zhuǎn)成它要求的格式每根K線包含時間、開、高、低、收、成交量、成交額時間戳用毫秒。港股數(shù)據(jù)要注意時區(qū)建議統(tǒng)一轉(zhuǎn)成UTC8再傳入否則十字光標顯示的時間會錯位。復權(quán)方面前復權(quán)數(shù)據(jù)需要你在后端算好HQChart不做復權(quán)計算它只按你給的價格畫。如果你傳的是不復權(quán)數(shù)據(jù)除權(quán)日會出現(xiàn)巨大缺口用戶一眼就能看出來。3. 在小程序里跑通第一張K線圖從引入到渲染3.1 工程結(jié)構(gòu)與組件引入HQChart在小程序里的接入方式通常有兩種一種是把源碼包里的dist目錄拷貝到小程序工程用require引入另一種是把它封裝成自定義組件在頁面json里注冊。我一般用后者因為組件化后頁面邏輯更干凈。假設(shè)你已經(jīng)拿到了源碼包解壓后找到小程序?qū)S玫臉?gòu)建產(chǎn)物目錄結(jié)構(gòu)大致是hqchart.js、hqchart.wxss和一個示例頁面。把js和wxss放到工程的utils或components目錄下然后在頁面json里聲明組件。注意小程序?qū)Πw積有限制主包超過2M會報錯所以建議把行情圖放在分包里或者用分包異步化加載。// page.json { usingComponents: { hq-chart: /components/hqchart/hqchart } }這段配置的作用是把HQChart注冊為當前頁面可用的自定義組件。路徑要和你實際存放的位置一致大小寫敏感。如果組件內(nèi)部還依賴其他文件比如公式引擎的worker腳本要確保這些文件也被拷貝進來否則運行時會報模塊找不到。3.2 初始化配置滬深與港股的關(guān)鍵參數(shù)初始化是接入過程中最容易翻車的一步因為參數(shù)多且默認值不一定適合你的場景。下面是一份我常用的配置骨架覆蓋了滬深和港股的基本需求。// page.js const config { // 類型0表示K線1表示分時 type: 0, // 市場滬深用0港股用1具體以源碼包內(nèi)枚舉為準 market: 0, // 復權(quán)0不復權(quán)1前復權(quán)2后復權(quán) right: 1, // 周期0日線1周線2月線3分鐘線等 period: 0, // 指標窗口可多個 windows: [ { index: MA, name: 均線 }, { index: MACD, name: MACD } ], // 是否顯示成交量 showVolume: true, // 十字光標 crossCursor: { show: true }, // 縮放 zoom: { enable: true, max: 10, min: 1 } };這里每個參數(shù)都影響最終呈現(xiàn)。market決定內(nèi)部交易日歷和漲跌停顏色規(guī)則港股默認是綠漲紅跌和滬深相反如果你不設(shè)置用戶會以為顏色錯了。right控制復權(quán)前復權(quán)適合看歷史走勢后復權(quán)適合算收益。period決定數(shù)據(jù)粒度分鐘線需要你的數(shù)據(jù)源支持。windows里的index是公式引擎的內(nèi)置指標名寫錯會靜默失敗圖上是空的。crossCursor和zoom是交互開關(guān)移動端建議都開。3.3 喂數(shù)據(jù)K線數(shù)組的格式與更新時機HQChart不主動拉數(shù)據(jù)它通過回調(diào)或方法調(diào)用讓你把數(shù)據(jù)塞進去。常見做法是在頁面onLoad時先請求一批歷史K線渲染出圖然后通過WebSocket或輪詢更新最后一根。數(shù)據(jù)格式要求是數(shù)組每項包含時間、開高低收、量額。下面是一個構(gòu)造示例。// 構(gòu)造K線數(shù)據(jù) function buildKLineData(rawList) { return rawList.map(item ({ time: item.timestamp, // 毫秒時間戳 open: item.open, high: item.high, low: item.low, close: item.close, volume: item.volume, amount: item.amount || 0 })); } // 頁面中調(diào)用 const chart this.selectComponent(#hqChart); chart.setData(buildKLineData(historyList));時間戳必須是毫秒秒級時間戳會導致時間軸錯亂。volume和amount單位要統(tǒng)一港股有的數(shù)據(jù)源給的是股數(shù)有的是手數(shù)傳錯會導致成交量柱高度異常。更新最后一根K線時不要重新setData整個數(shù)組HQChart提供了updateLastData之類的方法只更新最后一根性能差別很大。如果數(shù)據(jù)源返回的K線時間不是連續(xù)的比如停牌日缺失HQChart會按索引畫不會自動補缺口所以后端最好補齊或前端做映射。4. 通達信公式接入從寫公式到掛到指標窗口4.1 公式引擎的調(diào)用方式與參數(shù)聲明HQChart的公式引擎通常通過一個全局對象暴露比如HQChart.Formula或類似命名。你傳入公式字符串和參數(shù)對象它返回計算后的序列。下面是一個自定義均線的例子。// 自定義公式兩條均線 const formula MA1:MA(CLOSE, N1); MA2:MA(CLOSE, N2);; const params { N1: 5, N2: 20 }; const result HQChart.Formula.Calculate(formula, kLineData, params); // result.MA1 和 result.MA2 是計算后的數(shù)組公式里的N1、N2必須在params里聲明否則引擎會當成未定義變量計算結(jié)果全是NaN。公式末尾的分號不能少多行公式用分號分隔。返回的結(jié)果是按K線順序的數(shù)組長度和輸入數(shù)據(jù)一致。如果公式里用了REF、HHV這類依賴歷史的函數(shù)前幾根K線可能返回空值這是正常的畫圖時跳過即可。4.2 把公式掛到指標窗口算出來的指標要顯示在圖上需要配置到windows里。HQChart支持兩種方式一種是直接用內(nèi)置指標名比如MACD、KDJ另一種是傳入自定義公式。自定義時windows的配置項要帶上公式字符串和參數(shù)。const customWindow { index: CUSTOM, name: 我的均線, formula: MA1:MA(CLOSE, N1); MA2:MA(CLOSE, N2);, params: { N1: 5, N2: 20 }, // 畫線樣式 lineStyle: [ { color: #FF0000, width: 1 }, { color: #0000FF, width: 1 } ] };index寫CUSTOM表示自定義name是顯示在窗口標題上的文字。formula和params要和前面計算時一致否則圖上顯示的和實際算的對不上。lineStyle數(shù)組的順序?qū)?yīng)公式里輸出的順序MA1用第一個樣式MA2用第二個。如果公式輸出的是柱狀圖比如MACD的柱需要額外配置drawType為柱狀。4.3 港股公式計算的注意事項港股和滬深在公式計算上最大的差異是數(shù)據(jù)序列的連續(xù)性。港股有半日市下午只有兩小時交易如果你按固定根數(shù)取數(shù)據(jù)半日市那天的K線根數(shù)會少導致均線值偏移。解決辦法是在后端把半日市的數(shù)據(jù)補齊到正常交易時段或者在前端計算時按交易日歷對齊。另外港股的收盤價有時會有競價后的調(diào)整如果你用的數(shù)據(jù)源在收盤后更新了最后一根K線公式結(jié)果會變所以建議在收盤后固定一個時間點再算指標避免盤中頻繁重算。5. 避坑與排查那些讓我加班到凌晨的細節(jié)5.1 圖表白屏或只顯示一半現(xiàn)象是頁面加載后圖表區(qū)域空白或者只畫了左邊一半。原因通常是Canvas尺寸沒拿到或者初始化時機太早。小程序的Canvas 2D需要等節(jié)點查詢完成后再操作如果在onLoad里直接初始化節(jié)點還沒掛載寬高是0。解決方法是把初始化放到onReady里或者用SelectorQuery拿到節(jié)點后再調(diào)chart.init。另一個原因是容器樣式?jīng)]給高度HQChart按容器高度算畫布高度為0自然畫不出來。5.2 十字光標時間顯示錯位移動端長按出現(xiàn)十字光標但顯示的時間比實際K線時間差了幾個小時。這是時區(qū)問題。滬深數(shù)據(jù)一般給的是本地時間港股數(shù)據(jù)可能給的是UTC或帶時區(qū)的時間戳。HQChart內(nèi)部按時間戳畫但顯示時用的是本地時區(qū)。解決辦法是統(tǒng)一在傳入前把時間轉(zhuǎn)成UTC8的毫秒時間戳或者配置時區(qū)偏移參數(shù)。如果數(shù)據(jù)源給的是字符串時間先轉(zhuǎn)成Date再取getTime不要直接parse不同設(shè)備對字符串解析結(jié)果不一致。5.3 公式計算結(jié)果全是NaN自定義公式掛上去后指標窗口一片空白控制臺沒有報錯。原因通常是參數(shù)沒聲明或者公式里用了引擎不支持的函數(shù)。先檢查params里是否包含了公式里所有變量再檢查函數(shù)名大小寫通達信函數(shù)一般是大寫但引擎可能只實現(xiàn)了部分。如果用了未來函數(shù)比如ZIG引擎可能直接返回空。排查方法是先用一個最簡單的公式MA(CLOSE,5)測試能出結(jié)果再逐步加復雜度。5.4 港股顏色反了港股默認綠漲紅跌和滬深相反。如果你沒設(shè)置market參數(shù)HQChart按滬深規(guī)則畫用戶看到漲是紅色會以為數(shù)據(jù)錯了。解決方法是初始化時把market設(shè)為港股對應(yīng)的枚舉值或者在配置里單獨指定漲跌顏色。有些版本還支持自定義顏色數(shù)組但要注意數(shù)組順序是漲在前還是跌在前不同版本可能不一樣最好查一下源碼包里的示例。5.5 包體積超限導致上傳失敗小程序主包限制2MHQChart的完整包加上公式引擎可能接近這個數(shù)。如果你還引入了其他庫很容易超。解決辦法是把行情圖相關(guān)代碼放到分包用分包預下載或異步加載。另外可以裁剪掉不需要的市場和指標源碼包里通常有構(gòu)建腳本可以只打包滬深和港股去掉美股期貨。如果還是超檢查有沒有重復引入的polyfill小程序環(huán)境不需要那么多兼容代碼。6. 進階讓K線圖更接近專業(yè)終端6.1 多指標疊加與窗口聯(lián)動專業(yè)終端里主圖疊加均線和BOLL副圖放MACD和KDJ窗口之間十字光標聯(lián)動。HQChart支持多窗口配置windows數(shù)組即可。聯(lián)動需要開啟crossCursor的link屬性這樣在一個窗口移動光標其他窗口會同步顯示同一時間點的值。實現(xiàn)上你需要在配置里把link設(shè)為true并確保所有窗口的數(shù)據(jù)長度一致。如果某個窗口數(shù)據(jù)短了聯(lián)動會錯位。6.2 用公式做條件選股與標記通達信公式不僅能畫線還能做條件判斷。比如你想在圖上標記金叉點可以寫一個返回0和1的公式然后在HQChart里配置成標記點。常見做法是公式輸出一個序列值為1時畫圖標。HQChart支持自定義繪制回調(diào)你可以在回調(diào)里根據(jù)公式結(jié)果畫三角形或圓點。這個功能適合做回測可視化但要注意性能標記點太多會拖慢渲染。6.3 性能調(diào)優(yōu)數(shù)據(jù)量與幀率K線根數(shù)超過2000根后滾動會開始掉幀。優(yōu)化手段有幾個一是限制返回的K線數(shù)量一般看盤500到1000根足夠需要更多時用分頁加載二是關(guān)閉不必要的動畫比如縮放時的緩動三是用HQChart提供的setOption動態(tài)調(diào)整渲染精度比如滾動時降低采樣停止后再恢復。我一般會在配置里把maxDataCount設(shè)為1000超過就截斷用戶往回拖時再請求更早的數(shù)據(jù)。6.4 一個我常備的排查習慣每次接入新數(shù)據(jù)源我會先寫一個最小頁面只畫20根K線不帶任何指標確認渲染和交互正常后再逐步加公式和窗口。這樣出問題時能快速定位是數(shù)據(jù)格式、配置還是引擎本身。另外HQChart的源碼包里通常有示例頁面遇到不確定的參數(shù)直接翻示例比查文檔快。最后提醒一句行情數(shù)據(jù)有延遲展示時最好在角落標一下數(shù)據(jù)時間避免用戶誤判。希望幫到你。本文還有配套的精品資源點擊獲取