Skip to content

Commit f4e70e5

Browse files
author
Fernando Fernandes
committed
Add capability to list untriggered stop orders
1 parent 24fbc6f commit f4e70e5

9 files changed

+166
-13
lines changed

Sources/SwiftTrader/Model/Error/SwiftTraderError.swift

+7-4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public enum SwiftTraderError: Error {
4040
/// And error ocurred while executing the function `SwiftTrader.kucoinFuturesCancelStopOrders(symbol:)`.
4141
case kucoinFuturesCancelStopOrders(error: Error)
4242

43-
// MARK: Order
43+
// MARK: Orders
4444

4545
/// Something went wrong while trying to set the target price.
4646
case kucoinCouldNotCalculateTheTargetPrice(input: SwiftTraderStopLimitOrderInput)
@@ -55,13 +55,16 @@ public enum SwiftTraderError: Error {
5555
case kucoinInvalidTargetPriceHigher(entryPrice: String, targetPrice: String)
5656

5757
/// And error ocurred while executing the function `SwiftTrader.kucoinFuturesOrderList(orderStatus:)`.
58-
case kucoinOrderList(error: Error)
58+
case kucoinFuturesOrderList(error: Error)
59+
60+
/// And error ocurred while executing the function `SwiftTrader.kucoinFuturesStopOrderList(symbol:)`.
61+
case kucoinFuturesStopOrderList(error: Error)
5962

6063
/// And error ocurred while executing the function `SwiftTrader.kucoinFuturesPlaceStopLimitOrder()`.
61-
case kucoinPlaceStopLimitOrder(error: Error)
64+
case kucoinFuturesPlaceStopLimitOrder(error: Error)
6265

6366
// MARK: Positions
6467

6568
/// And error ocurred while executing the function `SwiftTrader.kucoinFuturesPositionList()`.
66-
case kucoinPositionList(error: Error)
69+
case kucoinFuturesPositionList(error: Error)
6770
}

Sources/SwiftTrader/Model/Kucoin/Order/KucoinFuturesOrderList.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public struct KucoinFuturesOrder: Codable {
134134
self.stop = nil
135135
}
136136

137-
self.stopTriggered = try container.decode(Bool.self, forKey: .stopTriggered)
137+
self.stopTriggered = try container.decodeIfPresent(Bool.self, forKey: .stopTriggered) ?? false
138138
self.stopPrice = try container.decodeIfPresent(String.self, forKey: .stopPrice)
139139
self.leverage = try container.decode(String.self, forKey: .leverage)
140140
self.reduceOnly = try container.decode(Bool.self, forKey: .reduceOnly)

Sources/SwiftTrader/Model/SwiftTraderOperation.swift

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public enum SwiftTraderOperation {
1212
case kucoinFuturesAccountOverview
1313
case kucoinFuturesCancelStopOrders
1414
case kucoinFuturesOrderList
15+
case kucoinFuturesStopOrderList
1516
case kucoinFuturesPlaceStopLimitOrder
1617
case kucoinFuturesPositionList
1718
}

Sources/SwiftTrader/Network/Kucoin/KucoinAPI.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ public struct KucoinAPI {
4747
}
4848

4949
public struct QueryParam {
50-
static let currency = "currency"
51-
static let orderStatus = "status"
52-
static let symbol = "symbol"
50+
public static let currency = "currency"
51+
public static let orderStatus = "status"
52+
public static let symbol = "symbol"
5353
}
5454
}

Sources/SwiftTrader/Network/Kucoin/Orders/CancelStopOrders/KucoinFuturesCancelOrdersRequest.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import FoundationNetworking
1111
#endif
1212
import Logging
1313

14-
/// A **request** for cancelling all untriggered stop orders of a given symbol (contract).
14+
/// A **request** for cancelling all untriggered stop orders of a given (contract) symbol.
1515
///
1616
/// https://docs.kucoin.com/futures/#stop-order-mass-cancelation
1717
public struct KucoinFuturesCancelOrdersRequest: NetworkRequest {

Sources/SwiftTrader/Network/Kucoin/Orders/CancelStopOrders/KucoinFuturesCancelOrdersResource.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import Foundation
99

10-
/// The **resource** for requesting the cancellation of all untriggered stop orders of a given symbol (contract).
10+
/// The **resource** for requesting the cancellation of all untriggered stop orders of a given (contract) symbol.
1111
///
1212
/// https://docs.kucoin.com/futures/#stop-order-mass-cancelation
1313
public struct KucoinFuturesCancelOrdersResource: NetworkResource {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
//
2+
// KucoinFuturesListStopOrdersRequest.swift
3+
//
4+
//
5+
// Created by Fernando Fernandes on 02.03.22.
6+
//
7+
8+
import Foundation
9+
#if canImport(FoundationNetworking)
10+
import FoundationNetworking
11+
#endif
12+
import Logging
13+
14+
/// A **request** for listing all untriggered stop orders of a given (contract) symbol.
15+
///
16+
/// https://docs.kucoin.com/futures/#get-untriggered-stop-order-list
17+
public struct KucoinFuturesListStopOrdersRequest: NetworkRequest {
18+
19+
// MARK: - Properties
20+
21+
public typealias DecodableModel = KucoinFuturesOrderList
22+
23+
public var logger: Logger {
24+
NetworkRequestLogger().default
25+
}
26+
27+
public var session: URLSession
28+
29+
public var request: URLRequest {
30+
get throws {
31+
let futuresListOrdersResource = KucoinFuturesListStopOrdersResource(symbol: symbol)
32+
var urlRequest = URLRequest(url: try futuresListOrdersResource.url)
33+
urlRequest.httpMethod = HTTPMethod.GET.rawValue
34+
try KucoinAPI.setRequestHeaderFields(request: &urlRequest, kucoinAuth: kucoinAuth)
35+
return urlRequest
36+
}
37+
}
38+
39+
public var settings: NetworkRequestSettings
40+
41+
// MARK: Private
42+
43+
private let symbol: String
44+
45+
private let kucoinAuth: KucoinAuth
46+
47+
// MARK: - Lifecycle
48+
49+
/// Creates a new `KucoinFuturesListStopOrdersRequest` instance.
50+
///
51+
/// - Parameters:
52+
/// - symbol: `String`, represents the specific contract for which all the untriggered stop orders will be listed.
53+
/// E.g.: "XBTUSDM".
54+
/// - kucoinAuth: Kucoin authentication data.
55+
/// - session: `URLSession`, default is `.shared`.
56+
/// - settings: `NetworkRequestSettings`.
57+
public init(symbol: String,
58+
kucoinAuth: KucoinAuth,
59+
session: URLSession = .shared,
60+
settings: NetworkRequestSettings) {
61+
self.symbol = symbol
62+
self.kucoinAuth = kucoinAuth
63+
self.session = session
64+
self.settings = settings
65+
}
66+
}
67+
68+
// MARK: - Network Request Protocol
69+
70+
public extension KucoinFuturesListStopOrdersRequest {
71+
72+
func decode(_ data: Data) throws -> DecodableModel {
73+
try JSONDecoder().decode(KucoinFuturesOrderList.self, from: data)
74+
}
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// KucoinFuturesListStopOrdersResource.swift
3+
//
4+
//
5+
// Created by Fernando Fernandes on 02.03.22.
6+
//
7+
8+
import Foundation
9+
10+
/// The **resource** for requesting the list of all untriggered stop orders of a given (contract) symbol.
11+
///
12+
/// https://docs.kucoin.com/futures/#get-untriggered-stop-order-list
13+
public struct KucoinFuturesListStopOrdersResource: NetworkResource {
14+
15+
// MARK: - Properties
16+
17+
public var url: URL {
18+
get throws {
19+
let baseURLString = KucoinAPI.Futures.baseURL()
20+
guard var urlComponents = URLComponents(string: baseURLString) else {
21+
throw NetworkRequestError.invalidURLString(urlString: baseURLString)
22+
}
23+
urlComponents.path = KucoinAPI.Futures.Path.stopOrders
24+
let queryItems = [
25+
URLQueryItem(name: KucoinAPI.QueryParam.symbol, value: symbol)
26+
]
27+
urlComponents.queryItems = queryItems
28+
guard let url = urlComponents.url else {
29+
throw NetworkRequestError.invalidURLString(urlString: baseURLString)
30+
}
31+
return url
32+
}
33+
}
34+
35+
// MARK: Private
36+
37+
private let symbol: String
38+
39+
// MARK: - Lifecycle
40+
41+
/// Creates a new `KucoinFuturesListStopOrdersResource` instance.
42+
///
43+
/// - Parameter symbol: `String`, represents the specific contract for which all the untriggered stop orders will be listed.
44+
/// E.g.: "XBTUSDM".
45+
init(symbol: String) {
46+
self.symbol = symbol
47+
}
48+
}

Sources/SwiftTrader/SwiftTrader.swift

+29-3
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,30 @@ public extension SwiftTrader {
6161

6262
// MARK: List Orders
6363

64+
/// Retrieves the list of un-triggered stop orders.
65+
///
66+
/// https://docs.kucoin.com/futures/#get-untriggered-stop-order-list
67+
///
68+
/// - Parameter orderStatus: `KucoinFuturesOrderStatus`, default is `.active`.
69+
/// - Returns: An instance of `KucoinFuturesOrderList` or `SwiftTraderError`.
70+
func kucoinFuturesStopOrderList(symbol: String) async throws -> Result<KucoinFuturesOrderList, SwiftTraderError> {
71+
let request = KucoinFuturesListStopOrdersRequest(
72+
symbol: symbol,
73+
kucoinAuth: kucoinAuth,
74+
settings: settings.networkRequestSettings
75+
)
76+
switch await request.execute() {
77+
case .success(let model):
78+
guard let stopOrders = model as? KucoinFuturesOrderList else {
79+
return .failure(.unexpectedResponse(modelString: "\(model)"))
80+
}
81+
return .success(stopOrders)
82+
case .failure(let error):
83+
let swiftTraderError = handle(networkRequestError: error, operation: .kucoinFuturesStopOrderList)
84+
return .failure(swiftTraderError)
85+
}
86+
}
87+
6488
/// Retrieves the list of active Futures orders.
6589
///
6690
/// Notice: this does **not** include the list of stop orders
@@ -198,12 +222,14 @@ private extension SwiftTrader {
198222
return .kucoinFuturesAccountOverview(error: networkRequestError)
199223
case .kucoinFuturesCancelStopOrders:
200224
return .kucoinFuturesCancelStopOrders(error: networkRequestError)
225+
case .kucoinFuturesStopOrderList:
226+
return .kucoinFuturesStopOrderList(error: networkRequestError)
201227
case .kucoinFuturesOrderList:
202-
return .kucoinOrderList(error: networkRequestError)
228+
return .kucoinFuturesOrderList(error: networkRequestError)
203229
case .kucoinFuturesPlaceStopLimitOrder:
204-
return .kucoinPlaceStopLimitOrder(error: networkRequestError)
230+
return .kucoinFuturesPlaceStopLimitOrder(error: networkRequestError)
205231
case .kucoinFuturesPositionList:
206-
return .kucoinPositionList(error: networkRequestError)
232+
return .kucoinFuturesPositionList(error: networkRequestError)
207233
}
208234
}
209235
}

0 commit comments

Comments
 (0)