D21 - 用 Swift 和公开资讯,打造投资理财的 Apps { 台股成交量实作.1 }

在技术分析,或是筹码分析的流派中,其中有流派是会用成交量和 K 线一起看,然後进行股票进出的判断。

大盘的成交量资料,也可以在台湾证交所网站上看到。

https://ithelp.ithome.com.tw/upload/images/20210930/20140622TJWbBV0AON.png

下载的地方和前面一样,date 换成今天的 yyyyMMdd 即可。而中文版的 csv 档不意外的又是 big5 编码,真心建议使用英文版的资料,选择 utf8 ,会让你省下很多时间。

https://ithelp.ithome.com.tw/upload/images/20210930/20140622iu2jK72baT.png

台湾证交所-成交资讯画面

我们需要的栏位 [日期] [成交金额] [加权指数] [涨跌点数]。

不过,实际下载的是英文 csv,相对应的栏位是 [Date], [Trade Value], [TAIEX], [Change]

宣告台股加权指数量能的 Data Model

import Foundation

struct TwMarketTradingInfo: Hashable {
    
    let date: Date
    let tradeVolumeString: String
    let tradeValueString: String
    let transactionString: String
    let taiexString: String
    let changeString: String
}

参考之前下载 Manager 的程序码,就可以完成了

import Foundation

// https://www.twse.com.tw/en/exchangeReport/FMTQIK?response=csv&date=20210910
// 证交所 https://www.twse.com.tw/en/page/trading/exchange/FMTQIK.html
class TwMarketTradingInfoManager {
    
    private var dateUtility: DateUtility {
        return DateUtility()
    }
    
    private lazy var alamofireAdapter: AlamofireAdapter = {
        return AlamofireAdapter()
    }()
    
    func requestTwMarketDailyTradingInfo(date: Date, completion: @escaping (([TwMarketTradingInfo], Error?) -> Void)) {
        
        let format = "yyyyMMdd"
        let string = dateUtility.getString(date: date, format: format)
        
        let urlString = "https://www.twse.com.tw/en/exchangeReport/FMTQIK?response=csv&date=\(string)"
        
        alamofireAdapter.requestForString(urlString, method: .get) { [weak self] result in
            guard let self = self else { return }
            
            switch result {
            case .success(let string):
                let tradingInfoDataSet = self.convertToTwMarketTradingInfo(string)
                completion(tradingInfoDataSet, nil)
            case .failure(let error):
                completion([], error)
            }
        }
    }
    
    private func convertToTwMarketTradingInfo(_ string: String) -> [TwMarketTradingInfo] {
        
        var dataSet = [TwMarketTradingInfo]()
        
        let trimmedString = trimmedFirstLine(string)
        
        if let csv = try? CSVAdapter(rawString: trimmedString) {
            
            for each in csv.namedRows {
                
                let dateString = each["Date"] ?? ""
                let tradeVolume = each["Trade Volume"] ?? ""
                let tradeValue = each["Trade Value"] ?? ""
                let transaction = each["Transaction"] ?? ""
                let taiex = each["TAIEX"] ?? ""
                let change = each["Change"] ?? ""
                
                if let date = dateUtility.getDate(from: dateString, format: "yyyy/MM/dd") {
                    // 这一份资料的最後面有 remarks 栏位,所以我们只拿转得成 date 的资料
                    let info = TwMarketTradingInfo(
                        date: date,
                        tradeVolumeString: tradeVolume,
                        tradeValueString: tradeValue,
                        transactionString: transaction,
                        taiexString: taiex,
                        changeString: change)
                    dataSet.append(info)
                }
            }
        }
        
        return dataSet
    }
    
    private func trimmedFirstLine(_ string: String) -> String {
        
        return CSVAdapter.removeLine(string, at: 1)
    }
}

<<:  Flutter体验 Day 23-WebSocket

>>:  Rust-定义Closure(闭包)

[DAY 17] 回应试算表

存放题目和读取题目的google 试算表搞定了 呈现题目的google 表单也搞定了 接下来来说说记...

Day1-介绍与开始

嗨大家好~我是凯西!接下来是我开学的三十天实力增进计画的纪录 规划上会刷leetcode加强我的py...

利用 Google App Script 将资料存到 Google Sheet(2)

延续昨天的内容,今天我们要完成写入&读取的功能 将信件内容写入到 Google Sheet ...

Day 4 基本型别 - part 1

今天要介绍 TypeScript 的基本型别,TypeScript 跟 JavaScript 一样拥...

[Day12] 策略最佳化模组改造(2)

现在要来处理上一篇文章的红框部分,输入N个np.arange让他跑for loop。今天在网路上看了...