-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCandleParser.swift
81 lines (76 loc) · 3.29 KB
/
CandleParser.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//
//
// Copyright (C) 2024 Devexperts LLC. All rights reserved.
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
//
import Foundation
import DXFeedFramework
import SwiftCSV
class CandleParser: EventParser {
func parse(_ csv: String) throws -> [DXFeedFramework.MarketEvent] {
var candles = [Candle]()
let tsv: CSV = try CSV<Enumerated>(string: csv)
let header = tsv.header
try tsv.rows.forEach { values in
var event: Candle?
for index in 0..<values.count {
let value = values[index]
if index == header.count {
event?.eventFlags = CandleParser.parseEventflags(value)
} else {
let headerKey = header[index]
switch headerKey {
case "#=Candle": break
case "EventSymbol":
event = Candle(try CandleSymbol.valueOf(value))
case "EventTime":
let time: Long? = try DXTimeFormat.defaultTimeFormat?.parse(value)
event?.eventTime = time ?? 0
case "Time":
let time: Long? = try DXTimeFormat.defaultTimeFormat?.parse(value)
event?.time = time ?? 0
case "Sequence":
if value.isEmpty || value == "0" {
break
}
let millisAndSequence = value.split(separator: ":")
if millisAndSequence.count == 2 {
let sequence = millisAndSequence[1]
try? event?.setSequence(Int(sequence) ?? 0)
}
event?.time = (event?.time ?? 0) + (Int64(String(millisAndSequence.first!)) ?? 0)
case "Count":
event?.count = Long(value) ?? 0
case "Open":
event?.open = Double(value) ?? .nan
case "High":
event?.high = Double(value) ?? .nan
case "Low":
event?.low = Double(value) ?? .nan
case "Close":
event?.close = Double(value) ?? .nan
case "Volume":
event?.volume = Double(value) ?? .nan
case "VWAP":
event?.vwap = Double(value) ?? .nan
case "BidVolume":
event?.bidVolume = Double(value) ?? .nan
case "AskVolume":
event?.askVolume = Double(value) ?? .nan
case "ImpVolatility":
event?.impVolatility = Double(value) ?? .nan
case "OpenInterest":
event?.openInterest = Double(value) ?? .nan
default:
print("Undefined key \(headerKey)")
}
}
}
if let candle = event {
candles.append(candle)
}
}
return candles
}
}