在iOS行情类应用中,使用Core Graphics自行绘制股票K线图的技术指标,既能摆脱庞大第三方库的束缚,也能灵活定制视觉风格。相对强弱指标RSI是短线交易者观察超买超卖与潜在反转的重要工具,通过在Core Graphics的绘图上下文中计算并渲染,可让K线图具备专业看盘能力。

一、RSI指标的计算原理与实现步骤
RSI全称为Relative Strength Index,由Welles Wilder提出,用于衡量一段时间内价格上涨幅度与下跌幅度的相对强弱。其常用周期为14,计算逻辑是先分离出每根K线的上涨收益与下跌损失,再分别求取平均,最后套用公式得到0到100之间的数值。在iOS端,我们可从本地或接口获取的日线数组出发,遍历收盘价完成统计。
具体实现时,先定义两个累加变量:upSum与downSum。从第二根K线开始,若当日收盘高于前日,则差额计入upSum;若低于前日,则绝对值计入downSum。初始周期走完后,采用平滑移动方式更新均值,即新的平均上涨等于(前平均上涨乘以13加当日上涨)除以14。得到平均上涨与平均下跌后,RS=平均上涨除以平均下跌,RSI=100减去100除以(1加RS)。该过程可直接写在UIView子类的计算方法中,不依赖任何绘图框架。
1.1 核心计算代码示例结构
虽然不使用脚本标签,但我们可以用伪结构说明。创建一个继承自UIView的KLineRSIView,在layoutSubviews或draw方法中调用calculateRSI方法。方法内部持有NSMutableArray保存每日RSI结果,供后续绘制读取。注意处理前13根数据不足的情况,可只画已有RSI线,避免数组越界。
为了让计算与绘制解耦,建议将RSI数组作为属性暴露,由网络层刷新后触发setNeedsDisplay。这样当用户滑动时间周期切换为7或21时,只需改传入参数重新计算,绘图逻辑保持不动,降低维护成本。
二、超买超卖区域的标记方法
传统经验把RSI高于70视为超买,低于30视为超卖。在Core Graphics里标记这些区域,本质是在坐标系中找到Y轴对应数值的位置,再用半透明填充矩形表达。由于K线图纵轴一般按价格映射,而RSI固定在0到100,常见做法是在主图上方或下方嵌入独立指标子视图,其高度固定,Y映射直接采用比例法。
绘制时,先通过CGRect获取指标区高度,例如总高80点,则每单位RSI对应0.8点。70线位置为(100减70)乘0.8,从顶部往下量。用CGContextSetRGBFillColor填入淡红,CGContextFillRect画出自顶至70线的区域,表示超买带。同理超卖带用淡绿。这样交易者一眼可看出当前RSI落入哪一侧,辅助决策减仓或抄底。
2.1 区域与临界线的视觉层次
为避免遮挡RSI折线,建议先画区域色块,再画水平虚线,最后画指标线。水平线可用CGContextSetLineDash设置短划,颜色用深灰。区域填充透明度控制在0.15左右,既醒目又不抢眼。若产品要求夜间模式,可读取traitCollection.userInterfaceStyle切换红绿深浅。
在实盘场景中,仅仅标出区域还不够。许多用户会在70以上继续追涨,此时可在视图右上角用Core Text绘制“超买”二字,字号十二,颜色匹配区块。这种细节能显著降低新手误读概率,也体现自绘方案的可定制优势。
三、背离信号的检测与图形提示
背离指价格走势与RSI走势不一致。顶背离为价格创新高而RSI高点降低,常预示上涨动能衰减;底背离则相反。用Core Graphics检测背离,需要在计算完RSI后,扫描最近N根K线的高低点。可封装一个findDivergence方法,比较峰值索引对应的收盘与RSI值。
当确认顶背离,我们在两个峰值间用CGContextStrokeLineSegments画一条细连线,并在后一峰值旁绘制向下箭头或警示圆点。底背离则用向上箭头。由于Core Graphics处于同一上下文,这些标记和K线、RSI线共享坐标系,不会像叠加多个视图那样产生错位。实践中建议只在回看周期中标出背离,实时最后一根K线因未闭合不参与判定,防止假信号。
3.1 背离判定的参数权衡
若允许任意两根K线比较,会产生大量噪音背离。稳妥做法是要求价格峰值间隔至少5根,且RSI差值大于4。也可引入斜率:连接两段RSI高点的线段斜率为负才认定顶背离。下表列出常用参数组合供参考。
| 参数名称 | 保守设置 | 敏感设置 |
|---|---|---|
| 最小间隔根数 | 8 | 5 |
| RSI差值阈值 | 6 | 3 |
| 价格新高容差 | 0.1% | 0% |
上表说明,保守设置适合日线长周期,减少主观干扰;敏感设置用于分时短线,能更早提示风险。无论哪种,都应在绘制前于后台线程完成计算,主线程只做纯绘制,保证滑动流畅。
四、性能与坐标映射要点
Core Graphics绘制属CPU光栅化,当K线数量超五百根又叠加RSI,掉帧可能出现。优化方式包括:只重绘可见区间,利用CGFloat精度做横向压缩;将静态区域与文字缓存为图像,动态线每次清空重画。坐标映射推荐使用归一化函数,把索引映射为X,把数值映射为Y,避免硬编码。
另外,设备比例scale影响线宽。调用UIScreen.main.scale并在CGContextScaleCTM中乘以scale,可让线在视网膜屏清晰不虚。若应用支持横屏,需在viewWillTransition中重算尺寸并setNeedsDisplay,使RSI区域随宽度自适应,保持视觉比例一致。
综合来看,使用Core Graphics实现iOS端股票K线图RSI,核心在于分离计算与绘制、规范坐标映射、合理标记超买超卖与背离。掌握这些,便能用轻量代码交付专业级看盘界面。
Core_GraphicsiOS_K线图RSI指标修改时间:2026-08-11 00:15:35