From b70db1d1671c6f61ae13a8fef2d2532460e98d38 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Tue, 30 Apr 2024 12:39:55 +0200 Subject: [PATCH 01/51] feat: candle_charts WIP --- DXFeedFramework.xcodeproj/project.pbxproj | 157 ++++++- DXFeedFrameworkTests/EndpointTest.swift | 11 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 14 + .../dxfeed_black-sym.svg.png | Bin 0 -> 115228 bytes .../Assets.xcassets/Contents.json | 6 + .../DXFeedCandleChart/CandleStickChart.swift | 430 ++++++++++++++++++ .../DXFeedCandleChartApp.swift | 20 + .../Preview Assets.xcassets/Contents.json | 6 + 9 files changed, 654 insertions(+), 1 deletion(-) create mode 100644 Samples/DXFeedCandleChart/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Samples/DXFeedCandleChart/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Samples/DXFeedCandleChart/Assets.xcassets/AppIcon.appiconset/dxfeed_black-sym.svg.png create mode 100644 Samples/DXFeedCandleChart/Assets.xcassets/Contents.json create mode 100644 Samples/DXFeedCandleChart/CandleStickChart.swift create mode 100644 Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift create mode 100644 Samples/DXFeedCandleChart/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/DXFeedFramework.xcodeproj/project.pbxproj b/DXFeedFramework.xcodeproj/project.pbxproj index d12c03983..cfbb5f8b1 100644 --- a/DXFeedFramework.xcodeproj/project.pbxproj +++ b/DXFeedFramework.xcodeproj/project.pbxproj @@ -115,6 +115,10 @@ 643A329B2BD0137000F6F790 /* Optional+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643A329A2BD0137000F6F790 /* Optional+Ext.swift */; }; 643A329F2BD2A04300F6F790 /* OnDemandService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643A329E2BD2A04300F6F790 /* OnDemandService.swift */; }; 643A32A22BD2AEFB00F6F790 /* NativeOnDemandService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643A32A12BD2AEFB00F6F790 /* NativeOnDemandService.swift */; }; + 643F41F52BDFE1B000A2176D /* DXFeedCandleChartApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F41F42BDFE1B000A2176D /* DXFeedCandleChartApp.swift */; }; + 643F41F92BDFE1B200A2176D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 643F41F82BDFE1B200A2176D /* Assets.xcassets */; }; + 643F41FC2BDFE1B200A2176D /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 643F41FB2BDFE1B200A2176D /* Preview Assets.xcassets */; }; + 643F42012BDFE25D00A2176D /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; 64437A8F2A9DEE6F005929B2 /* InstrumentProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64437A8E2A9DEE6F005929B2 /* InstrumentProfile.swift */; }; 64437A922A9DF1DE005929B2 /* NativeInstrumentProfileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64437A912A9DF1DE005929B2 /* NativeInstrumentProfileReader.swift */; }; 6447A5DB2A8E559000739CCF /* ILastingEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6447A5DA2A8E559000739CCF /* ILastingEvent.swift */; }; @@ -679,6 +683,11 @@ 643A329C2BD15F2900F6F790 /* LastEventsConsole.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = LastEventsConsole.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 643A329E2BD2A04300F6F790 /* OnDemandService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnDemandService.swift; sourceTree = ""; }; 643A32A12BD2AEFB00F6F790 /* NativeOnDemandService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeOnDemandService.swift; sourceTree = ""; }; + 643F41F22BDFE1B000A2176D /* DXFeedCandleChart.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DXFeedCandleChart.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 643F41F42BDFE1B000A2176D /* DXFeedCandleChartApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DXFeedCandleChartApp.swift; sourceTree = ""; }; + 643F41F82BDFE1B200A2176D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 643F41FB2BDFE1B200A2176D /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 643F42002BDFE25D00A2176D /* CandleStickChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CandleStickChart.swift; sourceTree = ""; }; 64437A8E2A9DEE6F005929B2 /* InstrumentProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstrumentProfile.swift; sourceTree = ""; }; 64437A912A9DF1DE005929B2 /* NativeInstrumentProfileReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeInstrumentProfileReader.swift; sourceTree = ""; }; 644551C92B973A0D0069E3A2 /* FetchDailyCandles.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = FetchDailyCandles.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; @@ -951,6 +960,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 643F41EF2BDFE1B000A2176D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 644BD7572A44726F00A0BF99 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1208,6 +1224,25 @@ path = OnDemandService; sourceTree = ""; }; + 643F41F32BDFE1B000A2176D /* DXFeedCandleChart */ = { + isa = PBXGroup; + children = ( + 643F41F42BDFE1B000A2176D /* DXFeedCandleChartApp.swift */, + 643F42002BDFE25D00A2176D /* CandleStickChart.swift */, + 643F41F82BDFE1B200A2176D /* Assets.xcassets */, + 643F41FA2BDFE1B200A2176D /* Preview Content */, + ); + path = DXFeedCandleChart; + sourceTree = ""; + }; + 643F41FA2BDFE1B200A2176D /* Preview Content */ = { + isa = PBXGroup; + children = ( + 643F41FB2BDFE1B200A2176D /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; 64437A902A9DF1C4005929B2 /* Ipf */ = { isa = PBXGroup; children = ( @@ -1533,6 +1568,7 @@ 641E45FD2B1DF67E00649363 /* Playgrounds */, 6469F8D12A3B400100846831 /* Utils */, 644BD75B2A44726F00A0BF99 /* ARQuoteTableApp */, + 643F41F32BDFE1B000A2176D /* DXFeedCandleChart */, 64D8BB3C2A39BB730071BC88 /* LatencyTestApp */, 64B6275D2A3761A000196D07 /* PertTestApp */, 64B627162A375BBA00196D07 /* QuoteTableApp */, @@ -1626,6 +1662,7 @@ 64B4364B2AB9D3410003919E /* ScheduleSampleApp.app */, 64148B642ABB5C320063110E /* Tools */, 6455C3B82B20A44D00257986 /* QdsTools.app */, + 643F41F22BDFE1B000A2176D /* DXFeedCandleChart.app */, ); name = Products; sourceTree = ""; @@ -1885,6 +1922,23 @@ productReference = 642DC9252AAA21C000974F5C /* DXIpfTableApp.app */; productType = "com.apple.product-type.application"; }; + 643F41F12BDFE1B000A2176D /* DXFeedCandleChart */ = { + isa = PBXNativeTarget; + buildConfigurationList = 643F41FD2BDFE1B200A2176D /* Build configuration list for PBXNativeTarget "DXFeedCandleChart" */; + buildPhases = ( + 643F41EE2BDFE1B000A2176D /* Sources */, + 643F41EF2BDFE1B000A2176D /* Frameworks */, + 643F41F02BDFE1B000A2176D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DXFeedCandleChart; + productName = DXFeedCandleChart; + productReference = 643F41F22BDFE1B000A2176D /* DXFeedCandleChart.app */; + productType = "com.apple.product-type.application"; + }; 644BD7592A44726F00A0BF99 /* DXARQuoteTableApp */ = { isa = PBXNativeTarget; buildConfigurationList = 644BD76C2A44727000A0BF99 /* Build configuration list for PBXNativeTarget "DXARQuoteTableApp" */; @@ -2048,7 +2102,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; CLASSPREFIX = DX; - LastSwiftUpdateCheck = 1430; + LastSwiftUpdateCheck = 1520; LastUpgradeCheck = 1420; TargetAttributes = { 64148B632ABB5C320063110E = { @@ -2057,6 +2111,9 @@ 642DC9242AAA21C000974F5C = { CreatedOnToolsVersion = 15.0; }; + 643F41F12BDFE1B000A2176D = { + CreatedOnToolsVersion = 15.2; + }; 644BD7592A44726F00A0BF99 = { CreatedOnToolsVersion = 14.3; }; @@ -2112,6 +2169,7 @@ 64B4364A2AB9D3410003919E /* ScheduleSampleApp */, 6455C3B72B20A44D00257986 /* QdsTools */, 64148B632ABB5C320063110E /* Tools */, + 643F41F12BDFE1B000A2176D /* DXFeedCandleChart */, ); }; /* End PBXProject section */ @@ -2128,6 +2186,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 643F41F02BDFE1B000A2176D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 643F41FC2BDFE1B200A2176D /* Preview Assets.xcassets in Resources */, + 643F41F92BDFE1B200A2176D /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 644BD7582A44726F00A0BF99 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2313,6 +2380,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 643F41EE2BDFE1B000A2176D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 643F41F52BDFE1B000A2176D /* DXFeedCandleChartApp.swift in Sources */, + 643F42012BDFE25D00A2176D /* CandleStickChart.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 644BD7562A44726F00A0BF99 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2948,6 +3024,76 @@ }; name = Release; }; + 643F41FE2BDFE1B200A2176D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Samples/DXFeedCandleChart/Preview Content\""; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.dxfeed.DXFeedCandleChart; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 643F41FF2BDFE1B200A2176D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Samples/DXFeedCandleChart/Preview Content\""; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.dxfeed.DXFeedCandleChart; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 644BD76A2A44727000A0BF99 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3658,6 +3804,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 643F41FD2BDFE1B200A2176D /* Build configuration list for PBXNativeTarget "DXFeedCandleChart" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 643F41FE2BDFE1B200A2176D /* Debug */, + 643F41FF2BDFE1B200A2176D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 644BD76C2A44727000A0BF99 /* Build configuration list for PBXNativeTarget "DXARQuoteTableApp" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/DXFeedFrameworkTests/EndpointTest.swift b/DXFeedFrameworkTests/EndpointTest.swift index 8d715ab6a..97b225e9d 100644 --- a/DXFeedFrameworkTests/EndpointTest.swift +++ b/DXFeedFrameworkTests/EndpointTest.swift @@ -101,4 +101,15 @@ final class EndpointTest: XCTestCase { endpoint.add(listener: stateListener!) wait(for: [connectedExpectation], timeout: 1) } + + func testRoleConvert() throws { + let roles: [DXEndpoint.Role] = [.feed, .onDemandFeed, .streamFeed, .publisher, .streamPublisher, .localHub] + let nativeCodes = roles.map { role in + role.toNatie() + } + XCTAssertEqual(nativeCodes.map { nativeRole in + DXEndpoint.Role.fromNative(nativeRole) + }, roles) + } + } diff --git a/Samples/DXFeedCandleChart/Assets.xcassets/AccentColor.colorset/Contents.json b/Samples/DXFeedCandleChart/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 000000000..eb8789700 --- /dev/null +++ b/Samples/DXFeedCandleChart/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Samples/DXFeedCandleChart/Assets.xcassets/AppIcon.appiconset/Contents.json b/Samples/DXFeedCandleChart/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..b5b77380c --- /dev/null +++ b/Samples/DXFeedCandleChart/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "dxfeed_black-sym.svg.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Samples/DXFeedCandleChart/Assets.xcassets/AppIcon.appiconset/dxfeed_black-sym.svg.png b/Samples/DXFeedCandleChart/Assets.xcassets/AppIcon.appiconset/dxfeed_black-sym.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..08b2b8448d36ff3f0b2c9745d08a029498896403 GIT binary patch literal 115228 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∈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 0 && at < self.count { + self[at] = newElement + } else { + print("error during replace") + } + } +} + +enum CandleType: CaseIterable, Identifiable { + case week, month, year + var id: Self { self } + func toDxFeedValue() -> CandlePeriod { + switch self { + case .week: + return CandlePeriod.valueOf(value: 1, type: .week) + case .month: + return CandlePeriod.valueOf(value: 1, type: .month) + case .year: + return CandlePeriod.valueOf(value: 1, type: .year) + } + } +} + +struct StockPrice: Identifiable { + let timestamp: Date + let open: Decimal + let high: Decimal + let low: Decimal + let close: Decimal + let currency: String + var id: Date { timestamp } +} + + +class CandleList: ObservableObject, SnapshotDelegate { + func receiveEvents(_ events: [DXFeedFramework.MarketEvent], isSnapshot: Bool) { + + var result = [Candle]() + events.forEach { event in + let candle = event.candle + result.append(candle) + } + if isSnapshot { + DispatchQueue.main.async { + self.candles = result.map({ candle in + let price = StockPrice(timestamp: Date(millisecondsSince1970: candle.time), open: Decimal(candle.open), high: Decimal(candle.high), low: Decimal(candle.low), close: Decimal(candle.close), currency: self.currency) + return price + }) + } + + } else { + DispatchQueue.main.async { + result.forEach { candle in + let newPrice = StockPrice(timestamp: Date(millisecondsSince1970: candle.time), open: Decimal(candle.open), high: Decimal(candle.high), low: Decimal(candle.low), close: Decimal(candle.close), currency: self.currency) + if let index = self.candles.firstIndex(where: { price in + price.timestamp == newPrice.timestamp + }) { + self.candles.safeReplace(newPrice, at: index) + } + } + } + } + } + + let symbol: String = "AAPL" + public private(set) var currency = "" + public private(set) var descriptionString = "" + + var endpoint: DXEndpoint! + var feed: DXFeed! + var subscription: DXFeedSubscription? + var snapshotProcessor: SnapshotProcessor! + + @Published var candles: [StockPrice] + + init() { + self.candles = [StockPrice]() + try? createSubscription() + fetchInfo() + } + + func createSubscription() throws { + endpoint = try DXEndpoint.create().connect("demo.dxfeed.com:7300") + feed = endpoint.getFeed() + subscription = try feed?.createSubscription([Candle.self]) + snapshotProcessor = SnapshotProcessor() + snapshotProcessor.add(self) + try subscription?.add(listener: snapshotProcessor) + } + + func fetchInfo() { + let reader = DXInstrumentProfileReader() + let result = try? reader.readFromFile(address: "https://demo:demo@tools.dxfeed.com/ipf?SYMBOL=\(symbol)") + guard let result = result else { + return + } + result.forEach { profile in + currency = profile.currency + descriptionString = profile.descriptionStr + } + } + + func updateDate(date: Date, type: CandleType) { + let candleSymbol = CandleSymbol.valueOf(symbol, type.toDxFeedValue()) + let symbol = TimeSeriesSubscriptionSymbol(symbol: candleSymbol, date: date) + try? subscription?.setSymbols([symbol]) + } +} + +struct CandleStickChart: View { + @ObservedObject var list: CandleList + @State private var selectedPrice: StockPrice? + @State private var date = Calendar.current.date(byAdding: .month, value: -12, to: Date())! + @State private var type: CandleType = .month + + init() { + self.list = CandleList() + self.list.updateDate(date: self.date, type: self.type) + } + + var body: some View { + GeometryReader { reader in + List { + Section { + DatePicker( + "Start Date", + selection: $date, + displayedComponents: [.date] + ).onChange(of: date) { oldValue, newValue in + selectedPrice = nil + list.updateDate(date: newValue,type: type) + } + Picker("Type", selection: $type) { + Text("Week").tag(CandleType.week) + Text("Month").tag(CandleType.month) + Text("Year").tag(CandleType.year) + }.onChange(of: type) { oldValue, newValue in + selectedPrice = nil + list.updateDate(date: date, type: newValue) + } + } + Section { + chart.frame(height: reader.size.height/2) + } + Section { + Text(""" +Candles \(String(describing: type)) +\(list.descriptionString) +from \(date) +""" ) + .font(.callout) + } + } + } + } + private var chart: some View { + Chart($list.candles) { binding in + let price = binding.wrappedValue + + CandleStickMark( + timestamp: .value("Date", price.timestamp), + open: .value("Open", price.open), + high: .value("High", price.high), + low: .value("Low", price.low), + close: .value("Close", price.close) + ) + .accessibilityLabel("\(price.timestamp.formatted(date: .complete, time: .omitted)): \(price.accessibilityTrendSummary)") + .accessibilityValue(price.accessibilityDescription) + .accessibilityHidden(false) + .foregroundStyle( price.close >= price.open ? .green : .red) + } + .chartYAxis { AxisMarks(preset: .extended) } + .chartOverlay { proxy in + GeometryReader { geo in + Rectangle().fill(.clear).contentShape(Rectangle()) + .gesture( + SpatialTapGesture() + .onEnded { value in + let element = findElement(location: value.location, proxy: proxy, geometry: geo) + if selectedPrice?.timestamp == element?.timestamp { + // If tapping the same element, clear the selection. + selectedPrice = nil + } else { + selectedPrice = element + } + } + .exclusively( + before: DragGesture() + .onChanged { value in + selectedPrice = findElement(location: value.location, proxy: proxy, geometry: geo) + } + ) + ) + } + } + .chartOverlay { proxy in + ZStack(alignment: .topLeading) { + GeometryReader { geo in + if let selectedPrice { + let dateInterval = Calendar.current.dateInterval(of: .day, for: selectedPrice.timestamp)! + let startPositionX1 = proxy.position(forX: dateInterval.start) ?? 0 + + let lineX = startPositionX1 + geo[proxy.plotAreaFrame].origin.x + let lineHeight = geo[proxy.plotAreaFrame].maxY + let boxWidth: CGFloat = geo.size.width + let boxOffset = max(0, min(geo.size.width - boxWidth, lineX - boxWidth / 2)) + + Rectangle() + .fill(.gray.opacity(0.5)) + .frame(width: 2, height: lineHeight) + .position(x: lineX, y: lineHeight / 2) + + PriceAnnotation(for: selectedPrice, currency: list.currency) + .frame(width: boxWidth, alignment: .leading) + .background { + RoundedRectangle(cornerRadius: 13) + .foregroundStyle(.thickMaterial) + .padding(.horizontal, -8) + .padding(.vertical, -4) + } + .offset(x: boxOffset) + .gesture( + TapGesture() + .onEnded { _ in + self.selectedPrice = nil + } + ) + } + } + } + } + .accessibilityChartDescriptor(self) + .chartYAxis(.automatic) + .chartXAxis(.automatic) + + } + + private func findElement(location: CGPoint, proxy: ChartProxy, geometry: GeometryProxy) -> StockPrice? { + let relativeXPosition = location.x - geometry[proxy.plotAreaFrame].origin.x + if let date = proxy.value(atX: relativeXPosition) as Date? { + // Find the closest date element. + var minDistance: TimeInterval = .infinity + var index: Int? = nil + for dataIndex in list.candles.indices { + let nthSalesDataDistance = list.candles[dataIndex].timestamp.distance(to: date) + if abs(nthSalesDataDistance) < minDistance { + minDistance = abs(nthSalesDataDistance) + index = dataIndex + } + } + if let index { + return list.candles[index] + } + } + return nil + } +} + +struct CandleStickMark: ChartContent { + let timestamp: PlottableValue + let open: PlottableValue + let high: PlottableValue + let low: PlottableValue + let close: PlottableValue + + var body: some ChartContent { + Plot { + // Composite ChartContent MUST be grouped into a plot for accessibility to work + BarMark( + x: timestamp, + yStart: open, + yEnd: close, + width: 4 + ) + BarMark( + x: timestamp, + yStart: high, + yEnd: low, + width: 1 + ) + } + } +} + +// MARK: - Accessibility + +extension CandleStickChart: AXChartDescriptorRepresentable { + func makeChartDescriptor() -> AXChartDescriptor { + + let dateStringConverter: ((Date) -> (String)) = { date in + date.formatted(date: .abbreviated, time: .omitted) + } + + // These closures help find the min/max for each axis + let lowestValue: ((KeyPath) -> (Double)) = { path in + return list.candles.map { $0[keyPath: path]} .min()?.asDouble ?? 0 + } + let highestValue: ((KeyPath) -> (Double)) = { path in + return list.candles.map { $0[keyPath: path]} .max()?.asDouble ?? 0 + } + + let xAxis = AXCategoricalDataAxisDescriptor( + title: "Date", + categoryOrder: list.candles.map { dateStringConverter($0.timestamp) } + ) + + // Add axes for each data point captured in the candlestick + let closeAxis = AXNumericDataAxisDescriptor( + title: "Closing Price", + range: 0...highestValue(\.close), + gridlinePositions: [] + ) { value in "Closing: \(value.formatted(.currency(code: list.currency)))" } + + let openAxis = AXNumericDataAxisDescriptor( + title: "Opening Price", + range: lowestValue(\.open)...highestValue(\.open), + gridlinePositions: [] + ) { value in "Opening: \(value.formatted(.currency(code: list.currency)))" } + + let highAxis = AXNumericDataAxisDescriptor( + title: "Highest Price", + range: lowestValue(\.high)...highestValue(\.high), + gridlinePositions: [] + ) { value in "High: \(value.formatted(.currency(code: list.currency)))" } + + let lowAxis = AXNumericDataAxisDescriptor( + title: "Lowest Price", + range: lowestValue(\.low)...highestValue(\.low), + gridlinePositions: [] + ) { value in "Low: \(value.formatted(.currency(code: list.currency)))" } + + let series = AXDataSeriesDescriptor( + name: list.descriptionString, + isContinuous: false, + dataPoints: list.candles.map { + .init(x: dateStringConverter($0.timestamp), + y: $0.close.asDouble, + additionalValues: [.number($0.open.asDouble), + .number($0.high.asDouble), + .number($0.low.asDouble)]) + } + ) + + return AXChartDescriptor( + title: list.descriptionString, + summary: nil, + xAxis: xAxis, + yAxis: closeAxis, + additionalAxes: [openAxis, highAxis, lowAxis], + series: [series] + ) + } +} + +// MARK: - Preview + +struct PriceAnnotation: View { + let price: StockPrice + let currency: String + + init(for price: StockPrice, currency: String) { + self.price = price + self.currency = currency + } + + var body: some View { + VStack(alignment: .center, spacing: 4) { + Text(price.timestamp.formatted(date: .abbreviated, time: .omitted)) + + HStack(spacing: 0) { + Text("Open: \(price.open.formatted(.currency(code: currency)))" ).foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) + + Text("Close: \(price.close.formatted(.currency(code: currency)))").foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) + + } + + HStack(spacing: 0) { + Text("High: \(price.high.formatted(.currency(code: currency)))").foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) + + Text("Low: \(price.low.formatted(.currency(code: currency)))").foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) + + } + } + .lineLimit(1) + .font(.headline) + .padding(.vertical) + } +} + +struct CandleStickChart_Previews: PreviewProvider { + static var previews: some View { + CandleStickChart() + } +} diff --git a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift new file mode 100644 index 000000000..73d68f69b --- /dev/null +++ b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift @@ -0,0 +1,20 @@ +// +// +// 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 SwiftUI + +@main +struct DXFeedCandleChartApp: App { + var body: some Scene { + WindowGroup { + CandleStickChart() + } + } +} + + + diff --git a/Samples/DXFeedCandleChart/Preview Content/Preview Assets.xcassets/Contents.json b/Samples/DXFeedCandleChart/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/Samples/DXFeedCandleChart/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} From 17da24d6438ab1f9cddc9d81d9d1d46aa59bd315 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Tue, 30 Apr 2024 16:09:44 +0200 Subject: [PATCH 02/51] feat: candle_charts WIP --- .../DXFeedCandleChart/CandleStickChart.swift | 95 +++++++++++++------ .../DXFeedCandleChartApp.swift | 2 +- 2 files changed, 67 insertions(+), 30 deletions(-) diff --git a/Samples/DXFeedCandleChart/CandleStickChart.swift b/Samples/DXFeedCandleChart/CandleStickChart.swift index a3db0613e..0f147de7f 100644 --- a/Samples/DXFeedCandleChart/CandleStickChart.swift +++ b/Samples/DXFeedCandleChart/CandleStickChart.swift @@ -58,13 +58,24 @@ enum CandleType: CaseIterable, Identifiable { } struct StockPrice: Identifiable { + let currency: String let timestamp: Date + var id: Date { timestamp } + let open: Decimal + let close: Decimal let high: Decimal let low: Decimal - let close: Decimal - let currency: String - var id: Date { timestamp } + + init(candle: Candle, currency: String) { + self.currency = currency + self.timestamp = Date(millisecondsSince1970: candle.time) + self.open = Decimal(candle.open) + self.close = Decimal(candle.close) + self.high = Decimal(candle.high) + self.low = Decimal(candle.low) + } + } @@ -79,7 +90,7 @@ class CandleList: ObservableObject, SnapshotDelegate { if isSnapshot { DispatchQueue.main.async { self.candles = result.map({ candle in - let price = StockPrice(timestamp: Date(millisecondsSince1970: candle.time), open: Decimal(candle.open), high: Decimal(candle.high), low: Decimal(candle.low), close: Decimal(candle.close), currency: self.currency) + let price = StockPrice(candle: candle, currency: self.currency) return price }) } @@ -87,7 +98,7 @@ class CandleList: ObservableObject, SnapshotDelegate { } else { DispatchQueue.main.async { result.forEach { candle in - let newPrice = StockPrice(timestamp: Date(millisecondsSince1970: candle.time), open: Decimal(candle.open), high: Decimal(candle.high), low: Decimal(candle.low), close: Decimal(candle.close), currency: self.currency) + let newPrice = StockPrice(candle: candle, currency: self.currency) if let index = self.candles.firstIndex(where: { price in price.timestamp == newPrice.timestamp }) { @@ -98,7 +109,7 @@ class CandleList: ObservableObject, SnapshotDelegate { } } - let symbol: String = "AAPL" + let symbol: String public private(set) var currency = "" public private(set) var descriptionString = "" @@ -109,7 +120,8 @@ class CandleList: ObservableObject, SnapshotDelegate { @Published var candles: [StockPrice] - init() { + init(symbol: String) { + self.symbol = symbol self.candles = [StockPrice]() try? createSubscription() fetchInfo() @@ -148,10 +160,31 @@ struct CandleStickChart: View { @State private var selectedPrice: StockPrice? @State private var date = Calendar.current.date(byAdding: .month, value: -12, to: Date())! @State private var type: CandleType = .month + @State var xAxisValues = [Date]() + let dateFormatter: DateFormatter + + init(symbol: String) { + dateFormatter = DateFormatter() + dateFormatter.dateStyle = DateFormatter.Style.short + dateFormatter.timeStyle = DateFormatter.Style.none - init() { - self.list = CandleList() + + self.list = CandleList(symbol: symbol) self.list.updateDate(date: self.date, type: self.type) + _xAxisValues = State(initialValue: calculateXaxisValues(firstValue: self.date)) + } + + func calculateXaxisValues(firstValue: Date) -> [Date] { + var values = [Date]() + let endDate = Date.now + let delta = endDate.distance(to: firstValue) + + let maxInterval = 4 + for index in 0...maxInterval { + let value = endDate.addingTimeInterval(TimeInterval(index) * delta / TimeInterval(maxInterval)) + values.append(value) + } + return values.reversed() } var body: some View { @@ -164,7 +197,9 @@ struct CandleStickChart: View { displayedComponents: [.date] ).onChange(of: date) { oldValue, newValue in selectedPrice = nil + xAxisValues = calculateXaxisValues(firstValue: newValue) list.updateDate(date: newValue,type: type) + } Picker("Type", selection: $type) { Text("Week").tag(CandleType.week) @@ -206,6 +241,20 @@ from \(date) .foregroundStyle( price.close >= price.open ? .green : .red) } .chartYAxis { AxisMarks(preset: .extended) } + .chartXAxis { + AxisMarks(values: xAxisValues) { value in + if let date = value.as(Date.self) { + AxisValueLabel(horizontalSpacing: -14, verticalSpacing: 10) { + VStack(alignment: .leading) { + Text(dateFormatter.string(from: date)) + } + } + } + AxisGridLine(centered: true, stroke: StrokeStyle(lineWidth: 0.5)) + AxisTick(centered: true, length: 0, stroke: .none) + } + } + .chartOverlay { proxy in GeometryReader { geo in Rectangle().fill(.clear).contentShape(Rectangle()) @@ -246,7 +295,7 @@ from \(date) .frame(width: 2, height: lineHeight) .position(x: lineX, y: lineHeight / 2) - PriceAnnotation(for: selectedPrice, currency: list.currency) + CandleInfoView(for: selectedPrice, currency: list.currency) .frame(width: boxWidth, alignment: .leading) .background { RoundedRectangle(cornerRadius: 13) @@ -390,7 +439,7 @@ extension CandleStickChart: AXChartDescriptorRepresentable { // MARK: - Preview -struct PriceAnnotation: View { +struct CandleInfoView: View { let price: StockPrice let currency: String @@ -402,19 +451,13 @@ struct PriceAnnotation: View { var body: some View { VStack(alignment: .center, spacing: 4) { Text(price.timestamp.formatted(date: .abbreviated, time: .omitted)) - - HStack(spacing: 0) { - Text("Open: \(price.open.formatted(.currency(code: currency)))" ).foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) - - Text("Close: \(price.close.formatted(.currency(code: currency)))").foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) - + HStack(spacing: 10) { + Text("Open: \(price.open.formatted(.currency(code: currency)))" ).foregroundColor(.secondary).frame(minWidth: 0, maxWidth: .infinity, alignment: .leading).minimumScaleFactor(0.01) + Text("Close: \(price.close.formatted(.currency(code: currency)))").foregroundColor(.secondary).frame(minWidth: 0, maxWidth: .infinity, alignment: .leading).minimumScaleFactor(0.01) } - - HStack(spacing: 0) { - Text("High: \(price.high.formatted(.currency(code: currency)))").foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) - - Text("Low: \(price.low.formatted(.currency(code: currency)))").foregroundColor(.secondary) .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading) - + HStack(spacing: 10) { + Text("High: \(price.high.formatted(.currency(code: currency)))").foregroundColor(.secondary).frame(minWidth: 0, maxWidth: .infinity, alignment: .leading).minimumScaleFactor(0.01) + Text("Low: \(price.low.formatted(.currency(code: currency)))").foregroundColor(.secondary).frame(minWidth: 0, maxWidth: .infinity, alignment: .leading).minimumScaleFactor(0.01) } } .lineLimit(1) @@ -422,9 +465,3 @@ struct PriceAnnotation: View { .padding(.vertical) } } - -struct CandleStickChart_Previews: PreviewProvider { - static var previews: some View { - CandleStickChart() - } -} diff --git a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift index 73d68f69b..c4b93bfcb 100644 --- a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift +++ b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift @@ -11,7 +11,7 @@ import SwiftUI struct DXFeedCandleChartApp: App { var body: some Scene { WindowGroup { - CandleStickChart() + CandleStickChart(symbol: "ETH/USD:GDAX") } } } From 37c97029d8b013419a0dbf576378e86d34e5f785 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Tue, 30 Apr 2024 16:45:01 +0200 Subject: [PATCH 03/51] feat: candle_charts WIP --- .../DXFeedCandleChart/CandleStickChart.swift | 274 +++++++++--------- 1 file changed, 141 insertions(+), 133 deletions(-) diff --git a/Samples/DXFeedCandleChart/CandleStickChart.swift b/Samples/DXFeedCandleChart/CandleStickChart.swift index 0f147de7f..d3e8f778d 100644 --- a/Samples/DXFeedCandleChart/CandleStickChart.swift +++ b/Samples/DXFeedCandleChart/CandleStickChart.swift @@ -9,18 +9,24 @@ import SwiftUI import Charts import DXFeedFramework -enum Constants { - static let previewChartHeight: CGFloat = 100 -} - extension Decimal { var asDouble: Double { Double(truncating: self as NSNumber) } + + func formatted(currency: String) -> String { + return self.formatted(.currency(code: currency)) + } +} + +extension Double { + func formatted(currency: String) -> String { + return self.formatted(.currency(code: currency)) + } } extension StockPrice { - + var isClosingHigher: Bool { - self.open < self.close + self.open <= self.close } var accessibilityTrendSummary: String { @@ -28,18 +34,18 @@ extension StockPrice { } var accessibilityDescription: String { - return "Open: \(self.open.formatted(.currency(code: currency))), Close: \(self.close.formatted(.currency(code: currency))), High: \(self.high.formatted(.currency(code: currency))), Low: \(self.low.formatted(.currency(code: currency)))" + return "Open: \(self.open.formatted(currency: currency)), Close: \(self.close.formatted(currency: currency)), High: \(self.high.formatted(currency: currency)), Low: \(self.low.formatted(currency: currency))" } } extension Array { - mutating func safeReplace(_ newElement: Element, at:Int) { - if at >= 0 && at < self.count { - self[at] = newElement - } else { - print("error during replace") - } - } + mutating func safeReplace(_ newElement: Element, at:Int) { + if at >= 0 && at < self.count { + self[at] = newElement + } else { + print("error during replace") + } + } } enum CandleType: CaseIterable, Identifiable { @@ -117,7 +123,7 @@ class CandleList: ObservableObject, SnapshotDelegate { var feed: DXFeed! var subscription: DXFeedSubscription? var snapshotProcessor: SnapshotProcessor! - + @Published var candles: [StockPrice] init(symbol: String) { @@ -156,35 +162,37 @@ class CandleList: ObservableObject, SnapshotDelegate { } struct CandleStickChart: View { + static let startDate = Calendar.current.date(byAdding: .month, value: -12, to: Date())! + + static func calculateXaxisValues(firstValue: Date) -> [Date] { + var values = [Date]() + let endDate = Date.now + let delta = endDate.distance(to: firstValue) + + let maxInterval = 4 + for index in 0...maxInterval { + let value = endDate.addingTimeInterval(TimeInterval(index) * delta / TimeInterval(maxInterval)) + values.append(value) + } + return values.reversed() + } + @ObservedObject var list: CandleList @State private var selectedPrice: StockPrice? - @State private var date = Calendar.current.date(byAdding: .month, value: -12, to: Date())! + @State private var date = startDate @State private var type: CandleType = .month - @State var xAxisValues = [Date]() + @State var xAxisValues = CandleStickChart.calculateXaxisValues(firstValue: startDate) let dateFormatter: DateFormatter + let symbol: String init(symbol: String) { dateFormatter = DateFormatter() dateFormatter.dateStyle = DateFormatter.Style.short dateFormatter.timeStyle = DateFormatter.Style.none - + self.symbol = symbol self.list = CandleList(symbol: symbol) self.list.updateDate(date: self.date, type: self.type) - _xAxisValues = State(initialValue: calculateXaxisValues(firstValue: self.date)) - } - - func calculateXaxisValues(firstValue: Date) -> [Date] { - var values = [Date]() - let endDate = Date.now - let delta = endDate.distance(to: firstValue) - - let maxInterval = 4 - for index in 0...maxInterval { - let value = endDate.addingTimeInterval(TimeInterval(index) * delta / TimeInterval(maxInterval)) - values.append(value) - } - return values.reversed() } var body: some View { @@ -192,19 +200,18 @@ struct CandleStickChart: View { List { Section { DatePicker( - "Start Date", - selection: $date, - displayedComponents: [.date] + "Start Date", + selection: $date, + displayedComponents: [.date] ).onChange(of: date) { oldValue, newValue in selectedPrice = nil - xAxisValues = calculateXaxisValues(firstValue: newValue) + xAxisValues = CandleStickChart.calculateXaxisValues(firstValue: newValue) list.updateDate(date: newValue,type: type) - } Picker("Type", selection: $type) { - Text("Week").tag(CandleType.week) - Text("Month").tag(CandleType.month) - Text("Year").tag(CandleType.year) + ForEach(CandleType.allCases, id: \.self) { category in + Text(String(describing: category).capitalized).tag(category) + } }.onChange(of: type) { oldValue, newValue in selectedPrice = nil list.updateDate(date: date, type: newValue) @@ -215,108 +222,109 @@ struct CandleStickChart: View { } Section { Text(""" -Candles \(String(describing: type)) -\(list.descriptionString) -from \(date) +Symbol: \(symbol) +Type: \(String(describing: type).capitalized) +Description: \(list.descriptionString) +From time: \(date) """ ) - .font(.callout) + .font(.callout) } } } } private var chart: some View { - Chart($list.candles) { binding in - let price = binding.wrappedValue - - CandleStickMark( - timestamp: .value("Date", price.timestamp), - open: .value("Open", price.open), - high: .value("High", price.high), - low: .value("Low", price.low), - close: .value("Close", price.close) - ) - .accessibilityLabel("\(price.timestamp.formatted(date: .complete, time: .omitted)): \(price.accessibilityTrendSummary)") - .accessibilityValue(price.accessibilityDescription) - .accessibilityHidden(false) - .foregroundStyle( price.close >= price.open ? .green : .red) + Chart($list.candles) { binding in + let price = binding.wrappedValue + + CandleStickMark( + timestamp: .value("Date", price.timestamp), + open: .value("Open", price.open), + high: .value("High", price.high), + low: .value("Low", price.low), + close: .value("Close", price.close) + ) + .accessibilityLabel("\(price.timestamp.formatted(date: .complete, time: .omitted)): \(price.accessibilityTrendSummary)") + .accessibilityValue(price.accessibilityDescription) + .accessibilityHidden(false) + .foregroundStyle( price.isClosingHigher ? .green : .red) + } + .chartYAxis { AxisMarks(preset: .extended) } + .chartXAxis { + AxisMarks(values: xAxisValues) { value in + if let date = value.as(Date.self) { + AxisValueLabel(horizontalSpacing: -14, verticalSpacing: 10) { + VStack(alignment: .leading) { + Text(dateFormatter.string(from: date)) + } + } + } + AxisGridLine(centered: true, stroke: StrokeStyle(lineWidth: 0.5)) + AxisTick(centered: true, length: 0, stroke: .none) } - .chartYAxis { AxisMarks(preset: .extended) } - .chartXAxis { - AxisMarks(values: xAxisValues) { value in - if let date = value.as(Date.self) { - AxisValueLabel(horizontalSpacing: -14, verticalSpacing: 10) { - VStack(alignment: .leading) { - Text(dateFormatter.string(from: date)) - } - } - } - AxisGridLine(centered: true, stroke: StrokeStyle(lineWidth: 0.5)) - AxisTick(centered: true, length: 0, stroke: .none) + } + + .chartOverlay { proxy in + GeometryReader { geo in + Rectangle().fill(.clear).contentShape(Rectangle()) + .gesture( + SpatialTapGesture() + .onEnded { value in + let element = findElement(location: value.location, proxy: proxy, geometry: geo) + if selectedPrice?.timestamp == element?.timestamp { + // If tapping the same element, clear the selection. + selectedPrice = nil + } else { + selectedPrice = element } } - - .chartOverlay { proxy in - GeometryReader { geo in - Rectangle().fill(.clear).contentShape(Rectangle()) - .gesture( - SpatialTapGesture() - .onEnded { value in - let element = findElement(location: value.location, proxy: proxy, geometry: geo) - if selectedPrice?.timestamp == element?.timestamp { - // If tapping the same element, clear the selection. - selectedPrice = nil - } else { - selectedPrice = element + .exclusively( + before: DragGesture() + .onChanged { value in + selectedPrice = findElement(location: value.location, proxy: proxy, geometry: geo) } - } - .exclusively( - before: DragGesture() - .onChanged { value in - selectedPrice = findElement(location: value.location, proxy: proxy, geometry: geo) - } - ) - ) - } + ) + ) } - .chartOverlay { proxy in - ZStack(alignment: .topLeading) { - GeometryReader { geo in - if let selectedPrice { - let dateInterval = Calendar.current.dateInterval(of: .day, for: selectedPrice.timestamp)! - let startPositionX1 = proxy.position(forX: dateInterval.start) ?? 0 - - let lineX = startPositionX1 + geo[proxy.plotAreaFrame].origin.x - let lineHeight = geo[proxy.plotAreaFrame].maxY - let boxWidth: CGFloat = geo.size.width - let boxOffset = max(0, min(geo.size.width - boxWidth, lineX - boxWidth / 2)) - - Rectangle() - .fill(.gray.opacity(0.5)) - .frame(width: 2, height: lineHeight) - .position(x: lineX, y: lineHeight / 2) - - CandleInfoView(for: selectedPrice, currency: list.currency) - .frame(width: boxWidth, alignment: .leading) - .background { - RoundedRectangle(cornerRadius: 13) - .foregroundStyle(.thickMaterial) - .padding(.horizontal, -8) - .padding(.vertical, -4) - } - .offset(x: boxOffset) - .gesture( - TapGesture() - .onEnded { _ in - self.selectedPrice = nil - } - ) - } + } + .chartOverlay { proxy in + ZStack(alignment: .topLeading) { + GeometryReader { geo in + if let selectedPrice { + let dateInterval = Calendar.current.dateInterval(of: .day, for: selectedPrice.timestamp)! + let startPositionX1 = proxy.position(forX: dateInterval.start) ?? 0 + + let lineX = startPositionX1 + geo[proxy.plotAreaFrame].origin.x + let lineHeight = geo[proxy.plotAreaFrame].maxY + let boxWidth: CGFloat = geo.size.width + let boxOffset = max(0, min(geo.size.width - boxWidth, lineX - boxWidth / 2)) + + Rectangle() + .fill(.gray.opacity(0.5)) + .frame(width: 2, height: lineHeight) + .position(x: lineX, y: lineHeight / 2) + + CandleInfoView(for: selectedPrice, currency: list.currency) + .frame(width: boxWidth, alignment: .leading) + .background { + RoundedRectangle(cornerRadius: 13) + .foregroundStyle(.thickMaterial) + .padding(.horizontal, -8) + .padding(.vertical, -4) + } + .offset(x: boxOffset) + .gesture( + TapGesture() + .onEnded { _ in + self.selectedPrice = nil + } + ) } } } - .accessibilityChartDescriptor(self) - .chartYAxis(.automatic) - .chartXAxis(.automatic) + } + .accessibilityChartDescriptor(self) + .chartYAxis(.automatic) + .chartXAxis(.automatic) } @@ -394,25 +402,25 @@ extension CandleStickChart: AXChartDescriptorRepresentable { title: "Closing Price", range: 0...highestValue(\.close), gridlinePositions: [] - ) { value in "Closing: \(value.formatted(.currency(code: list.currency)))" } + ) { value in "Closing: \(value.formatted(currency: list.currency)))" } let openAxis = AXNumericDataAxisDescriptor( title: "Opening Price", range: lowestValue(\.open)...highestValue(\.open), gridlinePositions: [] - ) { value in "Opening: \(value.formatted(.currency(code: list.currency)))" } + ) { value in "Opening: \(value.formatted(currency: list.currency))" } let highAxis = AXNumericDataAxisDescriptor( title: "Highest Price", range: lowestValue(\.high)...highestValue(\.high), gridlinePositions: [] - ) { value in "High: \(value.formatted(.currency(code: list.currency)))" } + ) { value in "High: \(value.formatted(currency: list.currency))" } let lowAxis = AXNumericDataAxisDescriptor( title: "Lowest Price", range: lowestValue(\.low)...highestValue(\.low), gridlinePositions: [] - ) { value in "Low: \(value.formatted(.currency(code: list.currency)))" } + ) { value in "Low: \(value.formatted(currency: list.currency))" } let series = AXDataSeriesDescriptor( name: list.descriptionString, @@ -437,7 +445,7 @@ extension CandleStickChart: AXChartDescriptorRepresentable { } } -// MARK: - Preview +// MARK: - Detail Info View about candle struct CandleInfoView: View { let price: StockPrice From 0e88a916d9f9e107906e2aec2ede03c05fedc2b0 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Thu, 2 May 2024 16:02:35 +0200 Subject: [PATCH 04/51] customize color to dxfeed color scheme --- DXFeedFramework.xcodeproj/project.pbxproj | 10 ++- .../DXFeedCandleChart/CandleStickChart.swift | 71 +++++++++++-------- .../DXFeedCandleChartApp.swift | 3 +- 3 files changed, 52 insertions(+), 32 deletions(-) diff --git a/DXFeedFramework.xcodeproj/project.pbxproj b/DXFeedFramework.xcodeproj/project.pbxproj index cfbb5f8b1..0fb19b0f5 100644 --- a/DXFeedFramework.xcodeproj/project.pbxproj +++ b/DXFeedFramework.xcodeproj/project.pbxproj @@ -119,6 +119,7 @@ 643F41F92BDFE1B200A2176D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 643F41F82BDFE1B200A2176D /* Assets.xcassets */; }; 643F41FC2BDFE1B200A2176D /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 643F41FB2BDFE1B200A2176D /* Preview Assets.xcassets */; }; 643F42012BDFE25D00A2176D /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; + 643F42032BE3742D00A2176D /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 646979712A3B5AF60003A9BA /* Colors.xcassets */; }; 64437A8F2A9DEE6F005929B2 /* InstrumentProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64437A8E2A9DEE6F005929B2 /* InstrumentProfile.swift */; }; 64437A922A9DF1DE005929B2 /* NativeInstrumentProfileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64437A912A9DF1DE005929B2 /* NativeInstrumentProfileReader.swift */; }; 6447A5DB2A8E559000739CCF /* ILastingEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6447A5DA2A8E559000739CCF /* ILastingEvent.swift */; }; @@ -1935,6 +1936,8 @@ dependencies = ( ); name = DXFeedCandleChart; + packageProductDependencies = ( + ); productName = DXFeedCandleChart; productReference = 643F41F22BDFE1B000A2176D /* DXFeedCandleChart.app */; productType = "com.apple.product-type.application"; @@ -2154,6 +2157,8 @@ Base, ); mainGroup = 803BAC0329BFA50700FFAB1C; + packageReferences = ( + ); productRefGroup = 803BAC0E29BFA50700FFAB1C /* Products */; projectDirPath = ""; projectRoot = ""; @@ -2190,6 +2195,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 643F42032BE3742D00A2176D /* Colors.xcassets in Resources */, 643F41FC2BDFE1B200A2176D /* Preview Assets.xcassets in Resources */, 643F41F92BDFE1B200A2176D /* Assets.xcassets in Resources */, ); @@ -3032,7 +3038,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_ASSET_PATHS = "\"Samples/DXFeedCandleChart/Preview Content\""; + DEVELOPMENT_ASSET_PATHS = ""; ENABLE_PREVIEWS = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -3067,7 +3073,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_ASSET_PATHS = "\"Samples/DXFeedCandleChart/Preview Content\""; + DEVELOPMENT_ASSET_PATHS = ""; ENABLE_PREVIEWS = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; diff --git a/Samples/DXFeedCandleChart/CandleStickChart.swift b/Samples/DXFeedCandleChart/CandleStickChart.swift index d3e8f778d..632503043 100644 --- a/Samples/DXFeedCandleChart/CandleStickChart.swift +++ b/Samples/DXFeedCandleChart/CandleStickChart.swift @@ -34,7 +34,12 @@ extension StockPrice { } var accessibilityDescription: String { - return "Open: \(self.open.formatted(currency: currency)), Close: \(self.close.formatted(currency: currency)), High: \(self.high.formatted(currency: currency)), Low: \(self.low.formatted(currency: currency))" + return """ +Open: \(self.open.formatted(currency: currency)), \ +Close: \(self.close.formatted(currency: currency)), \ +High: \(self.high.formatted(currency: currency)), \ +Low: \(self.low.formatted(currency: currency)) +""" } } @@ -93,16 +98,13 @@ class CandleList: ObservableObject, SnapshotDelegate { let candle = event.candle result.append(candle) } - if isSnapshot { - DispatchQueue.main.async { + DispatchQueue.main.async { + if isSnapshot { self.candles = result.map({ candle in let price = StockPrice(candle: candle, currency: self.currency) return price }) - } - - } else { - DispatchQueue.main.async { + } else { result.forEach { candle in let newPrice = StockPrice(candle: candle, currency: self.currency) if let index = self.candles.firstIndex(where: { price in @@ -193,45 +195,53 @@ struct CandleStickChart: View { self.symbol = symbol self.list = CandleList(symbol: symbol) self.list.updateDate(date: self.date, type: self.type) + } var body: some View { GeometryReader { reader in List { + Section { - DatePicker( - "Start Date", - selection: $date, - displayedComponents: [.date] - ).onChange(of: date) { oldValue, newValue in - selectedPrice = nil - xAxisValues = CandleStickChart.calculateXaxisValues(firstValue: newValue) - list.updateDate(date: newValue,type: type) - } - Picker("Type", selection: $type) { + chart.frame(height: max(reader.size.height/2, 300)) + }.listRowBackground(Color.cellBackground) + + + Section("Chart parameters") { + Picker("Candle type", selection: $type) { ForEach(CandleType.allCases, id: \.self) { category in Text(String(describing: category).capitalized).tag(category) } }.onChange(of: type) { oldValue, newValue in selectedPrice = nil list.updateDate(date: date, type: newValue) + }.pickerStyle(SegmentedPickerStyle()) + + .foregroundStyle(.text) + DatePicker( + selection: $date, + displayedComponents: [.date] + ){ + Text("Choose from time") + }.onChange(of: date) { oldValue, newValue in + selectedPrice = nil + xAxisValues = CandleStickChart.calculateXaxisValues(firstValue: newValue) + list.updateDate(date: newValue,type: type) } + .datePickerStyle(.compact) + .foregroundStyle(.text) + } - Section { - chart.frame(height: reader.size.height/2) - } - Section { - Text(""" -Symbol: \(symbol) -Type: \(String(describing: type).capitalized) -Description: \(list.descriptionString) -From time: \(date) -""" ) - .font(.callout) - } + .listRowBackground(Color.cellBackground) + .listRowSeparator(.hidden) } + .preferredColorScheme(.dark) + .background(.tableBackground) + .scrollContentBackground(.hidden) + } } + private var chart: some View { Chart($list.candles) { binding in let price = binding.wrappedValue @@ -307,9 +317,11 @@ From time: \(date) .frame(width: boxWidth, alignment: .leading) .background { RoundedRectangle(cornerRadius: 13) + .fill(Color.priceBackground) .foregroundStyle(.thickMaterial) .padding(.horizontal, -8) .padding(.vertical, -4) + } .offset(x: boxOffset) .gesture( @@ -472,4 +484,5 @@ struct CandleInfoView: View { .font(.headline) .padding(.vertical) } + } diff --git a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift index c4b93bfcb..f19e856ef 100644 --- a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift +++ b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift @@ -11,10 +11,11 @@ import SwiftUI struct DXFeedCandleChartApp: App { var body: some Scene { WindowGroup { - CandleStickChart(symbol: "ETH/USD:GDAX") + CandleStickChart(symbol: "AAPL") } } } + From d5b6f17b30e69c4a9a37c917045b5763f56dd7ee Mon Sep 17 00:00:00 2001 From: kosyloa Date: Fri, 3 May 2024 09:13:06 +0200 Subject: [PATCH 05/51] reformat code --- Samples/DXFeedCandleChart/CandleStickChart.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Samples/DXFeedCandleChart/CandleStickChart.swift b/Samples/DXFeedCandleChart/CandleStickChart.swift index 632503043..a8caa7842 100644 --- a/Samples/DXFeedCandleChart/CandleStickChart.swift +++ b/Samples/DXFeedCandleChart/CandleStickChart.swift @@ -217,16 +217,16 @@ struct CandleStickChart: View { list.updateDate(date: date, type: newValue) }.pickerStyle(SegmentedPickerStyle()) - .foregroundStyle(.text) + .foregroundStyle(.text) DatePicker( selection: $date, displayedComponents: [.date] - ){ + ) { Text("Choose from time") - }.onChange(of: date) { oldValue, newValue in + }.onChange(of: date) { _, newValue in selectedPrice = nil xAxisValues = CandleStickChart.calculateXaxisValues(firstValue: newValue) - list.updateDate(date: newValue,type: type) + list.updateDate(date: newValue, type: type) } .datePickerStyle(.compact) .foregroundStyle(.text) From d8a50640da0e2a7213e242550ca25614b6b3fd2a Mon Sep 17 00:00:00 2001 From: kosyloa Date: Fri, 3 May 2024 12:34:25 +0200 Subject: [PATCH 06/51] add separate target for mac candle chart sample --- DXFeedFramework.xcodeproj/project.pbxproj | 221 +++++++++++++++++- .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/128-mac.png | Bin 0 -> 2694 bytes .../AppIcon.appiconset/16-mac.png | Bin 0 -> 278 bytes .../AppIcon.appiconset/256-mac.png | Bin 0 -> 6016 bytes .../AppIcon.appiconset/32-mac.png | Bin 0 -> 620 bytes .../AppIcon.appiconset/512-mac.png | Bin 0 -> 13418 bytes .../AppIcon.appiconset/64-mac.png | Bin 0 -> 1168 bytes .../AppIcon.appiconset/Contents.json | 1 + .../Assets.xcassets/Contents.json | 6 + .../CandleStickChart.swift | 15 +- .../DXFeedCandleChartMac.entitlements | 14 ++ .../DXFeedCandleChartMacApp.swift | 22 ++ .../Preview Assets.xcassets/Contents.json | 6 + 14 files changed, 288 insertions(+), 8 deletions(-) create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/128-mac.png create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/16-mac.png create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/256-mac.png create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/32-mac.png create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/512-mac.png create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/64-mac.png create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/Contents.json rename Samples/{DXFeedCandleChart => DXFeedCandleChartMac}/CandleStickChart.swift (97%) create mode 100644 Samples/DXFeedCandleChartMac/DXFeedCandleChartMac.entitlements create mode 100644 Samples/DXFeedCandleChartMac/DXFeedCandleChartMacApp.swift create mode 100644 Samples/DXFeedCandleChartMac/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/DXFeedFramework.xcodeproj/project.pbxproj b/DXFeedFramework.xcodeproj/project.pbxproj index 0fb19b0f5..53681499d 100644 --- a/DXFeedFramework.xcodeproj/project.pbxproj +++ b/DXFeedFramework.xcodeproj/project.pbxproj @@ -80,6 +80,8 @@ 6423E4652B445B92006B208D /* DXFeedTimeSeriesSubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6423E4642B445B92006B208D /* DXFeedTimeSeriesSubscription.swift */; }; 6423E4672B44613D006B208D /* NativeTimeSeriesSubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6423E4662B44613D006B208D /* NativeTimeSeriesSubscription.swift */; }; 6423E4692B457000006B208D /* DXTimeSeriesSubscriptionTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6423E4682B457000006B208D /* DXTimeSeriesSubscriptionTest.swift */; }; + 64245BC42BE4DD7C00901522 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 64245BC32BE4DD7C00901522 /* Assets.xcassets */; }; + 64245BC72BE4DD7C00901522 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 64245BC62BE4DD7C00901522 /* Preview Assets.xcassets */; }; 642528D02A3C534D00A04E41 /* TimeInterval+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8CD2A3B2F9900846831 /* TimeInterval+Ext.swift */; }; 642528D12A3C534D00A04E41 /* TimeInterval+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8CD2A3B2F9900846831 /* TimeInterval+Ext.swift */; }; 6425BE982B4849BE0071D706 /* DXFeedFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 803BAC0D29BFA50700FFAB1C /* DXFeedFramework.framework */; }; @@ -118,7 +120,6 @@ 643F41F52BDFE1B000A2176D /* DXFeedCandleChartApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F41F42BDFE1B000A2176D /* DXFeedCandleChartApp.swift */; }; 643F41F92BDFE1B200A2176D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 643F41F82BDFE1B200A2176D /* Assets.xcassets */; }; 643F41FC2BDFE1B200A2176D /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 643F41FB2BDFE1B200A2176D /* Preview Assets.xcassets */; }; - 643F42012BDFE25D00A2176D /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; 643F42032BE3742D00A2176D /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 646979712A3B5AF60003A9BA /* Colors.xcassets */; }; 64437A8F2A9DEE6F005929B2 /* InstrumentProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64437A8E2A9DEE6F005929B2 /* InstrumentProfile.swift */; }; 64437A922A9DF1DE005929B2 /* NativeInstrumentProfileReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64437A912A9DF1DE005929B2 /* NativeInstrumentProfileReader.swift */; }; @@ -216,6 +217,13 @@ 646D19E32A3C994100C82315 /* DXFTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 646D19E02A3C970700C82315 /* DXFTimer.swift */; }; 647426AD2ABC85F20012F793 /* Arguments.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647426AC2ABC85F20012F793 /* Arguments.swift */; }; 647426AF2ABC93900012F793 /* EventCode+String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647426AE2ABC93900012F793 /* EventCode+String.swift */; }; + 647A513D2BE4DDB600B8B8C9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 647A51372BE4DDB600B8B8C9 /* Assets.xcassets */; }; + 647A513E2BE4DDB600B8B8C9 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 647A51392BE4DDB600B8B8C9 /* Preview Assets.xcassets */; }; + 647A513F2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647A513B2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift */; }; + 647A51412BE4DF3700B8B8C9 /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; + 647A51442BE4DFD600B8B8C9 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 646979712A3B5AF60003A9BA /* Colors.xcassets */; }; + 647A51452BE4E02700B8B8C9 /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; + 647A51482BE4EE0600B8B8C9 /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; 64820AAF2BB2E26100BDFD0B /* DXOtcMarketOrderTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64820AAE2BB2E26100BDFD0B /* DXOtcMarketOrderTest.swift */; }; 6482F3D12BA492A60079AC3D /* SymbolsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6482F3D02BA492A60079AC3D /* SymbolsViewController.swift */; }; 6482F3D22BA492A60079AC3D /* SymbolsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6482F3D02BA492A60079AC3D /* SymbolsViewController.swift */; }; @@ -453,6 +461,20 @@ remoteGlobalIDString = 803BAC0C29BFA50700FFAB1C; remoteInfo = DXFeedFramework; }; + 647A51422BE4DFBF00B8B8C9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 803BAC0429BFA50700FFAB1C /* Project object */; + proxyType = 1; + remoteGlobalIDString = 803BAC0C29BFA50700FFAB1C; + remoteInfo = DXFeedFramework; + }; + 647A51462BE4E03A00B8B8C9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 803BAC0429BFA50700FFAB1C /* Project object */; + proxyType = 1; + remoteGlobalIDString = 803BAC0C29BFA50700FFAB1C; + remoteInfo = DXFeedFramework; + }; 64B4365F2AB9DA470003919E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 803BAC0429BFA50700FFAB1C /* Project object */; @@ -653,6 +675,12 @@ 6423E4642B445B92006B208D /* DXFeedTimeSeriesSubscription.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DXFeedTimeSeriesSubscription.swift; sourceTree = ""; }; 6423E4662B44613D006B208D /* NativeTimeSeriesSubscription.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeTimeSeriesSubscription.swift; sourceTree = ""; }; 6423E4682B457000006B208D /* DXTimeSeriesSubscriptionTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DXTimeSeriesSubscriptionTest.swift; sourceTree = ""; }; + 64245BBD2BE4DD7B00901522 /* DXFeedCandleChartMac.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DXFeedCandleChartMac.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 64245BBF2BE4DD7B00901522 /* DXFeedCandleChartMacApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DXFeedCandleChartMacApp.swift; sourceTree = ""; }; + 64245BC12BE4DD7B00901522 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 64245BC32BE4DD7C00901522 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 64245BC62BE4DD7C00901522 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 64245BC82BE4DD7C00901522 /* DXFeedCandleChartMac.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DXFeedCandleChartMac.entitlements; sourceTree = ""; }; 64278C6B2A602CA20074B5AA /* CandleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CandleTests.swift; sourceTree = ""; }; 64278C6D2A602D2B0074B5AA /* Candle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Candle.swift; sourceTree = ""; }; 64278C6F2A602FA00074B5AA /* Candle+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Candle+Ext.swift"; sourceTree = ""; }; @@ -761,6 +789,10 @@ 646D19E02A3C970700C82315 /* DXFTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DXFTimer.swift; sourceTree = ""; }; 647426AC2ABC85F20012F793 /* Arguments.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Arguments.swift; sourceTree = ""; }; 647426AE2ABC93900012F793 /* EventCode+String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EventCode+String.swift"; sourceTree = ""; }; + 647A51372BE4DDB600B8B8C9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 647A51392BE4DDB600B8B8C9 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 647A513A2BE4DDB600B8B8C9 /* DXFeedCandleChartMac.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = DXFeedCandleChartMac.entitlements; sourceTree = ""; }; + 647A513B2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DXFeedCandleChartMacApp.swift; sourceTree = ""; }; 64820AAE2BB2E26100BDFD0B /* DXOtcMarketOrderTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DXOtcMarketOrderTest.swift; sourceTree = ""; }; 6482F3D02BA492A60079AC3D /* SymbolsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolsViewController.swift; sourceTree = ""; }; 6482F3D62BA49AB70079AC3D /* AddSymbolsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSymbolsViewController.swift; sourceTree = ""; }; @@ -953,6 +985,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 64245BBA2BE4DD7B00901522 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 642DC9222AAA21C000974F5C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1136,6 +1175,27 @@ path = Playgrounds; sourceTree = ""; }; + 64245BBE2BE4DD7B00901522 /* DXFeedCandleChartMac */ = { + isa = PBXGroup; + children = ( + 64245BBF2BE4DD7B00901522 /* DXFeedCandleChartMacApp.swift */, + 64245BC12BE4DD7B00901522 /* ContentView.swift */, + 64245BC32BE4DD7C00901522 /* Assets.xcassets */, + 64245BC82BE4DD7C00901522 /* DXFeedCandleChartMac.entitlements */, + 64245BC52BE4DD7C00901522 /* Preview Content */, + ); + name = DXFeedCandleChartMac; + path = ../../DXFeedCandleChartMac; + sourceTree = ""; + }; + 64245BC52BE4DD7C00901522 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 64245BC62BE4DD7C00901522 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; 64262CCB2A4DA64700BA6BA3 /* Packages */ = { isa = PBXGroup; children = ( @@ -1229,7 +1289,6 @@ isa = PBXGroup; children = ( 643F41F42BDFE1B000A2176D /* DXFeedCandleChartApp.swift */, - 643F42002BDFE25D00A2176D /* CandleStickChart.swift */, 643F41F82BDFE1B200A2176D /* Assets.xcassets */, 643F41FA2BDFE1B200A2176D /* Preview Content */, ); @@ -1370,6 +1429,26 @@ path = Utils; sourceTree = ""; }; + 647A51362BE4DDB600B8B8C9 /* DXFeedCandleChartMac */ = { + isa = PBXGroup; + children = ( + 647A51372BE4DDB600B8B8C9 /* Assets.xcassets */, + 647A51382BE4DDB600B8B8C9 /* Preview Content */, + 647A513A2BE4DDB600B8B8C9 /* DXFeedCandleChartMac.entitlements */, + 647A513B2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift */, + 643F42002BDFE25D00A2176D /* CandleStickChart.swift */, + ); + path = DXFeedCandleChartMac; + sourceTree = ""; + }; + 647A51382BE4DDB600B8B8C9 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 647A51392BE4DDB600B8B8C9 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; 6486B9592AD00E0B00D8D5FA /* Extra */ = { isa = PBXGroup; children = ( @@ -1506,6 +1585,7 @@ 64B4364C2AB9D3410003919E /* ScheduleSampleApp */ = { isa = PBXGroup; children = ( + 64245BBE2BE4DD7B00901522 /* DXFeedCandleChartMac */, 64B4364D2AB9D3410003919E /* AppDelegate.swift */, 64B4364F2AB9D3410003919E /* SceneDelegate.swift */, 64B436512AB9D3410003919E /* ViewController.swift */, @@ -1570,6 +1650,7 @@ 6469F8D12A3B400100846831 /* Utils */, 644BD75B2A44726F00A0BF99 /* ARQuoteTableApp */, 643F41F32BDFE1B000A2176D /* DXFeedCandleChart */, + 647A51362BE4DDB600B8B8C9 /* DXFeedCandleChartMac */, 64D8BB3C2A39BB730071BC88 /* LatencyTestApp */, 64B6275D2A3761A000196D07 /* PertTestApp */, 64B627162A375BBA00196D07 /* QuoteTableApp */, @@ -1664,6 +1745,7 @@ 64148B642ABB5C320063110E /* Tools */, 6455C3B82B20A44D00257986 /* QdsTools.app */, 643F41F22BDFE1B000A2176D /* DXFeedCandleChart.app */, + 64245BBD2BE4DD7B00901522 /* DXFeedCandleChartMac.app */, ); name = Products; sourceTree = ""; @@ -1903,6 +1985,24 @@ productReference = 64148B642ABB5C320063110E /* Tools */; productType = "com.apple.product-type.tool"; }; + 64245BBC2BE4DD7B00901522 /* DXFeedCandleChartMac */ = { + isa = PBXNativeTarget; + buildConfigurationList = 64245BC92BE4DD7C00901522 /* Build configuration list for PBXNativeTarget "DXFeedCandleChartMac" */; + buildPhases = ( + 64245BB92BE4DD7B00901522 /* Sources */, + 64245BBA2BE4DD7B00901522 /* Frameworks */, + 64245BBB2BE4DD7B00901522 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 647A51432BE4DFBF00B8B8C9 /* PBXTargetDependency */, + ); + name = DXFeedCandleChartMac; + productName = DXFeedCandleChartMac; + productReference = 64245BBD2BE4DD7B00901522 /* DXFeedCandleChartMac.app */; + productType = "com.apple.product-type.application"; + }; 642DC9242AAA21C000974F5C /* DXIpfTableApp */ = { isa = PBXNativeTarget; buildConfigurationList = 642DC9382AAA21C300974F5C /* Build configuration list for PBXNativeTarget "DXIpfTableApp" */; @@ -1934,6 +2034,7 @@ buildRules = ( ); dependencies = ( + 647A51472BE4E03A00B8B8C9 /* PBXTargetDependency */, ); name = DXFeedCandleChart; packageProductDependencies = ( @@ -2111,6 +2212,9 @@ 64148B632ABB5C320063110E = { CreatedOnToolsVersion = 14.3; }; + 64245BBC2BE4DD7B00901522 = { + CreatedOnToolsVersion = 15.2; + }; 642DC9242AAA21C000974F5C = { CreatedOnToolsVersion = 15.0; }; @@ -2175,11 +2279,24 @@ 6455C3B72B20A44D00257986 /* QdsTools */, 64148B632ABB5C320063110E /* Tools */, 643F41F12BDFE1B000A2176D /* DXFeedCandleChart */, + 64245BBC2BE4DD7B00901522 /* DXFeedCandleChartMac */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 64245BBB2BE4DD7B00901522 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 647A51442BE4DFD600B8B8C9 /* Colors.xcassets in Resources */, + 647A513E2BE4DDB600B8B8C9 /* Preview Assets.xcassets in Resources */, + 64245BC72BE4DD7C00901522 /* Preview Assets.xcassets in Resources */, + 647A513D2BE4DDB600B8B8C9 /* Assets.xcassets in Resources */, + 64245BC42BE4DD7C00901522 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 642DC9232AAA21C000974F5C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2374,6 +2491,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 64245BB92BE4DD7B00901522 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 647A513F2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift in Sources */, + 647A51412BE4DF3700B8B8C9 /* CandleStickChart.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 642DC9212AAA21C000974F5C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2390,8 +2516,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 647A51452BE4E02700B8B8C9 /* CandleStickChart.swift in Sources */, 643F41F52BDFE1B000A2176D /* DXFeedCandleChartApp.swift in Sources */, - 643F42012BDFE25D00A2176D /* CandleStickChart.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2452,6 +2578,7 @@ 6469F8D62A3B408900846831 /* Endpoint+Ext.swift in Sources */, 64B6273B2A375C0F00196D07 /* PaddingLabel.swift in Sources */, 64B627402A375C0F00196D07 /* SceneDelegate.swift in Sources */, + 647A51482BE4EE0600B8B8C9 /* CandleStickChart.swift in Sources */, 6469F8D82A3B4AA400846831 /* MetricCell.swift in Sources */, 646D19E22A3C994000C82315 /* DXFTimer.swift in Sources */, 64B6273E2A375C0F00196D07 /* QuoteTableViewController.swift in Sources */, @@ -2785,6 +2912,16 @@ target = 803BAC0C29BFA50700FFAB1C /* DXFeedFramework */; targetProxy = 6455C3D02B20A61400257986 /* PBXContainerItemProxy */; }; + 647A51432BE4DFBF00B8B8C9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 803BAC0C29BFA50700FFAB1C /* DXFeedFramework */; + targetProxy = 647A51422BE4DFBF00B8B8C9 /* PBXContainerItemProxy */; + }; + 647A51472BE4E03A00B8B8C9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 803BAC0C29BFA50700FFAB1C /* DXFeedFramework */; + targetProxy = 647A51462BE4E03A00B8B8C9 /* PBXContainerItemProxy */; + }; 64B436602AB9DA470003919E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 803BAC0C29BFA50700FFAB1C /* DXFeedFramework */; @@ -2958,6 +3095,75 @@ }; name = Release; }; + 64245BCA2BE4DD7C00901522 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Samples/DXFeedCandleChartMac/DXFeedCandleChartMac.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Samples/DXFeedCandleChartMac/Preview Content\""; + DEVELOPMENT_TEAM = 485XM3FRHB; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.dxfeed.DXFeedCandleChartMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 64245BCB2BE4DD7C00901522 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Samples/DXFeedCandleChartMac/DXFeedCandleChartMac.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Samples/DXFeedCandleChartMac/Preview Content\""; + DEVELOPMENT_TEAM = 485XM3FRHB; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.dxfeed.DXFeedCandleChartMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; 642DC9362AAA21C300974F5C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3801,6 +4007,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 64245BC92BE4DD7C00901522 /* Build configuration list for PBXNativeTarget "DXFeedCandleChartMac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 64245BCA2BE4DD7C00901522 /* Debug */, + 64245BCB2BE4DD7C00901522 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 642DC9382AAA21C300974F5C /* Build configuration list for PBXNativeTarget "DXIpfTableApp" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Samples/DXFeedCandleChartMac/Assets.xcassets/AccentColor.colorset/Contents.json b/Samples/DXFeedCandleChartMac/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 000000000..eb8789700 --- /dev/null +++ b/Samples/DXFeedCandleChartMac/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/128-mac.png b/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/128-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac8b09b59185dbfbc737fe569061c8a2ce24726 GIT binary patch literal 2694 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 AT>t<8 literal 0 HcmV?d00001 diff --git a/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/16-mac.png b/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/16-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..9db1b1023421d46ac94831d6a12e0aa331ac9897 GIT binary patch literal 278 zcmWIYbaUflWMBw)bqWXzu!!JdU|b@C3c^a_R_t>^4dJ^#2)PX7!G&|ZZupe-Mm80Io+2>|V9bWl^B!%)^B z$WU>zw828Q?RLg0pn`w@wL?GNIkEhu@2AH5#rtml|Fe49mzF=XY_ccaW;whde4fhU z)XKyEI~V>b`!fITvf};g{|Kn1{=Yf(=f71_l7cdUg8% literal 0 HcmV?d00001 diff --git a/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/256-mac.png b/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/256-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..52e0a034de5507a4fcc5b0b5e7f04352d3add97a GIT binary patch literal 6016 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 GumAumhAdG4 literal 0 HcmV?d00001 diff --git a/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/512-mac.png b/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/512-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..0a4ea596084d2f8cc94b8fd234de55f2db31ed15 GIT binary patch literal 13418 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 + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + com.apple.security.network.client + + com.apple.security.network.server + + + diff --git a/Samples/DXFeedCandleChartMac/DXFeedCandleChartMacApp.swift b/Samples/DXFeedCandleChartMac/DXFeedCandleChartMacApp.swift new file mode 100644 index 000000000..7dcfae6d5 --- /dev/null +++ b/Samples/DXFeedCandleChartMac/DXFeedCandleChartMacApp.swift @@ -0,0 +1,22 @@ +// +// +// 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 SwiftUI + +@main +struct DXFeedCandleChartMacApp: App { + let symbol = "AAPL" + var body: some Scene { + WindowGroup { + CandleStickChart(symbol: symbol, + type: .week, + date: Calendar.current.date(byAdding: .year, value: -4, to: Date())) + .navigationTitle("CandleChart: \(symbol)") + } + .defaultSize(width: 800, height: 800) + } +} diff --git a/Samples/DXFeedCandleChartMac/Preview Content/Preview Assets.xcassets/Contents.json b/Samples/DXFeedCandleChartMac/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/Samples/DXFeedCandleChartMac/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} From bc796d85c733e5abf3cd558fb69464c74fc1809a Mon Sep 17 00:00:00 2001 From: kosyloa Date: Fri, 3 May 2024 14:56:29 +0200 Subject: [PATCH 07/51] integrate candle chart in quote table app --- DXFeedFramework.xcodeproj/project.pbxproj | 24 ++++--- .../DXFeedCandleChartApp.swift | 2 +- .../AppIcon.appiconset/1024-mac.png | Bin 0 -> 24102 bytes .../CandleStickChart.swift | 67 ++++++++++-------- Samples/DXFeedCandleChartMac/Color+Ext.swift | 24 +++++++ .../DXFeedCandleChartMacApp.swift | 3 +- .../QuoteTableApp/Base.lproj/Main.storyboard | 7 +- .../QuoteTableViewController.swift | 20 ++++++ Samples/Utils/Colors.swift | 14 ++-- 9 files changed, 108 insertions(+), 53 deletions(-) create mode 100644 Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/1024-mac.png create mode 100644 Samples/DXFeedCandleChartMac/Color+Ext.swift diff --git a/DXFeedFramework.xcodeproj/project.pbxproj b/DXFeedFramework.xcodeproj/project.pbxproj index 53681499d..94c33874b 100644 --- a/DXFeedFramework.xcodeproj/project.pbxproj +++ b/DXFeedFramework.xcodeproj/project.pbxproj @@ -205,7 +205,6 @@ 6469F8C82A3B25C900846831 /* MarketEvent+Access.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8C72A3B25C900846831 /* MarketEvent+Access.swift */; }; 6469F8CF2A3B300A00846831 /* MetricCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8CB2A3B2F1200846831 /* MetricCell.swift */; }; 6469F8D02A3B301C00846831 /* TimeInterval+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8CD2A3B2F9900846831 /* TimeInterval+Ext.swift */; }; - 6469F8D32A3B401700846831 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8D22A3B401700846831 /* Colors.swift */; }; 6469F8D42A3B401700846831 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8D22A3B401700846831 /* Colors.swift */; }; 6469F8D52A3B401700846831 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8D22A3B401700846831 /* Colors.swift */; }; 6469F8D62A3B408900846831 /* Endpoint+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B6277C2A3762D000196D07 /* Endpoint+Ext.swift */; }; @@ -220,10 +219,14 @@ 647A513D2BE4DDB600B8B8C9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 647A51372BE4DDB600B8B8C9 /* Assets.xcassets */; }; 647A513E2BE4DDB600B8B8C9 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 647A51392BE4DDB600B8B8C9 /* Preview Assets.xcassets */; }; 647A513F2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647A513B2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift */; }; - 647A51412BE4DF3700B8B8C9 /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; 647A51442BE4DFD600B8B8C9 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 646979712A3B5AF60003A9BA /* Colors.xcassets */; }; 647A51452BE4E02700B8B8C9 /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; 647A51482BE4EE0600B8B8C9 /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; + 647A51492BE4F71700B8B8C9 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6469F8D22A3B401700846831 /* Colors.swift */; }; + 647A514F2BE5113A00B8B8C9 /* Color+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647A514B2BE5102800B8B8C9 /* Color+Ext.swift */; }; + 647A51502BE5129200B8B8C9 /* Color+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647A514B2BE5102800B8B8C9 /* Color+Ext.swift */; }; + 647A51512BE512E100B8B8C9 /* CandleStickChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643F42002BDFE25D00A2176D /* CandleStickChart.swift */; }; + 647A51532BE5141600B8B8C9 /* Color+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647A514B2BE5102800B8B8C9 /* Color+Ext.swift */; }; 64820AAF2BB2E26100BDFD0B /* DXOtcMarketOrderTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64820AAE2BB2E26100BDFD0B /* DXOtcMarketOrderTest.swift */; }; 6482F3D12BA492A60079AC3D /* SymbolsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6482F3D02BA492A60079AC3D /* SymbolsViewController.swift */; }; 6482F3D22BA492A60079AC3D /* SymbolsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6482F3D02BA492A60079AC3D /* SymbolsViewController.swift */; }; @@ -793,6 +796,7 @@ 647A51392BE4DDB600B8B8C9 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 647A513A2BE4DDB600B8B8C9 /* DXFeedCandleChartMac.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = DXFeedCandleChartMac.entitlements; sourceTree = ""; }; 647A513B2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DXFeedCandleChartMacApp.swift; sourceTree = ""; }; + 647A514B2BE5102800B8B8C9 /* Color+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Ext.swift"; sourceTree = ""; }; 64820AAE2BB2E26100BDFD0B /* DXOtcMarketOrderTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DXOtcMarketOrderTest.swift; sourceTree = ""; }; 6482F3D02BA492A60079AC3D /* SymbolsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolsViewController.swift; sourceTree = ""; }; 6482F3D62BA49AB70079AC3D /* AddSymbolsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSymbolsViewController.swift; sourceTree = ""; }; @@ -1436,6 +1440,7 @@ 647A51382BE4DDB600B8B8C9 /* Preview Content */, 647A513A2BE4DDB600B8B8C9 /* DXFeedCandleChartMac.entitlements */, 647A513B2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift */, + 647A514B2BE5102800B8B8C9 /* Color+Ext.swift */, 643F42002BDFE25D00A2176D /* CandleStickChart.swift */, ); path = DXFeedCandleChartMac; @@ -2496,7 +2501,8 @@ buildActionMask = 2147483647; files = ( 647A513F2BE4DDB600B8B8C9 /* DXFeedCandleChartMacApp.swift in Sources */, - 647A51412BE4DF3700B8B8C9 /* CandleStickChart.swift in Sources */, + 647A51512BE512E100B8B8C9 /* CandleStickChart.swift in Sources */, + 647A51532BE5141600B8B8C9 /* Color+Ext.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2518,6 +2524,7 @@ files = ( 647A51452BE4E02700B8B8C9 /* CandleStickChart.swift in Sources */, 643F41F52BDFE1B000A2176D /* DXFeedCandleChartApp.swift in Sources */, + 647A51502BE5129200B8B8C9 /* Color+Ext.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2574,12 +2581,13 @@ 64B6273A2A375C0F00196D07 /* QuoteCell.swift in Sources */, 640F8A532BA9C8D600C7BE22 /* SymbolsDataProvider.swift in Sources */, 6482F3D72BA49AB70079AC3D /* AddSymbolsViewController.swift in Sources */, - 6469F8D32A3B401700846831 /* Colors.swift in Sources */, + 647A514F2BE5113A00B8B8C9 /* Color+Ext.swift in Sources */, 6469F8D62A3B408900846831 /* Endpoint+Ext.swift in Sources */, 64B6273B2A375C0F00196D07 /* PaddingLabel.swift in Sources */, 64B627402A375C0F00196D07 /* SceneDelegate.swift in Sources */, 647A51482BE4EE0600B8B8C9 /* CandleStickChart.swift in Sources */, 6469F8D82A3B4AA400846831 /* MetricCell.swift in Sources */, + 647A51492BE4F71700B8B8C9 /* Colors.swift in Sources */, 646D19E22A3C994000C82315 /* DXFTimer.swift in Sources */, 64B6273E2A375C0F00196D07 /* QuoteTableViewController.swift in Sources */, 64B627392A375C0F00196D07 /* AppDelegate.swift in Sources */, @@ -3254,7 +3262,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.2; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -3289,7 +3297,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.2; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -3519,7 +3527,7 @@ INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -3553,7 +3561,7 @@ INFOPLIST_KEY_UIMainStoryboardFile = Main; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift index f19e856ef..33a166dbd 100644 --- a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift +++ b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift @@ -11,7 +11,7 @@ import SwiftUI struct DXFeedCandleChartApp: App { var body: some Scene { WindowGroup { - CandleStickChart(symbol: "AAPL") + CandleStickChart(symbol: "AAPL", endpoint: nil) } } } diff --git a/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/1024-mac.png b/Samples/DXFeedCandleChartMac/Assets.xcassets/AppIcon.appiconset/1024-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..593966c55e9fb4dd15cdab1e2750089ff2a7dc5c GIT binary patch literal 24102 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 - @@ -59,7 +58,7 @@ - +

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∈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 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/DXFeedMarketDepth/Base.lproj/MainMarketDepth.storyboard b/Samples/DXFeedMarketDepth/Base.lproj/MainMarketDepth.storyboard new file mode 100644 index 000000000..92fa1fbca --- /dev/null +++ b/Samples/DXFeedMarketDepth/Base.lproj/MainMarketDepth.storyboard @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/DXFeedMarketDepth/Info.plist b/Samples/DXFeedMarketDepth/Info.plist new file mode 100644 index 000000000..9903fe0b0 --- /dev/null +++ b/Samples/DXFeedMarketDepth/Info.plist @@ -0,0 +1,25 @@ + + + + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + MainMarketDepth + + + + + + diff --git a/Samples/QuoteTableApp/MarketDepthViewController.swift b/Samples/DXFeedMarketDepth/MarketDepthViewController.swift similarity index 98% rename from Samples/QuoteTableApp/MarketDepthViewController.swift rename to Samples/DXFeedMarketDepth/MarketDepthViewController.swift index 1b7129a44..c5e8b0d9d 100644 --- a/Samples/QuoteTableApp/MarketDepthViewController.swift +++ b/Samples/DXFeedMarketDepth/MarketDepthViewController.swift @@ -18,7 +18,7 @@ class MarketDepthViewController: UIViewController { var numberOfRows = 0 private var endpoint: DXEndpoint! private var feed: DXFeed! - var symbol: String! + var symbol = "ETH/USD:GDAX" var model: MarketDepthModel? var orderBook = OrderBook() @@ -83,11 +83,9 @@ extension MarketDepthViewController: MarketDepthListener { func modelChanged(changes: DXFeedFramework.OrderBook) { var maxValue: Double = 0 changes.buyOrders.forEach { order in - print(order.eventSource.name) maxValue = max(maxValue, order.size) } changes.sellOrders.forEach { order in - print(order.eventSource.name) maxValue = max(maxValue, order.size) } diff --git a/Samples/QuoteTableApp/OrderCell.swift b/Samples/DXFeedMarketDepth/OrderCell.swift similarity index 95% rename from Samples/QuoteTableApp/OrderCell.swift rename to Samples/DXFeedMarketDepth/OrderCell.swift index d34cfeece..b91df4293 100644 --- a/Samples/QuoteTableApp/OrderCell.swift +++ b/Samples/DXFeedMarketDepth/OrderCell.swift @@ -70,8 +70,8 @@ class OrderCell: UITableViewCell { sizeSellLabel.text = formatter.string(from: NSNumber(value: size)) sizeSellLabel.textColor = isBuy ? .green : .red - sizeBuyContentView.backgroundColor = isBuy ?OrderCell.greenBarColor : OrderCell.redBarColor - sizeSellContentView.backgroundColor = isBuy ?OrderCell.greenBarColor : OrderCell.redBarColor + sizeBuyContentView.backgroundColor = isBuy ? OrderCell.greenBarColor : OrderCell.redBarColor + sizeSellContentView.backgroundColor = isBuy ? OrderCell.greenBarColor : OrderCell.redBarColor var multiplier = min(size/maxSize, 1) if !multiplier.isFinite || multiplier.isInfinite { diff --git a/Samples/DXFeedMarketDepth/SceneDelegate.swift b/Samples/DXFeedMarketDepth/SceneDelegate.swift new file mode 100644 index 000000000..e3609df79 --- /dev/null +++ b/Samples/DXFeedMarketDepth/SceneDelegate.swift @@ -0,0 +1,32 @@ +// +// +// 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 UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? + + func scene(_ scene: UIScene, + willConnectTo session: UISceneSession, + options connectionOptions: UIScene.ConnectionOptions) { + } + + func sceneDidDisconnect(_ scene: UIScene) { + } + + func sceneDidBecomeActive(_ scene: UIScene) { + } + + func sceneWillResignActive(_ scene: UIScene) { + } + + func sceneWillEnterForeground(_ scene: UIScene) { + } + + func sceneDidEnterBackground(_ scene: UIScene) { + } +} diff --git a/Samples/QuoteTableApp/Base.lproj/Main.storyboard b/Samples/QuoteTableApp/Base.lproj/Main.storyboard index 70a0e5edd..b4ed62579 100644 --- a/Samples/QuoteTableApp/Base.lproj/Main.storyboard +++ b/Samples/QuoteTableApp/Base.lproj/Main.storyboard @@ -193,161 +193,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -555,9 +400,6 @@ - - - diff --git a/Samples/QuoteTableApp/QuoteTableViewController.swift b/Samples/QuoteTableApp/QuoteTableViewController.swift index 78505fe6e..d64f60c59 100644 --- a/Samples/QuoteTableApp/QuoteTableViewController.swift +++ b/Samples/QuoteTableApp/QuoteTableViewController.swift @@ -174,7 +174,7 @@ extension QuoteTableViewController: UITableViewDelegate { alert.addAction(candlesAction) let marketDepthAction = UIAlertAction(title: "Depth Of Market", style: .default) { _ in - let storyboard = UIStoryboard(name: "Main", bundle: nil) + let storyboard = UIStoryboard(name: "MainMarketDepth", bundle: nil) let viewController = storyboard.instantiateViewController(withIdentifier: "MarketDepthViewController") if let marketDepthViewController = viewController as? MarketDepthViewController { marketDepthViewController.symbol = symbol From d8bec963cd5ee189a1cae4c292a89d354b8e3ab6 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Fri, 24 May 2024 17:10:56 +0200 Subject: [PATCH 37/51] fix warnings decrease date to improve stability of test --- DXFeedFrameworkTests/DXMarketDepthTest.swift | 1 + DXFeedFrameworkTests/DXSnapshotProcessorTest.swift | 3 ++- Samples/QuoteTableApp/QuoteTableViewController.swift | 7 ++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/DXFeedFrameworkTests/DXMarketDepthTest.swift b/DXFeedFrameworkTests/DXMarketDepthTest.swift index 0d06351b3..ed696ea79 100644 --- a/DXFeedFrameworkTests/DXMarketDepthTest.swift +++ b/DXFeedFrameworkTests/DXMarketDepthTest.swift @@ -224,6 +224,7 @@ final class DXMarketDepthTest: XCTestCase, MarketDepthListener { size: 2, eventFlags: 0)]) // update in limit expectation1 = expectation(description: "Events received5") + expectation1?.assertForOverFulfill = false wait(for: [expectation1!], timeout: 1.0) try publisher.publish(events: [try createOrder(index: 1, diff --git a/DXFeedFrameworkTests/DXSnapshotProcessorTest.swift b/DXFeedFrameworkTests/DXSnapshotProcessorTest.swift index dd75a6a9b..c7b16a8ee 100644 --- a/DXFeedFrameworkTests/DXSnapshotProcessorTest.swift +++ b/DXFeedFrameworkTests/DXSnapshotProcessorTest.swift @@ -38,7 +38,8 @@ final class DXSnapshotProcessorTest: XCTestCase, SnapshotDelegate { let snapshotProcessor = SnapshotProcessor() snapshotProcessor.add(self) try subscription?.add(listener: snapshotProcessor) - let symbol = TimeSeriesSubscriptionSymbol(symbol: "AAPL{=1d}", date: Date.init(millisecondsSince1970: 0)) + let date = Calendar.current.date(byAdding: .year, value: -1, to: Date())! + let symbol = TimeSeriesSubscriptionSymbol(symbol: "AAPL{=1d}", date: date) try subscription?.addSymbols(symbol) wait(for: [receivedEventExp], timeout: 4.0) } diff --git a/Samples/QuoteTableApp/QuoteTableViewController.swift b/Samples/QuoteTableApp/QuoteTableViewController.swift index d64f60c59..d74202d94 100644 --- a/Samples/QuoteTableApp/QuoteTableViewController.swift +++ b/Samples/QuoteTableApp/QuoteTableViewController.swift @@ -164,10 +164,11 @@ extension QuoteTableViewController: UITableViewDelegate { let alert = UIAlertController(title: symbol, message: "", preferredStyle: .actionSheet) let candlesAction = UIAlertAction(title: "Candle Chart", style: .default) { _ in + let ipfAddress = "https://demo:demo@tools.dxfeed.com/ipf?SYMBOL=" let candleChartViewController = MyUIHostingController(rootView: CandleChart(symbol: symbol, - type: .day, - endpoint: self.endpoint, - ipfAddress: "https://demo:demo@tools.dxfeed.com/ipf?SYMBOL=")) + type: .day, + endpoint: self.endpoint, + ipfAddress: ipfAddress)) candleChartViewController.title = symbol self.navigationController?.pushViewController(candleChartViewController, animated: true) } From 73896fdcd97a327eb6be0f2c5429dd6fc6b2050d Mon Sep 17 00:00:00 2001 From: kosyloa Date: Mon, 27 May 2024 14:06:49 +0200 Subject: [PATCH 38/51] feat: candle chart add notice about max displayed candles add date for hour/minute charts --- .../DXFeedCandleChartApp.swift | 1 + .../DXFeedCandleChartMac/CandleChart.swift | 24 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift index bd0fe49bc..d86ce6a33 100644 --- a/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift +++ b/Samples/DXFeedCandleChart/DXFeedCandleChartApp.swift @@ -12,6 +12,7 @@ struct DXFeedCandleChartApp: App { var body: some Scene { WindowGroup { CandleChart(symbol: "AAPL", + type: .minute, endpoint: nil, ipfAddress: "https://demo:demo@tools.dxfeed.com/ipf?SYMBOL=") } diff --git a/Samples/DXFeedCandleChartMac/CandleChart.swift b/Samples/DXFeedCandleChartMac/CandleChart.swift index 22b012757..bcd57ecca 100644 --- a/Samples/DXFeedCandleChartMac/CandleChart.swift +++ b/Samples/DXFeedCandleChartMac/CandleChart.swift @@ -92,16 +92,18 @@ struct CandleChart: View { GeometryReader { reader in List { Section { - chart.frame(height: max(reader.size.height - 150, 300)) - .onAppear { + VStack(alignment: .leading) { + chart.onAppear { // just workaround for swiftuicharts + scroll to self.list.fakeLoading() DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.selectedPrice = nil self.list.updateDate(type: self.type) } - } + Text("NOTICE: only the last \(CandleChartModel.maxCout) candles are displayed") + .font(Font.system(size: 10)) + }.frame(height: max(reader.size.height - 150, 300)) } .listRowBackground(Color.sectionBackground) Section("Chart parameters") { @@ -156,7 +158,15 @@ struct CandleChart: View { case .year: Text(shortDateFormatter.string(from: date)) case .minute: - Text(hourDateFormatter.string(from: date)) + VStack { + Text(dateFormatter.string(from: date)) + Text(hourDateFormatter.string(from: date)) + } + case .hour: + VStack { + Text(dateFormatter.string(from: date)) + Text(hourDateFormatter.string(from: date)) + } default: Text(dateFormatter.string(from: date)) } @@ -236,7 +246,11 @@ struct CandleChart: View { return AnyView(view .chartScrollableAxes(.horizontal) .chartXVisibleDomain(length: list.visibleDomains()) - .chartScrollPosition(x: $list.xScrollPosition)) + .chartScrollPosition(x: $list.xScrollPosition) + .onChange(of: list.xScrollPosition) { + selectedPrice = nil + } + ) } #endif return view From 7408b8bda17b820fc75f6ca409e789ebef1f5763 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Tue, 28 May 2024 15:43:23 +0200 Subject: [PATCH 39/51] fix run on real device --- DXFeedFramework.xcodeproj/project.pbxproj | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/DXFeedFramework.xcodeproj/project.pbxproj b/DXFeedFramework.xcodeproj/project.pbxproj index 6cbd597d7..5ee79dd49 100644 --- a/DXFeedFramework.xcodeproj/project.pbxproj +++ b/DXFeedFramework.xcodeproj/project.pbxproj @@ -274,6 +274,8 @@ 6486B9792AD04F4000D8D5FA /* OrderBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6486B9782AD04F4000D8D5FA /* OrderBase.swift */; }; 6486B97B2AD0517A00D8D5FA /* OrderAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6486B97A2AD0517A00D8D5FA /* OrderAction.swift */; }; 6486B97D2AD057F200D8D5FA /* OrderSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6486B97C2AD057F200D8D5FA /* OrderSource.swift */; }; + 648BC9502C06169A0065C2F7 /* DXFeedFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 803BAC0D29BFA50700FFAB1C /* DXFeedFramework.framework */; }; + 648BC9512C06169A0065C2F7 /* DXFeedFramework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 803BAC0D29BFA50700FFAB1C /* DXFeedFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 648BD5692AC450D6004A3A95 /* ConnectTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648BD5682AC450D6004A3A95 /* ConnectTool.swift */; }; 648BD56B2AC4576F004A3A95 /* HelpTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648BD56A2AC4576F004A3A95 /* HelpTool.swift */; }; 648BD56D2AC56A04004A3A95 /* SubscriptionUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648BD56C2AC56A04004A3A95 /* SubscriptionUtils.swift */; }; @@ -353,7 +355,6 @@ 64B6273B2A375C0F00196D07 /* PaddingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B6272F2A375C0F00196D07 /* PaddingLabel.swift */; }; 64B6273E2A375C0F00196D07 /* QuoteTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B627322A375C0F00196D07 /* QuoteTableViewController.swift */; }; 64B627402A375C0F00196D07 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64B627342A375C0F00196D07 /* SceneDelegate.swift */; }; - 64B627442A375CB700196D07 /* DXFeedFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 803BAC0D29BFA50700FFAB1C /* DXFeedFramework.framework */; }; 64B627742A3761EC00196D07 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 64B627702A3761EC00196D07 /* LaunchScreen.storyboard */; }; 64B627752A3761EC00196D07 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 64B627722A3761EC00196D07 /* Main.storyboard */; }; 64B627772A37620D00196D07 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 64B627762A37620D00196D07 /* Assets.xcassets */; }; @@ -620,6 +621,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 648BC9522C06169B0065C2F7 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 648BC9512C06169A0065C2F7 /* DXFeedFramework.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 64DB79362A376E1B00229597 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -1089,7 +1101,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 64B627442A375CB700196D07 /* DXFeedFramework.framework in Frameworks */, + 648BC9502C06169A0065C2F7 /* DXFeedFramework.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2190,6 +2202,7 @@ 64B627112A375BBA00196D07 /* Sources */, 64B627122A375BBA00196D07 /* Frameworks */, 64B627132A375BBA00196D07 /* Resources */, + 648BC9522C06169B0065C2F7 /* Embed Frameworks */, ); buildRules = ( ); From ae6942356f1cabcfc724c1bff3baa33643ee5b09 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Thu, 30 May 2024 10:51:19 +0200 Subject: [PATCH 40/51] warning: need fixes --- Samples/DXFeedCandleChartMac/CandleChartModel.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Samples/DXFeedCandleChartMac/CandleChartModel.swift b/Samples/DXFeedCandleChartMac/CandleChartModel.swift index d281f0b69..ac610234a 100644 --- a/Samples/DXFeedCandleChartMac/CandleChartModel.swift +++ b/Samples/DXFeedCandleChartMac/CandleChartModel.swift @@ -191,6 +191,8 @@ extension CandleChartModel: SnapshotDelegate { }) { self.candles.safeReplace(newPrice, at: index) } + //add remove + //add insert } } } From 55c88ac44d26c969fa558c5877f1a365190b6d4c Mon Sep 17 00:00:00 2001 From: kosyloa Date: Thu, 30 May 2024 12:39:43 +0200 Subject: [PATCH 41/51] update dep add index to candlemodel add insert/remove for nonsnapshot update --- .../DXFeedCandleChartMac/CandleChart.swift | 7 +++-- .../CandleChartModel.swift | 26 +++++++++++++------ build.gradle | 2 +- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Samples/DXFeedCandleChartMac/CandleChart.swift b/Samples/DXFeedCandleChartMac/CandleChart.swift index bcd57ecca..8239b66f2 100644 --- a/Samples/DXFeedCandleChartMac/CandleChart.swift +++ b/Samples/DXFeedCandleChartMac/CandleChart.swift @@ -32,8 +32,9 @@ struct CandleModel: Identifiable { let isPoint: Bool let stringtimeStamp: String + let index: Long - init(currency: String, timestamp: Date, open: Decimal, close: Decimal, high: Decimal, low: Decimal) { + init(currency: String, timestamp: Date, open: Decimal, close: Decimal, high: Decimal, low: Decimal, index: Long) { self.currency = currency self.timestamp = timestamp self.open = open @@ -42,6 +43,7 @@ struct CandleModel: Identifiable { self.high = high self.low = low self.stringtimeStamp = "\(timestamp.timeIntervalSince1970)" + self.index = index } init(candle: Candle, currency: String) { @@ -50,7 +52,8 @@ struct CandleModel: Identifiable { open: Decimal(candle.open), close: Decimal(candle.close), high: Decimal(candle.high), - low: Decimal(candle.low)) + low: Decimal(candle.low), + index: candle.index) } var isClosingHigher: Bool { diff --git a/Samples/DXFeedCandleChartMac/CandleChartModel.swift b/Samples/DXFeedCandleChartMac/CandleChartModel.swift index ac610234a..b5de9d804 100644 --- a/Samples/DXFeedCandleChartMac/CandleChartModel.swift +++ b/Samples/DXFeedCandleChartMac/CandleChartModel.swift @@ -183,16 +183,26 @@ extension CandleChartModel: SnapshotDelegate { self.xScrollPosition = temp[pointsOnScreen - 1].stringtimeStamp } else { result.forEach { candle in - self.maxValue = max(self.maxValue, candle.max()) - self.minValue = min(self.minValue, candle.min()) let newPrice = CandleModel(candle: candle, currency: self.currency) - if let index = self.candles.firstIndex(where: { price in - price.timestamp == newPrice.timestamp - }) { - self.candles.safeReplace(newPrice, at: index) + if candle.isRemove() { + // remove + self.candles.removeAll { price in + price.index == newPrice.index + } + } else { + self.maxValue = max(self.maxValue, candle.max()) + self.minValue = min(self.minValue, candle.min()) + + if let index = self.candles.firstIndex(where: { price in + price.timestamp == newPrice.timestamp + }) { + // update + self.candles.safeReplace(newPrice, at: index) + } else { + // insert + self.candles.insert(newPrice, at: 0) + } } - //add remove - //add insert } } } diff --git a/build.gradle b/build.gradle index d200c5941..a4931e02c 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ repositories { } } -def native_version = '1.1.12' +def native_version = '1.1.16' def name = 'graal-native-sdk' dependencies { implementation(group: 'com.dxfeed', name: "${name}", version: "${native_version}", classifier: 'aarch64-osx', ext: 'zip') From 6a3736cc370288e5a246e33c25f5c0c33b9fb389 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Thu, 30 May 2024 16:12:49 +0200 Subject: [PATCH 42/51] save scroll position in case of insertion new candle --- Samples/DXFeedCandleChartMac/CandleChartModel.swift | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Samples/DXFeedCandleChartMac/CandleChartModel.swift b/Samples/DXFeedCandleChartMac/CandleChartModel.swift index b5de9d804..f80ad9a71 100644 --- a/Samples/DXFeedCandleChartMac/CandleChartModel.swift +++ b/Samples/DXFeedCandleChartMac/CandleChartModel.swift @@ -201,7 +201,20 @@ extension CandleChartModel: SnapshotDelegate { } else { // insert self.candles.insert(newPrice, at: 0) + let temp = self.candles + self.xAxisLabels = CandleChartModel.calculateXaxisValues(with: self.type, values: temp) + let currentScroll = self.xScrollPosition + + let xValues = Array(temp.enumerated().map({ index, stock in + if stock.stringtimeStamp == currentScroll { + self.xScrollPosition = temp[index - 1].stringtimeStamp + } + return stock.stringtimeStamp + }).reversed()) + self.xValues = xValues } + + } } } From 405c0302ef469109c9034a24f0cfa50e5de41c05 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Mon, 3 Jun 2024 16:25:38 +0200 Subject: [PATCH 43/51] remove blanks --- Samples/DXFeedCandleChartMac/CandleChartModel.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/Samples/DXFeedCandleChartMac/CandleChartModel.swift b/Samples/DXFeedCandleChartMac/CandleChartModel.swift index f80ad9a71..e24aaa1f0 100644 --- a/Samples/DXFeedCandleChartMac/CandleChartModel.swift +++ b/Samples/DXFeedCandleChartMac/CandleChartModel.swift @@ -213,8 +213,6 @@ extension CandleChartModel: SnapshotDelegate { }).reversed()) self.xValues = xValues } - - } } } From cf0def63de306334465a82aafe6ee01658206d8e Mon Sep 17 00:00:00 2001 From: kosyloa Date: Thu, 6 Jun 2024 10:14:26 +0200 Subject: [PATCH 44/51] update build number --- DXFeedFramework.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DXFeedFramework.xcodeproj/project.pbxproj b/DXFeedFramework.xcodeproj/project.pbxproj index 5ee79dd49..dac27a8b0 100644 --- a/DXFeedFramework.xcodeproj/project.pbxproj +++ b/DXFeedFramework.xcodeproj/project.pbxproj @@ -3758,7 +3758,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.2; + MARKETING_VERSION = 1.1.3; PRODUCT_BUNDLE_IDENTIFIER = com.dxfeed.quotesapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -3792,7 +3792,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.2; + MARKETING_VERSION = 1.1.3; PRODUCT_BUNDLE_IDENTIFIER = com.dxfeed.quotesapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; From 91dd95a963015f995491a1d313619ce6738433a8 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Thu, 6 Jun 2024 16:29:10 +0200 Subject: [PATCH 45/51] change text of candle notice --- Samples/DXFeedCandleChartMac/CandleChart.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Samples/DXFeedCandleChartMac/CandleChart.swift b/Samples/DXFeedCandleChartMac/CandleChart.swift index 8239b66f2..8b3802d4e 100644 --- a/Samples/DXFeedCandleChartMac/CandleChart.swift +++ b/Samples/DXFeedCandleChartMac/CandleChart.swift @@ -104,7 +104,7 @@ struct CandleChart: View { self.list.updateDate(type: self.type) } } - Text("NOTICE: only the last \(CandleChartModel.maxCout) candles are displayed") + Text("NOTICE: A maximum of \(CandleChartModel.maxCout) candles is displayed.") .font(Font.system(size: 10)) }.frame(height: max(reader.size.height - 150, 300)) } From 5b4c87a54a896fcf51e523855e49e66dd748282d Mon Sep 17 00:00:00 2001 From: kosyloa Date: Fri, 7 Jun 2024 08:42:23 +0200 Subject: [PATCH 46/51] test commit --- DXFeedFrameworkTests/IsolateTest.swift | 9 --------- 1 file changed, 9 deletions(-) diff --git a/DXFeedFrameworkTests/IsolateTest.swift b/DXFeedFrameworkTests/IsolateTest.swift index 454fe56ce..259e72856 100644 --- a/DXFeedFrameworkTests/IsolateTest.swift +++ b/DXFeedFrameworkTests/IsolateTest.swift @@ -8,15 +8,6 @@ import XCTest @testable import DXFeedFramework final class IsolateTest: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - func testCleanup() throws { // just use it to avoid warnings try XCTSkipIf(true, "Just for manual running") From 1734719bd021eea4d100a2fbb877d96dc852ba10 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Mon, 10 Jun 2024 15:17:55 +0200 Subject: [PATCH 47/51] fix: leaks in schedule --- DXFeedFramework/Native/Schedule/NativeDay.swift | 2 +- DXFeedFramework/Native/Schedule/NativeSchedule.swift | 6 +++++- DXFeedFramework/Native/Schedule/NativeSession.swift | 2 +- DXFeedFramework/Native/Utils/NativeTimeUtil.swift | 4 ++-- build.gradle | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/DXFeedFramework/Native/Schedule/NativeDay.swift b/DXFeedFramework/Native/Schedule/NativeDay.swift index 2aaa35fd8..71c0232b0 100644 --- a/DXFeedFramework/Native/Schedule/NativeDay.swift +++ b/DXFeedFramework/Native/Schedule/NativeDay.swift @@ -10,6 +10,6 @@ import Foundation class NativeDay: NativeBox { deinit { let thread = currentThread() - _ = try? ErrorCheck.nativeCall(thread, dxfg_JavaObjectHandler_release(thread, &(native.pointee.handler))) + _ = try? ErrorCheck.nativeCall(thread, dxfg_Day_release(thread, native)) } } diff --git a/DXFeedFramework/Native/Schedule/NativeSchedule.swift b/DXFeedFramework/Native/Schedule/NativeSchedule.swift index 82f06009d..2f75f9e7d 100644 --- a/DXFeedFramework/Native/Schedule/NativeSchedule.swift +++ b/DXFeedFramework/Native/Schedule/NativeSchedule.swift @@ -128,6 +128,10 @@ class NativeSchedule { scheduleDay.startTime = try ErrorCheck.nativeCall(thread, dxfg_Day_getStartTime(thread, day)) scheduleDay.endTime = try ErrorCheck.nativeCall(thread, dxfg_Day_getEndTime(thread, day)) let sessions = try ErrorCheck.nativeCall(thread, dxfg_Day_getSessions(thread, day)).value() + defer { + _ = try? ErrorCheck.nativeCall(thread, dxfg_SessionList_release(thread, sessions)) + } + let count = sessions.pointee.size for index in 0.. { deinit { let thread = currentThread() - _ = try? ErrorCheck.nativeCall(thread, dxfg_JavaObjectHandler_release(thread, &(native.pointee.handler))) + _ = try? ErrorCheck.nativeCall(thread, dxfg_Session_release(thread, native)) } } diff --git a/DXFeedFramework/Native/Utils/NativeTimeUtil.swift b/DXFeedFramework/Native/Utils/NativeTimeUtil.swift index be279063a..651b2826c 100644 --- a/DXFeedFramework/Native/Utils/NativeTimeUtil.swift +++ b/DXFeedFramework/Native/Utils/NativeTimeUtil.swift @@ -23,8 +23,8 @@ class NativeTimeUtil { let result = try ErrorCheck.nativeCall(thread, dxfg_TimeFormat_format(thread, timeFormat.native, - value)) - return String(pointee: result) + value)) + return try String(nullable: result).value() } } diff --git a/build.gradle b/build.gradle index a4931e02c..db9de601d 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ repositories { } } -def native_version = '1.1.16' +def native_version = '1.1.18' def name = 'graal-native-sdk' dependencies { implementation(group: 'com.dxfeed', name: "${name}", version: "${native_version}", classifier: 'aarch64-osx', ext: 'zip') From 31eef52aa0930f225e2c80f1885bdf7ab4e08086 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Tue, 11 Jun 2024 08:46:31 +0200 Subject: [PATCH 48/51] decrease size of candles(to decrease time of loading) --- Samples/DXFeedCandleChartMac/CandlePickerType+Ext.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Samples/DXFeedCandleChartMac/CandlePickerType+Ext.swift b/Samples/DXFeedCandleChartMac/CandlePickerType+Ext.swift index 5204782d0..ae282f655 100644 --- a/Samples/DXFeedCandleChartMac/CandlePickerType+Ext.swift +++ b/Samples/DXFeedCandleChartMac/CandlePickerType+Ext.swift @@ -29,13 +29,13 @@ extension CandlePickerType { func calcualteStartDate() -> Date { switch self { case .minute: - return Calendar.current.date(byAdding: .day, value: -30, to: Date())! + return Calendar.current.date(byAdding: .day, value: -7, to: Date())! case .hour: - return Calendar.current.date(byAdding: .day, value: -30, to: Date())! + return Calendar.current.date(byAdding: .day, value: -7, to: Date())! case .day: return Calendar.current.date(byAdding: .year, value: -1, to: Date())! case .week: - return Calendar.current.date(byAdding: .year, value: -5, to: Date())! + return Calendar.current.date(byAdding: .year, value: -4, to: Date())! case .month: return Calendar.current.date(byAdding: .year, value: -10, to: Date())! case .year: From b27a8a36cf5859ecc533faa0656e0958962eed1c Mon Sep 17 00:00:00 2001 From: kosyloa Date: Wed, 12 Jun 2024 14:00:56 +0200 Subject: [PATCH 49/51] update version of build fix for old version xcode --- DXFeedFramework.xcodeproj/project.pbxproj | 4 ++-- DXFeedFramework/Extra/MarketDepthModel.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DXFeedFramework.xcodeproj/project.pbxproj b/DXFeedFramework.xcodeproj/project.pbxproj index dac27a8b0..94bbdd57a 100644 --- a/DXFeedFramework.xcodeproj/project.pbxproj +++ b/DXFeedFramework.xcodeproj/project.pbxproj @@ -3742,7 +3742,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 485XM3FRHB; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Samples/QuoteTableApp/Info.plist; @@ -3776,7 +3776,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 485XM3FRHB; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = Samples/QuoteTableApp/Info.plist; diff --git a/DXFeedFramework/Extra/MarketDepthModel.swift b/DXFeedFramework/Extra/MarketDepthModel.swift index aa0f05511..6e665e603 100644 --- a/DXFeedFramework/Extra/MarketDepthModel.swift +++ b/DXFeedFramework/Extra/MarketDepthModel.swift @@ -138,9 +138,9 @@ extension MarketDepthModel: TxModelListener { func getOrderSetForOrder(_ order: Order) -> OrderSet { if order.orderSide == .buy { - buyOrders + return buyOrders } else { - sellOrders + return sellOrders } } From 1640326e2e2e54a25c2a586cb76418ac79ebab3f Mon Sep 17 00:00:00 2001 From: kosyloa Date: Tue, 18 Jun 2024 10:02:52 +0200 Subject: [PATCH 50/51] fix warnings --- .../Native/Utils/NativeTimeUtil.swift | 2 +- .../DXFeedCandleChartMac/CandleChart.swift | 20 +++- .../CandleChartModel.swift | 112 ++++++++++-------- 3 files changed, 78 insertions(+), 56 deletions(-) diff --git a/DXFeedFramework/Native/Utils/NativeTimeUtil.swift b/DXFeedFramework/Native/Utils/NativeTimeUtil.swift index 651b2826c..2907647fa 100644 --- a/DXFeedFramework/Native/Utils/NativeTimeUtil.swift +++ b/DXFeedFramework/Native/Utils/NativeTimeUtil.swift @@ -23,7 +23,7 @@ class NativeTimeUtil { let result = try ErrorCheck.nativeCall(thread, dxfg_TimeFormat_format(thread, timeFormat.native, - value)) + value)) return try String(nullable: result).value() } diff --git a/Samples/DXFeedCandleChartMac/CandleChart.swift b/Samples/DXFeedCandleChartMac/CandleChart.swift index 8b3802d4e..4bba48176 100644 --- a/Samples/DXFeedCandleChartMac/CandleChart.swift +++ b/Samples/DXFeedCandleChartMac/CandleChart.swift @@ -212,8 +212,9 @@ struct CandleChart: View { let dateInterval = Calendar.current.dateInterval(of: .minute, for: selectedPrice.timestamp)! let startPositionX1 = proxy.position(forX: "\(dateInterval.start.timeIntervalSince1970)") ?? 0 - let lineX = startPositionX1 + geo[proxy.plotAreaFrame].origin.x - let lineHeight = geo[proxy.plotAreaFrame].maxY + let rect = plotFrameRect(proxy: proxy, in: geo) + let lineX = startPositionX1 + rect.origin.x + let lineHeight = rect.maxY let boxWidth: CGFloat = min(geo.size.width, 400) let boxOffset = max(0, min(geo.size.width - boxWidth, lineX - boxWidth / 2)) @@ -260,8 +261,21 @@ struct CandleChart: View { } } + private func plotFrameRect(proxy: ChartProxy, in geo: GeometryProxy) -> CGRect { + var rect = CGRect.zero + if #available(iOS 17, *) { + if let plotFrame = proxy.plotFrame { + rect = geo[plotFrame] + } + } else { + rect = geo[proxy.plotAreaFrame] + } + return rect + } + private func findElement(location: CGPoint, proxy: ChartProxy, geometry: GeometryProxy) -> CandleModel? { - let relativeXPosition = location.x - geometry[proxy.plotAreaFrame].origin.x + let rect = plotFrameRect(proxy: proxy, in: geometry) + let relativeXPosition = location.x - rect.origin.x if let date = proxy.value(atX: relativeXPosition) as String?, let timeInterval = TimeInterval(date) { // Find the closest date element. let date = Date(timeIntervalSince1970: timeInterval) diff --git a/Samples/DXFeedCandleChartMac/CandleChartModel.swift b/Samples/DXFeedCandleChartMac/CandleChartModel.swift index e24aaa1f0..1276930ca 100644 --- a/Samples/DXFeedCandleChartMac/CandleChartModel.swift +++ b/Samples/DXFeedCandleChartMac/CandleChartModel.swift @@ -158,62 +158,70 @@ extension CandleChartModel: SnapshotDelegate { let result = events.map { marketEvent in marketEvent.candle } - DispatchQueue.main.async { + DispatchQueue.main.async { [self] in if isSnapshot { - self.loadingInProgress = false - var maxValue = Double.zero - var minValue = Double.greatestFiniteMagnitude - let firstNElements = result.prefix(CandleChartModel.maxCout) - let temp = firstNElements.map { candle in - maxValue = max(maxValue, candle.max()) - minValue = min(minValue, candle.min()) - let price = CandleModel(candle: candle, currency: self.currency) - return price + receivedSnapshot(events: result) + } else { + receivedUpdate(events: result) + } + } + } + + private func receivedSnapshot(events: [Candle]) { + self.loadingInProgress = false + var maxValue = Double.zero + var minValue = Double.greatestFiniteMagnitude + let firstNElements = events.prefix(CandleChartModel.maxCout) + let temp = firstNElements.map { candle in + maxValue = max(maxValue, candle.max()) + minValue = min(minValue, candle.min()) + let price = CandleModel(candle: candle, currency: self.currency) + return price + } + self.maxValue = maxValue + self.minValue = minValue + self.xAxisLabels = CandleChartModel.calculateXaxisValues(with: self.type, values: temp) + self.candles = temp + let xValues = Array(temp.map({ stock in + stock.stringtimeStamp + }).reversed()) + self.xValues = xValues + // scroll to last page + let pointsOnScreen = CandleChartModel.visiblePointsOnScreen(type: self.type, valuesCount: temp.count) + self.xScrollPosition = temp[pointsOnScreen - 1].stringtimeStamp + } + + private func receivedUpdate(events: [Candle]) { + events.forEach { candle in + let newPrice = CandleModel(candle: candle, currency: self.currency) + if candle.isRemove() { + // remove + self.candles.removeAll { price in + price.index == newPrice.index } - self.maxValue = maxValue - self.minValue = minValue - self.xAxisLabels = CandleChartModel.calculateXaxisValues(with: self.type, values: temp) - self.candles = temp - let xValues = Array(temp.map({ stock in - stock.stringtimeStamp - }).reversed()) - self.xValues = xValues - // scroll to last page - let pointsOnScreen = CandleChartModel.visiblePointsOnScreen(type: self.type, valuesCount: temp.count) - self.xScrollPosition = temp[pointsOnScreen - 1].stringtimeStamp } else { - result.forEach { candle in - let newPrice = CandleModel(candle: candle, currency: self.currency) - if candle.isRemove() { - // remove - self.candles.removeAll { price in - price.index == newPrice.index - } - } else { - self.maxValue = max(self.maxValue, candle.max()) - self.minValue = min(self.minValue, candle.min()) - - if let index = self.candles.firstIndex(where: { price in - price.timestamp == newPrice.timestamp - }) { - // update - self.candles.safeReplace(newPrice, at: index) - } else { - // insert - self.candles.insert(newPrice, at: 0) - let temp = self.candles - self.xAxisLabels = CandleChartModel.calculateXaxisValues(with: self.type, values: temp) - let currentScroll = self.xScrollPosition - - let xValues = Array(temp.enumerated().map({ index, stock in - if stock.stringtimeStamp == currentScroll { - self.xScrollPosition = temp[index - 1].stringtimeStamp - } - return stock.stringtimeStamp - }).reversed()) - self.xValues = xValues + self.maxValue = max(self.maxValue, candle.max()) + self.minValue = min(self.minValue, candle.min()) + + if let index = self.candles.firstIndex(where: { price in + price.timestamp == newPrice.timestamp + }) { + // update + self.candles.safeReplace(newPrice, at: index) + } else { + // insert + self.candles.insert(newPrice, at: 0) + let temp = self.candles + self.xAxisLabels = CandleChartModel.calculateXaxisValues(with: self.type, values: temp) + let currentScroll = self.xScrollPosition + + let xValues = Array(temp.enumerated().map({ index, stock in + if stock.stringtimeStamp == currentScroll { + self.xScrollPosition = temp[index - 1].stringtimeStamp } - } + return stock.stringtimeStamp + }).reversed()) + self.xValues = xValues } } } From 3cd5e54da79dc5a8da728dc558dcf752e5c50f13 Mon Sep 17 00:00:00 2001 From: kosyloa Date: Tue, 18 Jun 2024 10:40:04 +0200 Subject: [PATCH 51/51] fix warnings --- DXFeedFrameworkTests/DXMarketDepthTest.swift | 2 +- Samples/DXFeedCandleChartMac/CandleChart.swift | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/DXFeedFrameworkTests/DXMarketDepthTest.swift b/DXFeedFrameworkTests/DXMarketDepthTest.swift index ed696ea79..de6bc094f 100644 --- a/DXFeedFrameworkTests/DXMarketDepthTest.swift +++ b/DXFeedFrameworkTests/DXMarketDepthTest.swift @@ -273,7 +273,7 @@ final class DXMarketDepthTest: XCTestCase, MarketDepthListener { count: bookSize)) var expectedBuy = 0 var expectedSell = 0 - for position in 0..<10000 { + for _ in 0..<10000 { let index = Int.random(in: 0..