D28 - 用 Swift 和公开资讯,打造投资理财的 Apps { 三大法人成交比重实作.3 }

金额计算的部分,在前一篇就完成了,这一篇开始讲 pie chart 的实作。

分析我们要做的事情

  • 设置 PieChartView
  • 依最新的三大法人资讯日期为 key,找出对应 key 的当日台股成交量
  • 依照台股成交量计算三大法人成交比重
  • 将成交比重的值转成 PieChartData
  • PieChartView.data 的值设定好并渲染

1 - 设置 Pie Chart View 的基本 UI

// MARK: ui methods
    private func setup(chartView: PieChartView) {
        
        chartView.usePercentValuesEnabled = true
        chartView.drawSlicesUnderHoleEnabled = false
        chartView.holeRadiusPercent = 0.58
        chartView.transparentCircleRadiusPercent = 0.61
        chartView.chartDescription?.enabled = false
        chartView.setExtraOffsets(left: 5, top: 10, right: 5, bottom: 5)
        
        chartView.drawCenterTextEnabled = true
        
        chartView.drawHoleEnabled = false
        chartView.rotationEnabled = true
        chartView.highlightPerTapEnabled = true
        
        chartView.entryLabelColor = .darkText
        
        let l = chartView.legend
        l.horizontalAlignment = .right
        l.verticalAlignment = .top
        l.orientation = .vertical
        l.drawInside = false
        l.xEntrySpace = 7
        l.yEntrySpace = 0
        l.yOffset = 0
        l.textColor = .black
        //        chartView.legend = l
    }

2 - 依最新的三大法人资讯日期为 key,找出对应 key 的当日台股成交量

/// 获得当下三大法人日期的大盘资讯
    private func getMarketTradingInfo() -> TwMarketTradingInfo? {
        
        let timeInterval = date.timeIntervalSince1970
        
        for info in dailyTradingInfo {
            
            if info.date.timeIntervalSince1970 == timeInterval {
                return info
            }
        }
        return nil
    }

3 - 依照台股成交量计算三大法人成交比重

4 - 将成交比重的值转成 PieChartData

在第 3 步要注意的是,getPieChartData 传进来的值是 [买进 + 卖出] 的值,但比重的计算上,应该是 [买进 + 卖出] / 2 才是合理的。因为台股总成交金额 == 总买进金额 == 总卖出金额,所以要相加除以2。

private func getPieChartData(threeMajorTrading: Double, twMarketTrading: Double) -> PieChartData {
        
				// 三大法人传入值是加总,所以要除以台股总成交後,再除以 2 
        let threeMajorPercentage = (threeMajorTrading / twMarketTrading) / 2

        let nonThreeMajorPercentage = 1 - threeMajorPercentage
        
        let threeMajorTradingData = PieChartDataEntry(value: threeMajorPercentage, label: "三大法人交易额")
        let nonThreeMajorTradingData = PieChartDataEntry(value: nonThreeMajorPercentage, label: "非三大法人交易额")
        
        let dataSet = PieChartDataSet(entries: [threeMajorTradingData, nonThreeMajorTradingData])
        dataSet.colors = [.systemGreen, .systemBlue]
        let data = PieChartData(dataSet: dataSet)
        data.setValueTextColor(.darkText)
        return data
    }

5 - 呼叫上列所有 func 并渲染 pie chart view

/// 计算三大法人占股市交易的额度
    private func updatePieChartThreeMajorPercentage() {
        
        guard let twMarketTradingInfo = getMarketTradingInfo(),
              let threeMajor = totalMajorInvestorInfo?.total else {
            print("找不到和三大法人同日的大盘成交资讯,请检查资料来源")
            return
        }
        
        let threeMajorTrading = threeMajor.totalBuy + threeMajor.totalSell
        let twMarketTrading = twMarketTradingInfo.value ?? 0

        let data = getPieChartData(threeMajorTrading: threeMajorTrading, twMarketTrading: twMarketTrading)
        
        pieChartView.data = data
    }

最後,让这些 func 在 button 中发动

@IBAction func drawPieChartButtonDidTap(_ sender: Any) {
        setup(chartView: self.pieChartView)
        updatePieChartThreeMajorPercentage()
    }

完成这一步的 UI 如下

https://ithelp.ithome.com.tw/upload/images/20211008/2014062249K53OUKHz.png

台股申购日历
IT铁人赛Demo App

下方是这次 D1 ~ D12 的完成品,可以下载来试
App Store - 台股申购日历

https://ithelp.ithome.com.tw/upload/images/20210924/20140622ypOBM0tgrZ.png


<<:  [Python 爬虫这样学,一定是大拇指拉!] DAY23 - 实战演练:HTML Response - 抓取股票代码清单 (2)

>>:  DAY23:Service背景服务之实作

[Day 16] 从头开始-从入门到 Swift 语法梳理

开发必须的设备以及相关的设定 入门开发的几个必要条件:一台 Mac , 苹果帐号 ,以及一个一般人智...

[Day18] NLP会用到的模型(二)-GRU

一. LSTM的问题 LSTM虽然非常强大,但LSTM也是有一个问题,就是计算时间较久导致执行速度较...

Day4 WordPress 介绍,基础设定与发文

上篇文章我们在 BlueHost 架起了 WordPress 环境,但也许你还不知道什麽是 Word...

EP 3: Use Shell to layout TopStore App

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...

Day17-维稳? StatefulSet介绍

在pod的生态中,本身就是一个小小世界,新旧pod之间通常不影响,当建立新的pod时,基本上不会跟被...