Add oversea APIs (4 kind)

This commit is contained in:
2024-10-29 02:27:03 +09:00
parent 17cc863672
commit 6855110bef
8 changed files with 1046 additions and 429 deletions

View File

@@ -311,7 +311,7 @@ extension KissAccount {
///
///
public func orderStock(contract: Contract) async throws -> OrderResult {
public func orderStock(contract: Contract) async throws -> Domestic.OrderResult {
return try await withUnsafeThrowingContinuation { continuation in
guard let accessToken = accessToken else {
@@ -332,7 +332,7 @@ extension KissAccount {
}
public func cancelOrder(cancel: ContractCancel) async throws -> OrderRevisionResult {
public func cancelOrder(cancel: ContractCancel) async throws -> Domestic.OrderRevisionResult {
return try await withUnsafeThrowingContinuation { continuation in
guard let accessToken = accessToken else {
@@ -368,7 +368,7 @@ extension KissAccount {
///
///
public func getStockBalance() async throws -> BalanceResult {
public func getStockBalance() async throws -> Domestic.BalanceResult {
return try await withUnsafeThrowingContinuation { continuation in
guard let accessToken = accessToken else {
@@ -391,7 +391,7 @@ extension KissAccount {
///
///
public func canOrderStock(productNo: String, division: OrderDivision, price: Int) async throws -> PossibleOrderResult {
public func canOrderStock(productNo: String, division: OrderDivision, price: Int) async throws -> Domestic.PossibleOrderResult {
return try await withUnsafeThrowingContinuation { continuation in
guard let accessToken = accessToken else {

View File

@@ -14,7 +14,9 @@ public enum CustomerType: String, Codable {
}
public struct OrderResult: Codable {
extension Domestic {
public struct OrderResult: Codable {
public let resultCode: String
public let messageCode: String
public let message: String
@@ -38,10 +40,10 @@ public struct OrderResult: Codable {
case orderTime = "ORD_TMD"
}
}
}
}
public struct OrderRevisionResult: Codable {
public struct OrderRevisionResult: Codable {
public let resultCode: String
public let messageCode: String
public let message: String
@@ -65,17 +67,17 @@ public struct OrderRevisionResult: Codable {
case orderTime = "ORD_TMD"
}
}
}
}
public struct BalanceResult: Codable {
public struct BalanceResult: Codable {
public let resultCode: String
public let messageCode: String
public let message: String
public let straightInqueryCondition: String?
public let straightInqueryKey: String?
public let output1: [OutputStock]?
public let output2: [OutputAmount]?
public let output1: [OutputStock]
public let output2: [OutputAmount]
private enum CodingKeys: String, CodingKey {
case resultCode = "rt_cd"
@@ -376,10 +378,10 @@ public struct BalanceResult: Codable {
[:]
}
}
}
}
public struct PossibleOrderResult: Codable {
public struct PossibleOrderResult: Codable {
public let resultCode: String
public let messageCode: String
public let message: String
@@ -444,4 +446,5 @@ public struct PossibleOrderResult: Codable {
case orderPossibleForeignCurrencyAmountWon = "ord_psbl_frcr_amt_wcrc"
}
}
}
}

View File

@@ -9,7 +9,6 @@ import Foundation
public struct Overseas {
}
@@ -244,4 +243,326 @@ extension Overseas {
self.isNext = isNext
}
}
/// [v1_-002]
///
public struct StockPreorderRequest: OrderRequest {
public typealias KResult = PreorderResult
public var url: String {
"/uapi/overseas-stock/v1/trading/order-resv"
}
public var method: Method { .post }
public var header: [String: String?] {
[
"authorization": "Bearer \(accessToken)",
"appkey": credential.appKey,
"appsecret": credential.appSecret,
"tr_id": trId,
"tr_cont": isNext ? "N": " ",
"custtype": CustomerType.personal.rawValue,
]
}
public var body: [String: Any] {
var predefined: [String: Any] = [
"CANNO": accountNo8,
"ACNT_PRDT_CD": accountNo2,
"PDNO": productNo,
"OVRS_EXCG_CD": overseasExchangeCode,
"FT_ORD_QTY": "",
"FT_ORD_UNPR3": "",
"ORD_SVR_DVSN_CD": "0",
]
if trId == "TTTS3013U" {
predefined["SLL_BUY_DVSN_CD"] = (orderType == .sell ? "01": "02")
predefined["RVSE_CNCL_DVSN_CD"] = (orderCancel == nil ? "00": "02")
predefined["PRDT_TYPE_CD"] = productTypeCode
predefined["RSVN_ORD_RCIT_DT"] = orderDate
predefined["OVRS_RSVN_ODNO"] = reservationOrderNo
}
if trId == "TTTT3016U" {
predefined["ORD_DVSN"] = (orderDivision == .limits ? "00": "31")
}
return predefined
}
public var result: KResult? = nil
public let credential: Credential
private var trId: String {
if credential.isMock {
switch overseasExchangeCode {
case .nasdaq, .newyork, .amex: //
switch orderType {
case .buy: return "VTTT3014U"
case .sell: return "VTTT3016U"
}
case .tokyo: //
fallthrough
case .shanghai, .shenzhen: //
fallthrough
case .hongkong: //
fallthrough
case .hanoi, .hochiminh: //
return "VTTS3013U"
}
}
else {
switch overseasExchangeCode {
case .nasdaq, .newyork, .amex: //
switch orderType {
case .buy: return "TTTT3014U"
case .sell: return "TTTT3016U"
}
case .tokyo: //
fallthrough
case .shanghai, .shenzhen: //
fallthrough
case .hongkong: //
fallthrough
case .hanoi, .hochiminh: //
return "TTTS3013U"
}
}
}
private var productTypeCode: String {
switch overseasExchangeCode {
case .hongkong:
switch hongkongProductType! {
case .`default`: return "501"
case .cny: return "543"
case .usd: return "558"
}
case .shanghai: return "551"
case .shenzhen: return "552"
case .tokyo: return "515"
case .hanoi: return "507"
case .hochiminh: return "508"
default:
assertionFailure()
return ""
}
}
public let accessToken: String
let overseasExchangeCode: OverseasExchangeType
let productNo: String
let orderType: OrderType
let orderCancel: Bool?
let orderDate: String?
let orderDivision: OrderDivision?
let hongkongProductType: HongkongProductType?
let reservationOrderNo: String?
let isNext: Bool
init(credential: Credential, accessToken: String, overseasExchangeCode: OverseasExchangeType, productNo: String, orderType: OrderType, orderCancel: Bool?, orderDate: String?, orderDivision: OrderDivision?, hongkongProductType: HongkongProductType?, reservationOrderNo: String?, isNext: Bool) {
self.credential = credential
self.accessToken = accessToken
self.overseasExchangeCode = overseasExchangeCode
self.productNo = productNo
self.orderType = orderType
self.orderCancel = orderCancel
self.orderDate = orderDate
self.orderDivision = orderDivision
self.hongkongProductType = hongkongProductType
self.reservationOrderNo = reservationOrderNo
self.isNext = isNext
}
}
/// [v1_-004]
///
public struct StockPreorderCancelRequest: OrderRequest {
public typealias KResult = PreorderCancelResult
public var url: String {
"/uapi/overseas-stock/v1/trading/order-resv-ccnl"
}
public var method: Method { .post }
public var header: [String : String?] {
[
"authorization": "Bearer \(accessToken)",
"appkey": credential.appKey,
"appsecret": credential.appSecret,
"tr_id": trId,
"tr_cont": isNext ? "N": " ",
"custtype": CustomerType.personal.rawValue,
]
}
public var body: [String : Any] {
[
"CANNO": accountNo8,
"ACNT_PRDT_CD": accountNo2,
"RSYN_ORD_RCTT_DT": orderDate,
"OVRS_RSVN_ODNO": reservationOrderNo
]
}
public var result: KResult? = nil
public let credential: Credential
private var trId: String {
if credential.isMock {
switch overseasExchangeCode {
case .nasdaq, .newyork, .amex: //
return "VTTT3017U"
default:
assertionFailure("unsupported yet")
return ""
}
}
else {
switch overseasExchangeCode {
case .nasdaq, .newyork, .amex: //
return "TTTT3017U"
default:
assertionFailure("unsupported yet")
return ""
}
}
}
public let accessToken: String
let overseasExchangeCode: OverseasExchangeType
let orderDate: String
let reservationOrderNo: String
let isNext: Bool
init(credential: Credential, accessToken: String, overseasExchangeCode: OverseasExchangeType, orderDate: String, reservationOrderNo: String, isNext: Bool) {
self.credential = credential
self.accessToken = accessToken
self.overseasExchangeCode = overseasExchangeCode
self.orderDate = orderDate
self.reservationOrderNo = reservationOrderNo
self.isNext = isNext
}
}
/// [v1_-005]
///
public struct StockOutstandingDetailRequest: OrderRequest {
public typealias KResult = OutstandingDetailResult
public var url: String {
"/uapi/overseas-stock/v1/trading/inquire-nccs"
}
public var method: Method { .get }
public var header: [String : String?] {
[
"authorization": "Bearer \(accessToken)",
"appkey": credential.appKey,
"appsecret": credential.appSecret,
"tr_id": trId,
"tr_cont": isNext ? "N": " ",
"custtype": CustomerType.personal.rawValue,
]
}
public var body: [String : Any] {
[
"CANNO": accountNo8,
"ACNT_PRDT_CD": accountNo2,
"OVRS_EXCG_CD": overseasExchangeCode,
"SORT_SQN": ascending ? "DS": "",
"CTX_AREA_FK200": "",
"CTX_AREA_NK200": "",
]
}
public var result: KResult? = nil
public let credential: Credential
private var trId: String {
if credential.isMock {
return "VTTS3018R"
}
else {
return "TTTS3018R"
}
}
public let accessToken: String
let overseasExchangeCode: OverseasExchangeType
let ascending: Bool
let isNext: Bool
init(credential: Credential, accessToken: String, overseasExchangeCode: OverseasExchangeType, ascending: Bool, isNext: Bool) {
self.credential = credential
self.accessToken = accessToken
self.overseasExchangeCode = overseasExchangeCode
self.ascending = ascending
self.isNext = isNext
}
}
/// [v1_-006]
///
public struct StockBalanceRequest: OrderRequest {
public typealias KResult = BalanceResult
public var url: String {
"/uapi/overseas-stock/v1/trading/inquire-balance"
}
public var method: Method { .get }
public var header: [String : String?] {
[
"authorization": "Bearer \(accessToken)",
"appkey": credential.appKey,
"appsecret": credential.appSecret,
"tr_id": trId,
"tr_cont": isNext ? "N": " ",
"custtype": CustomerType.personal.rawValue,
]
}
public var body: [String : Any] {
[
"CANNO": accountNo8,
"ACNT_PRDT_CD": accountNo2,
"OVRS_EXCG_CD": overseasExchangeCode,
"TR_CRCY_CD": tradeCurrencyCode.rawValue,
"CTX_AREA_FK200": "",
"CTX_AREA_NK200": "",
]
}
public var result: KResult? = nil
public let credential: Credential
private var trId: String {
if credential.isMock {
return "VTTS3012R"
}
else {
return "TTTS3012R"
}
}
public let accessToken: String
let overseasExchangeCode: OverseasExchangeType
let tradeCurrencyCode: CurrencyCode
let isNext: Bool
init(credential: Credential, accessToken: String, overseasExchangeCode: OverseasExchangeType, tradeCurrencyCode: CurrencyCode, isNext: Bool) {
self.credential = credential
self.accessToken = accessToken
self.overseasExchangeCode = overseasExchangeCode
self.tradeCurrencyCode = tradeCurrencyCode
self.isNext = isNext
}
}
}
enum HongkongProductType {
case `default`
case cny
case usd
}

View File

@@ -7,10 +7,23 @@
import Foundation
public enum CurrencyCode: String, Codable {
case usd = "USD"
case hkd = "HKD"
case cny = "CNY"
case jpy = "JPY"
case vnd = "VND"
}
extension Overseas {
/*
public struct OrderResult: Codable {
public typealias OrderResult = Domestic.OrderResult
public typealias OrderRevisionResult = Domestic.OrderRevisionResult
public struct PreorderResult: Codable {
public let resultCode: String
public let messageCode: String
public let message: String
@@ -24,16 +37,267 @@ extension Overseas {
}
public struct OutputDetail: Codable {
public let orderOrganizationNo: String
///
public let orderNo: String
public let orderTime: String
///
public let reservationOrderReceiptDate: String
///
public let reservationOrderNo: String
private enum CodingKeys: String, CodingKey {
case orderOrganizationNo = "KRX_FWDG_ORD_ORGNO"
case orderNo = "ODNO"
case orderTime = "ORD_TMD"
case reservationOrderReceiptDate = "RSVN_ORD_RCIT_DT"
case reservationOrderNo = "OVRS_RSVN_ODNO"
}
}
}
public struct PreorderCancelResult: Codable {
public let resultCode: String
public let messageCode: String
public let message: String
public let output: OutputDetail?
private enum CodingKeys: String, CodingKey {
case resultCode = "rt_cd"
case messageCode = "msg_cd"
case message = "msg1"
case output
}
public struct OutputDetail: Codable {
///
public let reservationOrderNo: String
private enum CodingKeys: String, CodingKey {
case reservationOrderNo = "OVRS_RSVN_ODNO"
}
}
}
public struct OutstandingDetailResult: Codable {
public let resultCode: String
public let messageCode: String
public let message: String
public let output: OutputDetail
/// 200
public let continuousQuerySearchCondition200: String
/// 200
public let continuousQueryKey200: String
private enum CodingKeys: String, CodingKey {
case resultCode = "rt_cd"
case messageCode = "msg_cd"
case message = "msg1"
case output
case continuousQuerySearchCondition200 = "ctx_area_fk200"
case continuousQueryKey200 = "ctx_area_nk200"
}
public struct OutputDetail: Codable {
///
public let orderDate: String
///
public let branchNo: String
///
public let orderNo: String
///
public let originalOrderNo: String
///
public let productNo: String
///
public let productName: String
///
public let sellBuyDivisionCode: String
///
public let sellBuyDivisionCodeName: String
///
public let reviseCancelDivisionCode: String
///
public let reviseCancelDivisionCodeName: String
///
public let rejectReason: String
///
public let rejectReasonName: String
///
public let orderTime: String
///
public let tradeMarketName: String
///
public let tradeCurrencyCode: CurrencyCode
///
public let nationCode: String
///
public let nationKoreanName: String
/// FT
public let futureOrderQuantity: String
/// FT
public let futureConclusionQuantity: String
///
public let outstandingQuantity: String
/// FT3
public let futureOrderUnitPrice3: String
/// FT3
public let futureConclusionUnitPrice3: String
/// FT3
public let futureConclusionAmount3: String
///
public let foreignExchangeCode: String
///
public let processStateName: String
///
public let loanTypeCode: String
///
public let loadDate: String
///
public let usaAfterMarketExtensionRequested: YesNo
private enum CodingKeys: String, CodingKey {
case orderDate = "ord_dt"
case branchNo = "ord_gno_brno"
case orderNo = "odno"
case originalOrderNo = "orgn_odno"
case productNo = "pdno"
case productName = "prdt_name"
case sellBuyDivisionCode = "sll_buy_dvsn_cd"
case sellBuyDivisionCodeName = "sll_buy_dvsn_cd_name"
case reviseCancelDivisionCode = "rvse_cncl_dvsn_cd"
case reviseCancelDivisionCodeName = "rvse_cncl_dvsn_cd_name"
case rejectReason = "rjct_rson"
case rejectReasonName = "rjct_rson_name"
case orderTime = "ord_tmd"
case tradeMarketName = "tr_mket_name"
case tradeCurrencyCode = "tr_crcy_cd"
case nationCode = "natn_cd"
case nationKoreanName = "natn_kor_name"
case futureOrderQuantity = "ft_ord_qty"
case futureConclusionQuantity = "ft_ccld_qty"
case outstandingQuantity = "nccs_qty"
case futureOrderUnitPrice3 = "ft_ord_unpr3"
case futureConclusionUnitPrice3 = "ft_ccld_unpr3"
case futureConclusionAmount3 = "ft_ccld_amt3"
case foreignExchangeCode = "ovrs_excg_cd"
case processStateName = "prcs_stat_name"
case loanTypeCode = "loan_type_cd"
case loadDate = "loan_dt"
case usaAfterMarketExtensionRequested = "usa_amk_exts_rqst_yn"
}
}
}
public struct BalanceResult: Codable {
public let resultCode: String
public let messageCode: String
public let message: String
public let continuousQuerySearchCondition200: String?
public let continuousQueryKey200: String?
public let output1: [OutputStock]
public let output2: [OutputProfit]
private enum CodingKeys: String, CodingKey {
case resultCode = "rt_cd"
case messageCode = "msg_cd"
case message = "msg1"
case continuousQuerySearchCondition200 = "ctx_area_fk200"
case continuousQueryKey200 = "ctx_area_nk200"
case output1 = "output1"
case output2 = "output2"
}
public struct OutputStock: Codable {
///
public let accountNo8: String
///
public let accountNo2: String
///
public let productTypeCode: String
///
public let foreignProductNo: String
///
public let foreignItemName: String
///
public let foreignCurrencyEvaluationProfitLossAmount: String
///
public let evaluationProfitLossRate: String
///
public let averagePurchasePrice: String
///
public let foreignBalanceQuantity: String
///
public let orderPossibleQuantity: String
/// 1
public let foreignCurrencyPurchaseAmount1: String
///
public let foreignStockEvaluationAmount: String
/// 2
public let currentPrice2: String
///
public let tradeCurrencyCode: CurrencyCode
///
public let foreignExchangeCode: String
///
public let loanTypeCode: String
///
public let loadDate: String
///
public let expiredDate: String
private enum CodingKeys: String, CodingKey {
case accountNo8 = "cano"
case accountNo2 = "acnt_prdt_cd"
case productTypeCode = "prdt_type_cd"
case foreignProductNo = "ovrs_pdno"
case foreignItemName = "ovrs_item_name"
case foreignCurrencyEvaluationProfitLossAmount = "frcr_evlu_pfls_amt"
case evaluationProfitLossRate = "evlu_pfls_rt"
case averagePurchasePrice = "pchs_avg_pric"
case foreignBalanceQuantity = "ovrs_cblc_qty"
case orderPossibleQuantity = "ord_psbl_qty"
case foreignCurrencyPurchaseAmount1 = "frcr_pchs_amt1"
case foreignStockEvaluationAmount = "ovrs_stck_evlu_amt"
case currentPrice2 = "now_pric2"
case tradeCurrencyCode = "tr_crcy_cd"
case foreignExchangeCode = "ovrs_excg_cd"
case loanTypeCode = "loan_type_cd"
case loadDate = "loan_dt"
case expiredDate = "expd_dt"
}
}
public struct OutputProfit: Codable {
/// 1
public let foreignCurrencyPurchaseAmount1: String
///
public let foreignRealizedProfitLossAmount: String
///
public let foreignTotalProfitLoss: String
///
public let realizedEarningRate: String
///
public let totalEvaluationProfitLossAmount: String
///
public let totalProfitRate: String
/// 1
public let foreignCurrencyTotalPurchaseAmount1: String
/// 2
public let foreignRealizedProfitLossAmount2: String
/// 2
public let foreignCurrencyTotalPurchaseAmount2: String
private enum CodingKeys: String, CodingKey {
case foreignCurrencyPurchaseAmount1 = "frcr_pchs_amt1"
case foreignRealizedProfitLossAmount = "ovrs_rlzt_pfls_amt"
case foreignTotalProfitLoss = "ovrs_tot_pfls"
case realizedEarningRate = "rlzt_erng_rt"
case totalEvaluationProfitLossAmount = "tot_evlu_pfls_amt"
case totalProfitRate = "tot_pftrt"
case foreignCurrencyTotalPurchaseAmount1 = "frcr_buy_amt_smtl1"
case foreignRealizedProfitLossAmount2 = "ovrs_rlzt_pfls_amt2"
case foreignCurrencyTotalPurchaseAmount2 = "frcr_buy_amt_smtl2"
}
}
}
*/
}

View File

@@ -26,3 +26,7 @@ KissMeSacks 는 분봉을 바탕으로 가상의 매매를 시뮬레이션 해
### SP design
*
### FieldBuf design
### WorldBuf design

View File

@@ -142,6 +142,23 @@ KissMeGolder 는 KissMeMatrix model 을 충실하게 따르면서, 자동으로
사용하고자 하는 model 에 따라서 다양한 투자 성향을 가질 수 있도록 설계할 것입니다.
# KissMeSacks
KissMeSacks 는 단타 매매를 자동으로 검증해주는 시뮬레이션 로봇입니다.
완성도가 높아지면 나중에 KissGoblin UI 기능으로 연동될 것입니다.
# KissGram
KissGram 은 텔레그램 봇과 연동하여 다양한 정보 창구로 쓰일 수 있도록 고안된 인터페이스 툴입니다.
# KissGoblin
디아블로의 보물 고블린의 아이디어에서 따온 것입니다.
매수 시점에 고블린이 스폰되고, 매도 시점에 고블린이 아이템을 드랍하고 사라지는 컨셉입니다.
매수와 매도 사이의 재미있는 인터페이스를 제공하는 것이 목표입니다.
# Credential json

View File

@@ -17,12 +17,10 @@
341F5EBC2A0A80EC00962D48 /* KissMe.h in Headers */ = {isa = PBXBuildFile; fileRef = 341F5EAE2A0A80EC00962D48 /* KissMe.h */; settings = {ATTRIBUTES = (Public, ); }; };
341F5EDE2A0F300100962D48 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EDD2A0F300100962D48 /* Request.swift */; };
341F5EE12A0F373B00962D48 /* Login.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EE02A0F373B00962D48 /* Login.swift */; };
341F5EE52A0F3EF400962D48 /* DomesticStock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EE42A0F3EF400962D48 /* DomesticStock.swift */; };
341F5EE92A0F87FB00962D48 /* DomesticStockPrice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EE82A0F87FB00962D48 /* DomesticStockPrice.swift */; };
341F5EEC2A0F883900962D48 /* OverseasStock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EEB2A0F883900962D48 /* OverseasStock.swift */; };
341F5EEE2A0F884300962D48 /* OverseasStockPrice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EED2A0F884300962D48 /* OverseasStockPrice.swift */; };
341F5EF02A0F886600962D48 /* OverseasFutures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EEF2A0F886600962D48 /* OverseasFutures.swift */; };
341F5EF22A0F887200962D48 /* DomesticFutures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EF12A0F887200962D48 /* DomesticFutures.swift */; };
341F5EF52A0F891200962D48 /* KissAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EF42A0F891200962D48 /* KissAccount.swift */; };
341F5EF72A0F8B0500962D48 /* DomesticStockResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EF62A0F8B0500962D48 /* DomesticStockResult.swift */; };
341F5EF92A0F907300962D48 /* DomesticStockPriceResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5EF82A0F907300962D48 /* DomesticStockPriceResult.swift */; };
@@ -38,6 +36,8 @@
341F5F112A1685E700962D48 /* ShopRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5F102A1685E700962D48 /* ShopRequest.swift */; };
341F5F142A16CD7A00962D48 /* DomesticShopProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341F5F132A16CD7A00962D48 /* DomesticShopProduct.swift */; };
3435A7F72A35D82000D604F1 /* DomesticShortSelling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3435A7F62A35D82000D604F1 /* DomesticShortSelling.swift */; };
34942F562CCA9AD200F85B79 /* DomesticStock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34942F552CCA9AD200F85B79 /* DomesticStock.swift */; };
34942F5A2CCA9B2700F85B79 /* DomesticFutures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34942F592CCA9B2700F85B79 /* DomesticFutures.swift */; };
349B05172C25B7C600378D55 /* OverseasStockResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349B05162C25B7C600378D55 /* OverseasStockResult.swift */; };
349C26AB2A1EAE2400F3EC91 /* KissProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349C26AA2A1EAE2400F3EC91 /* KissProfile.swift */; };
349F5D142A6BC8D3009A0526 /* String+Html.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349F5D132A6BC8D3009A0526 /* String+Html.swift */; };
@@ -164,12 +164,10 @@
341F5EBA2A0A80EC00962D48 /* KissMeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KissMeTests.swift; sourceTree = "<group>"; };
341F5EDD2A0F300100962D48 /* Request.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = "<group>"; };
341F5EE02A0F373B00962D48 /* Login.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Login.swift; sourceTree = "<group>"; };
341F5EE42A0F3EF400962D48 /* DomesticStock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DomesticStock.swift; path = "../New Group/DomesticStock.swift"; sourceTree = "<group>"; };
341F5EE82A0F87FB00962D48 /* DomesticStockPrice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticStockPrice.swift; sourceTree = "<group>"; };
341F5EEB2A0F883900962D48 /* OverseasStock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverseasStock.swift; sourceTree = "<group>"; };
341F5EED2A0F884300962D48 /* OverseasStockPrice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverseasStockPrice.swift; sourceTree = "<group>"; };
341F5EEF2A0F886600962D48 /* OverseasFutures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverseasFutures.swift; sourceTree = "<group>"; };
341F5EF12A0F887200962D48 /* DomesticFutures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticFutures.swift; sourceTree = "<group>"; };
341F5EF42A0F891200962D48 /* KissAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KissAccount.swift; sourceTree = "<group>"; };
341F5EF62A0F8B0500962D48 /* DomesticStockResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticStockResult.swift; sourceTree = "<group>"; };
341F5EF82A0F907300962D48 /* DomesticStockPriceResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticStockPriceResult.swift; sourceTree = "<group>"; };
@@ -185,6 +183,8 @@
341F5F102A1685E700962D48 /* ShopRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShopRequest.swift; sourceTree = "<group>"; };
341F5F132A16CD7A00962D48 /* DomesticShopProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticShopProduct.swift; sourceTree = "<group>"; };
3435A7F62A35D82000D604F1 /* DomesticShortSelling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticShortSelling.swift; sourceTree = "<group>"; };
34942F552CCA9AD200F85B79 /* DomesticStock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticStock.swift; sourceTree = "<group>"; };
34942F592CCA9B2700F85B79 /* DomesticFutures.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticFutures.swift; sourceTree = "<group>"; };
349B05162C25B7C600378D55 /* OverseasStockResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverseasStockResult.swift; sourceTree = "<group>"; };
349C26AA2A1EAE2400F3EC91 /* KissProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KissProfile.swift; sourceTree = "<group>"; };
349F5D132A6BC8D3009A0526 /* String+Html.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Html.swift"; sourceTree = "<group>"; };
@@ -368,12 +368,12 @@
isa = PBXGroup;
children = (
34BC44772A86566D0052D8EB /* Stock */,
34942F582CCA9B1000F85B79 /* Futures */,
34BC44742A8656250052D8EB /* Realtime */,
34F8449E2A683A1700152D98 /* News */,
34C1BA4B2A595A5F00423D64 /* DART */,
34E7B90F2A4994AF00B3AB9F /* KRX300 */,
341F5F122A16CD3C00962D48 /* Shop */,
341F5EF12A0F887200962D48 /* DomesticFutures.swift */,
);
path = Domestic;
sourceTree = "<group>";
@@ -416,6 +416,14 @@
path = Shop;
sourceTree = "<group>";
};
34942F582CCA9B1000F85B79 /* Futures */ = {
isa = PBXGroup;
children = (
34942F592CCA9B2700F85B79 /* DomesticFutures.swift */,
);
path = Futures;
sourceTree = "<group>";
};
34BC44742A8656250052D8EB /* Realtime */ = {
isa = PBXGroup;
children = (
@@ -432,7 +440,7 @@
34BC44772A86566D0052D8EB /* Stock */ = {
isa = PBXGroup;
children = (
341F5EE42A0F3EF400962D48 /* DomesticStock.swift */,
34942F552CCA9AD200F85B79 /* DomesticStock.swift */,
341F5EF62A0F8B0500962D48 /* DomesticStockResult.swift */,
341F5EE82A0F87FB00962D48 /* DomesticStockPrice.swift */,
341F5EF82A0F907300962D48 /* DomesticStockPriceResult.swift */,
@@ -836,10 +844,10 @@
341F5EB02A0A80EC00962D48 /* KissMe.docc in Sources */,
341F5EFD2A10931B00962D48 /* DomesticStockSearch.swift in Sources */,
349F5D142A6BC8D3009A0526 /* String+Html.swift in Sources */,
341F5EE52A0F3EF400962D48 /* DomesticStock.swift in Sources */,
341F5EF72A0F8B0500962D48 /* DomesticStockResult.swift in Sources */,
34F1900F2A426D150068C697 /* ShopContext.swift in Sources */,
341F5F0F2A15223A00962D48 /* SeibroRequest.swift in Sources */,
34942F562CCA9AD200F85B79 /* DomesticStock.swift in Sources */,
341F5EF02A0F886600962D48 /* OverseasFutures.swift in Sources */,
34F1900C2A41982A0068C697 /* KissIndexResult.swift in Sources */,
341F5EEC2A0F883900962D48 /* OverseasStock.swift in Sources */,
@@ -855,7 +863,7 @@
349C26AB2A1EAE2400F3EC91 /* KissProfile.swift in Sources */,
341F5F012A11155100962D48 /* DomesticStockSearchResult.swift in Sources */,
341F5F142A16CD7A00962D48 /* DomesticShopProduct.swift in Sources */,
341F5EF22A0F887200962D48 /* DomesticFutures.swift in Sources */,
34942F5A2CCA9B2700F85B79 /* DomesticFutures.swift in Sources */,
34C1BA4D2A59CD3400423D64 /* DomesticDartNotice.swift in Sources */,
34D3680F2A2AA0BE005E6756 /* PropertyIterable.swift in Sources */,
341F5F112A1685E700962D48 /* ShopRequest.swift in Sources */,