Add oversea APIs (4 kind)
This commit is contained in:
@@ -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 {
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
/// FT주문단가3
|
||||
public let futureOrderUnitPrice3: String
|
||||
/// FT체결단가3
|
||||
public let futureConclusionUnitPrice3: String
|
||||
/// FT체결금액3
|
||||
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"
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -26,3 +26,7 @@ KissMeSacks 는 분봉을 바탕으로 가상의 매매를 시뮬레이션 해
|
||||
### SP design
|
||||
|
||||
*
|
||||
|
||||
### FieldBuf design
|
||||
|
||||
### WorldBuf design
|
||||
|
||||
17
README.md
17
README.md
@@ -142,6 +142,23 @@ KissMeGolder 는 KissMeMatrix model 을 충실하게 따르면서, 자동으로
|
||||
|
||||
사용하고자 하는 model 에 따라서 다양한 투자 성향을 가질 수 있도록 설계할 것입니다.
|
||||
|
||||
# KissMeSacks
|
||||
|
||||
KissMeSacks 는 단타 매매를 자동으로 검증해주는 시뮬레이션 로봇입니다.
|
||||
|
||||
완성도가 높아지면 나중에 KissGoblin UI 기능으로 연동될 것입니다.
|
||||
|
||||
# KissGram
|
||||
|
||||
KissGram 은 텔레그램 봇과 연동하여 다양한 정보 창구로 쓰일 수 있도록 고안된 인터페이스 툴입니다.
|
||||
|
||||
# KissGoblin
|
||||
|
||||
디아블로의 보물 고블린의 아이디어에서 따온 것입니다.
|
||||
|
||||
매수 시점에 고블린이 스폰되고, 매도 시점에 고블린이 아이템을 드랍하고 사라지는 컨셉입니다.
|
||||
|
||||
매수와 매도 사이의 재미있는 인터페이스를 제공하는 것이 목표입니다.
|
||||
|
||||
# Credential json
|
||||
|
||||
|
||||
@@ -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 */,
|
||||
|
||||
Reference in New Issue
Block a user