{"id":13610358,"url":"https://github.com/WillkYang/YYKline","last_synced_at":"2025-04-12T22:33:41.137Z","repository":{"id":38338613,"uuid":"58647512","full_name":"WillkYang/YYKline","owner":"WillkYang","description":"iOS YYKline：Kline、Chart、Volume、Scroll、Scale、MACD、KDJ、K线图、分时图...","archived":false,"fork":false,"pushed_at":"2021-12-10T06:22:46.000Z","size":3486,"stargazers_count":2444,"open_issues_count":9,"forks_count":547,"subscribers_count":85,"default_branch":"master","last_synced_at":"2025-04-07T05:02:10.066Z","etag":null,"topics":["boll","ema","kdj","kline","ma","macd","rsi","stock","wr"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","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/WillkYang.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}},"created_at":"2016-05-12T14:13:06.000Z","updated_at":"2025-03-20T15:16:01.000Z","dependencies_parsed_at":"2022-08-24T23:01:45.455Z","dependency_job_id":null,"html_url":"https://github.com/WillkYang/YYKline","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WillkYang%2FYYKline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WillkYang%2FYYKline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WillkYang%2FYYKline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WillkYang%2FYYKline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WillkYang","download_url":"https://codeload.github.com/WillkYang/YYKline/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248642016,"owners_count":21138318,"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":["boll","ema","kdj","kline","ma","macd","rsi","stock","wr"],"created_at":"2024-08-01T19:01:43.950Z","updated_at":"2025-04-12T22:33:40.708Z","avatar_url":"https://github.com/WillkYang.png","language":"Objective-C","funding_links":[],"categories":["Objective-C"],"sub_categories":[],"readme":"## YYKline\n\n\n[![License MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat)]() \u0026nbsp;\n[![Support](https://img.shields.io/badge/support-iOS7.0+-blue.svg?style=flat)]() \u0026nbsp;\n[![Support](https://img.shields.io/badge/support-Autolayout-orange.svg?style=flatt)]() \u0026nbsp;\n\n## 介绍\n- [x] 支持MA、EMA、BOLL、KDJ、MACD、RSI、WR等技术指标，支持更多指标扩展\n- [x] 支持运行于iOS、MacOS上\n- [x] OC开发，如需Swift可直接翻译\n\n## 图表示例\n\n| 普通K线+MACD | 分时图+MACD\n|------------|------------\n| ![普通K线+MACD](https://github.com/WillkYang/Y_KLine/blob/master/Screenshot/MACD.png?raw=true) |![分时图+MACD](https://github.com/WillkYang/Y_KLine/blob/master/Screenshot/MACD.png?raw=true)\n| 普通K线+KDJ | 分时图\n| ![普通K线+KDJ](https://github.com/WillkYang/Y_KLine/blob/master/Screenshot/KDJ.png?raw=true) |![分时图](https://github.com/WillkYang/Y_KLine/blob/master/Screenshot/Timeline.png?raw=true)\n| 更多指标 | 综合演示\n| ![更多指标](https://github.com/WillkYang/Y_KLine/blob/master/Screenshot/More.png?raw=true) |![综合演示](https://github.com/WillkYang/Y_KLine/blob/master/Screenshot/record.gif?raw=true)\n\n## 集成方法\n1. 下载Demo项目，将Y_Kline文件夹拖入需要的工程中\n2. 参考Demo，将YYKlineView添加到需要展示的view即可，其他部分(如指标)可参考Demo中Y_StockChartView进行配置。\n\n### 自定义指标\n1. 实现YYPainterProtocol，可参考Painter文件夹下的其他已有指标。\n```objc\n@protocol YYPainterProtocol \u003cNSObject\u003e\n// 绘制\n+ (void)drawToLayer:(CALayer *)layer area:(CGRect)area models:(NSArray \u003cYYKlineModel *\u003e *)models minMax: (YYMinMaxModel *)minMaxModel;\n// 获取边界值\n+ (YYMinMaxModel *)getMinMaxValue:(NSArray \u003cYYKlineModel *\u003e *)data;\n@end\n```\n\n2. 以绘制KDJ图为例，新建YYKDJPainter，实现YYPainterProtocol\n\n```objc\n+ (YYMinMaxModel *)getMinMaxValue:(NSArray \u003cYYKlineModel *\u003e *)data {\n    if(!data) {\n        return [YYMinMaxModel new];\n    }\n    __block CGFloat minAssert = 999999999999.f;\n    __block CGFloat maxAssert = 0.f;\n    [data enumerateObjectsUsingBlock:^(YYKlineModel * _Nonnull m, NSUInteger idx, BOOL * _Nonnull stop) {\n        maxAssert = MAX(maxAssert, MAX(m.KDJ.J.floatValue, MAX(m.KDJ.K.floatValue, m.KDJ.D.floatValue)));\n        minAssert = MIN(minAssert, MIN(m.KDJ.J.floatValue, MIN(m.KDJ.K.floatValue, m.KDJ.D.floatValue)));\n    }];\n    return [YYMinMaxModel modelWithMin:minAssert max:maxAssert];\n}\n\n+ (void)drawToLayer:(CALayer *)layer area:(CGRect)area models:(NSArray \u003cYYKlineModel *\u003e *)models minMax: (YYMinMaxModel *)minMaxModel {\n    if(!models) {\n        return;\n    }\n    CGFloat maxH = CGRectGetHeight(area);\n    CGFloat unitValue = maxH/minMaxModel.distance;\n    \n    YYKDJPainter *sublayer = [[YYKDJPainter alloc] init];\n    sublayer.frame = area;\n    UIBezierPath *path1 = [UIBezierPath bezierPath];\n    UIBezierPath *path2 = [UIBezierPath bezierPath];\n    UIBezierPath *path3 = [UIBezierPath bezierPath];\n    [models enumerateObjectsUsingBlock:^(YYKlineModel * _Nonnull m, NSUInteger idx, BOOL * _Nonnull stop) {\n        CGFloat w = [Y_StockChartGlobalVariable kLineWidth];\n        CGFloat x = idx * (w + [Y_StockChartGlobalVariable kLineGap]);\n        CGPoint point1 = CGPointMake(x+w/2, maxH - (m.KDJ.K.floatValue - minMaxModel.min)*unitValue);\n        CGPoint point2 = CGPointMake(x+w/2, maxH - (m.KDJ.D.floatValue - minMaxModel.min)*unitValue);\n        CGPoint point3 = CGPointMake(x+w/2, maxH - (m.KDJ.J.floatValue - minMaxModel.min)*unitValue);\n        if (idx == 0) {\n            [path1 moveToPoint:point1];\n            [path2 moveToPoint:point2];\n            [path3 moveToPoint:point3];\n        } else {\n            [path1 addLineToPoint:point1];\n            [path2 addLineToPoint:point2];\n            [path3 addLineToPoint:point3];\n        }\n    }];\n    \n    {\n        CAShapeLayer *l = [CAShapeLayer layer];\n        l.path = path1.CGPath;\n        l.lineWidth = Y_StockChartLineWidth;\n        l.strokeColor = UIColor.line1Color.CGColor;\n        l.fillColor =   [UIColor clearColor].CGColor;\n        [sublayer addSublayer:l];\n    }\n    {\n        CAShapeLayer *l = [CAShapeLayer layer];\n        l.path = path2.CGPath;\n        l.lineWidth = Y_StockChartLineWidth;\n        l.strokeColor = UIColor.line2Color.CGColor;\n        l.fillColor =   [UIColor clearColor].CGColor;\n        [sublayer addSublayer:l];\n    }\n    {\n        CAShapeLayer *l = [CAShapeLayer layer];\n        l.path = path3.CGPath;\n        l.lineWidth = Y_StockChartLineWidth;\n        l.strokeColor = UIColor.line3Color.CGColor;\n        l.fillColor =   [UIColor clearColor].CGColor;\n        [sublayer addSublayer:l];\n    }\n    [layer addSublayer:sublayer];\n}\n```\n3. 实现对应的Model，参考YYIndicatorModel，计算指标数据\n4. 在Y_StockChartView.m中加上该Painter对应的case\n```objc\n- (void)y_StockChartSegmentView:(Y_StockChartSegmentView *)segmentView clickSegmentButtonIndex:(NSInteger)index {\n    ...\n    case YYKlineIncicatorKDJ:\n        self.kLineView.indicator2Painter = YYKDJPainter.class;\n        break;\n    ...\n}\n```\n5. 运行查看效果\n\n### 加群讨论更多：755873102\n\n感谢[@牛眼行情](https://niuyan.com)的K线数据源。\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWillkYang%2FYYKline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FWillkYang%2FYYKline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FWillkYang%2FYYKline/lists"}