{"id":18648561,"url":"https://github.com/zhiquan911/chklinechart","last_synced_at":"2025-04-04T10:09:06.891Z","repository":{"id":56904596,"uuid":"68582003","full_name":"zhiquan911/CHKLineChart","owner":"zhiquan911","description":"纯Swift4.0代码编写的K线图表组件，支持：MA,EMA,BOLL,SAR,KDJ,MACD等技术指标显示。集成使用简单，二次开发扩展强大","archived":false,"fork":false,"pushed_at":"2024-06-13T02:35:15.000Z","size":38661,"stargazers_count":457,"open_issues_count":10,"forks_count":136,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-03-28T09:08:19.369Z","etag":null,"topics":["bitcoin","candlelinechart","kline","stocks","swift"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhiquan911.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-09-19T07:50:57.000Z","updated_at":"2025-03-19T15:09:24.000Z","dependencies_parsed_at":"2022-08-21T02:50:22.060Z","dependency_job_id":"133a386b-c7b6-4280-96f6-2cffe05a4de9","html_url":"https://github.com/zhiquan911/CHKLineChart","commit_stats":{"total_commits":123,"total_committers":7,"mean_commits":"17.571428571428573","dds":0.06504065040650409,"last_synced_commit":"f176bb42c14c3fe9d4f04f1f0dc00025dbd26db8"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhiquan911%2FCHKLineChart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhiquan911%2FCHKLineChart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhiquan911%2FCHKLineChart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhiquan911%2FCHKLineChart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhiquan911","download_url":"https://codeload.github.com/zhiquan911/CHKLineChart/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247157283,"owners_count":20893220,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bitcoin","candlelinechart","kline","stocks","swift"],"created_at":"2024-11-07T06:32:12.246Z","updated_at":"2025-04-04T10:09:06.866Z","avatar_url":"https://github.com/zhiquan911.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CHKLineChart\n\n![s1.png](/screenshots/s1.png)\n![s2.png](/screenshots/s2.png)![s3.png](/screenshots/s3.png)\n![s4.png](/screenshots/s4.png)![s5.png](/screenshots/s5.png)\n\n\u003e 纯Swift4.0代码编写的K线图表组件，支持：MA,EMA,KDJ,MACD,RSI等技术指标显示。集成使用简单，二次开发扩展强大。\n\n## Features\n\n- 完美支持Swift4.0编译。\n- 线图丰富，蜡烛图，时分图，柱状图，提供画线扩展模型。\n- 目前支持MA,EMA,BOLL,SAR,KDJ,MACD,RSI等技术指标，提供指标算法扩展模型。\n- 支持使用代码创建视图或使用xib/storyboard创建视图。\n- 样式提供更多配置，满足更多商业定制。\n- 底层采用CALayer+UIBezierPath绘制图表，大大提高性能。\n\n## Requirements\n\n- iOS 8+\n- Xcode 8+\n- Swift 4.0+\n- iPhone/iPad\n\n## Installation\n\n### CocoaPods\n\n[CocoaPods](http://cocoapods.org/) is a dependency manager for Cocoa projects.\n\nYou can install it with the following command:\n\n```java\n$ gem install cocoapods\n```\n\nTo integrate Log into your Xcode project using CocoaPods, specify it in your Podfile:\n\n```java\nuse_frameworks!\n\npod 'CHKLineChartKit'\n```\n\n### Manual\n\n打开文件夹/CHKLineChart/Carthage/Build/iOS/，复制CHKLineChartKit.framework到你的项目文件夹中。在Project -\u003e Target -\u003e General -\u003e Embedded Binaries，点+，导入CHKLineChartKit.framework。\n\n## Example\n\n详细例子，打开Example/Example.xcworkspace，参考ChartCustomViewController的例子。\n\n应用代码片段：\n\n```swift\n\nimport CHKLineChartKit\n\nclass ChartCustomViewController: UIViewController {\n\n    /// 数据源\n    var klineDatas = [KlineChartData]()\n\n    /// 图表\n    lazy var chartView: CHKLineChartView = {\n        let chartView = CHKLineChartView(frame: CGRect.zero)\n        chartView.style = .base       //默认样式\n        chartView.delegate = self\n        return chartView\n    }()\n\n    override func viewDidLoad() {\n        self.view.addSubview(self.chartView)\n    }\n\n    override func viewDidLayoutSubviews() {\n        self.chartView.frame = self.view.bounds\n    }\n\n}\n\n// MARK: - 实现K线图表的委托方法\nextension ChartCustomViewController: CHKLineChartDelegate {\n    \n    /// 图表显示数据总数\n    func numberOfPointsInKLineChart(chart: CHKLineChartView) -\u003e Int {\n        return self.klineDatas.count\n    }\n    \n    /// 提供图表数据源\n    func kLineChart(chart: CHKLineChartView, valueForPointAtIndex index: Int) -\u003e CHChartItem {\n        let data = self.klineDatas[index]\n        let item = CHChartItem()\n        item.time = data.time\n        item.openPrice = CGFloat(data.openPrice)\n        item.highPrice = CGFloat(data.highPrice)\n        item.lowPrice = CGFloat(data.lowPrice)\n        item.closePrice = CGFloat(data.closePrice)\n        item.vol = CGFloat(data.vol)\n        return item\n    }\n    \n    /// 自定义Y轴坐标值显示内容\n    func kLineChart(chart: CHKLineChartView, labelOnYAxisForValue value: CGFloat, atIndex index: Int, section: CHSection) -\u003e String {\n        var strValue = \"\"\n        if section.key == \"volume\" {\n            if value / 1000 \u003e 1 {\n                strValue = (value / 1000).ch_toString(maxF: section.decimal) + \"K\"\n            } else {\n                strValue = value.ch_toString(maxF: section.decimal)\n            }\n        } else {\n            strValue = value.ch_toString(maxF: section.decimal)\n        }\n        \n        return strValue\n    }\n    \n    /// 自定义X轴坐标值显示内容\n    func kLineChart(chart: CHKLineChartView, labelOnXAxisForIndex index: Int) -\u003e String {\n        let data = self.klineDatas[index]\n        let timestamp = data.time\n        let dayText = Date.ch_getTimeByStamp(timestamp, format: \"MM-dd\")\n        let timeText = Date.ch_getTimeByStamp(timestamp, format: \"HH:mm\")\n        var text = \"\"\n        //跨日，显示日期\n        if dayText != self.chartXAxisPrevDay \u0026\u0026 index \u003e 0 {\n            text = dayText\n        } else {\n            text = timeText\n        }\n        self.chartXAxisPrevDay = dayText\n        return text\n    }\n    \n    \n    /// 调整每个分区的小数位保留数\n    ///\n    /// - parameter chart:\n    /// - parameter section:\n    ///\n    /// - returns:\n    func kLineChart(chart: CHKLineChartView, decimalAt section: Int) -\u003e Int {\n        return 2\n    }\n}\n\n```\n\n## Custom Index（开发自定义指标）\n\n本K线图表最大的一个亮点就是提供了非常容易的指标开发入口。\n如何开发自己的指标呢？步骤如下：\n\n**1. 开发者需要实现\bCHChartAlgorithmProtocol。例子参考CHChartAlgorithm\b枚举。**\n\n```swift\n\n/**\n 常用技术指标算法\n */\npublic enum CHChartAlgorithm: CHChartAlgorithmProtocol {\n    \n    case none                                   //无算法\n    case timeline                               //时分\n    case ma(Int)                                //简单移动平均数\n    case ema(Int)                               //指数移动平均数\n    case kdj(Int, Int, Int)                     //随机指标\n    case macd(Int, Int, Int)                    //指数平滑异同平均线\n    case boll(Int, Int)                         //布林线\n    case sar(Int, CGFloat, CGFloat)             //停损转向操作点指标(判定周期，加速因子初值，加速因子最大值)\n    case sam(Int)                               //SAM指标公式\n    \n    /**\n     处理算法\n     \n     - parameter datas:\n     \n     - returns:\n     */\n    public func handleAlgorithm(_ datas: [CHChartItem]) -\u003e [CHChartItem] {\n        switch self {\n        case .none:\n            return datas\n        case .timeline:\n            return self.handleTimeline(datas: datas)\n        case let .ma(num):\n            return self.handleMA(num, datas: datas)\n        case let .ema(num):\n            return self.handleEMA(num, datas: datas)\n        case let .kdj(p1, p2, p3):\n            return self.handleKDJ(p1, p2: p2, p3: p3, datas: datas)\n        case let .macd(p1, p2, p3):\n            return self.handleMACD(p1, p2: p2, p3: p3, datas: datas)\n        case let .boll(num, k):\n            return self.handleBOLL(num, k: k, datas: datas)\n        case let .sar(num, minAF, maxAF):\n            return self.handleSAR(num,minAF: minAF, maxAF: maxAF, datas: datas)\n        case let .sam(num):\n            return self.handleSAM(num, datas: datas)\n        }\n    }\n\n    ......\n\n\n}\n```\n\n**2. extension CHSeries，编写自己的线组。**\n\n```swift\n\n// MARK: - 工厂方法\nextension CHSeries {\n    \n    /**\n     返回一个MACD系列样式\n     */\n    public class func getMACD(_ difc: UIColor,\n                              deac: UIColor,\n                              barc: UIColor,\n                              upStyle: (color: UIColor, isSolid: Bool),\n                              downStyle: (color: UIColor, isSolid: Bool),\n                              section: CHSection) -\u003e CHSeries {\n        let series = CHSeries()\n        series.key = CHSeriesKey.macd\n        let dif = CHChartModel.getLine(difc, title: \"DIF\", key: \"\\(CHSeriesKey.macd)_DIF\")\n        dif.section = section\n        let dea = CHChartModel.getLine(deac, title: \"DEA\", key: \"\\(CHSeriesKey.macd)_DEA\")\n        dea.section = section\n        let bar = CHChartModel.getBar(upStyle: upStyle, downStyle: downStyle, titleColor: barc, title: \"MACD\", key: \"\\(CHSeriesKey.macd)_BAR\")\n        bar.section = section\n        series.chartModels = [bar, dif, dea]\n        return series\n    }\n}\n\n```\n\n**3. 如果现有的线模型无法满足你，你可以新建类继承CHChartModel，重载drawSerie方法。**\n\n```swift\n\n/**\n *  圆点样式模型\n */\nopen class CHRoundModel: CHChartModel {\n\n    open override func drawSerie(_ startIndex: Int, endIndex: Int) -\u003e CAShapeLayer {\n    ......\n    }\n}\n\n// MARK: - 工厂方法\nextension CHChartModel {\n\n    //生成一个圆点样式\n    class func getRound(upStyle: (color: UIColor, isSolid: Bool),\n                        downStyle: (color: UIColor, isSolid: Bool),\n                        titleColor: UIColor, title: String,\n                        plotPaddingExt: CGFloat,\n                        key: String) -\u003e CHRoundModel {\n        let model = CHRoundModel(upStyle: upStyle, downStyle: downStyle,\n                                 titleColor: titleColor, plotPaddingExt: plotPaddingExt)\n        model.title = title\n        model.key = key\n        return model\n    }\n}\n\n```\n\n**4. 自定义自己的图表CHKLineChartStyle，把指标算法和线组加入。**\n\n```swift\n\n    let style = CHKLineChartStyle()\n    ......\n\n    //配置图表处理算法\n    style.algorithms = [\n        CHChartAlgorithm.ema(12),       //计算MACD，必须先计算到同周期的EMA\n        CHChartAlgorithm.ema(26),       //计算MACD，必须先计算到同周期的EMA\n        CHChartAlgorithm.macd(12, 26, 9),\n    ]\n\n    let trendSection = CHSection()\n    let macdSeries = CHSeries.getMACD(\n        UIColor.ch_hex(0xDDDDDD),\n        deac: UIColor.ch_hex(0xF9EE30),\n        barc: UIColor.ch_hex(0xF600FF),\n        upStyle: upcolor, downStyle: downcolor,\n        section: trendSection)\n    macdSeries.title = \"MACD(12,26,9)\"\n    macdSeries.symmetrical = true\n    trendSection.series = [macdSeries]\n\n    style.sections = [priceSection, volumeSection, trendSection]\n\n    let chartView = CHKLineChartView(frame: CGRect.zero)\n    chartView.style = style\n    ......\n\n```\n\n**5. 运行程序调试你的指标是否计算对了。**\n\n## Custom Style（开发自定义样式）\n\n通用的方案是，扩展CHKLineChartStyle编写自己的样式。\n\n```swift\n\n// MARK: - 扩展样式\npublic extension CHKLineChartStyle {\n    \n    //实现一个最基本的样式，开发者可以自由扩展配置样式\n    public static var best: CHKLineChartStyle {\n        let style = CHKLineChartStyle()\n        ......\n        return style\n    }\n\n    self.chartView.style = .best\n}\n\n```\n\n## Contribution（贡献更多指标）\n\n如果你对本K线指标的开发感兴趣，请fork项目，给大家Pull requests更多技术指标。\n\n## License\n\nReleased under [MIT License.](https://github.com/zhiquan911/CHKLineChart/blob/master/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhiquan911%2Fchklinechart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhiquan911%2Fchklinechart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhiquan911%2Fchklinechart/lists"}