55
66[ KTrader-Broker-API] ( https://github.com/ktrader-tech/ktrader-broker-api ) 的 CTP 实现。可以作为类库使用,也可以作为插件使用。
77
8+ 对底层 CTP 的调用使用了 CTP 的 Java 封装 [ JCTP] ( https://github.com/RationalityFrontline/jctp ) ,支持 64 位的 Windows 及 Linux 操作系统。
9+ 默认使用的 JCTP 版本为 ` 6.6.1_P1-1.0.0 ` ,如果需要更换为其它版本,请参考 [ Download] ( #download ) 部分。
10+
11+ ## 功能特性
12+ * 利用 [ Kotlin 协程] ( https://github.com/Kotlin/kotlinx.coroutines ) 将 CTP 的异步接口封装为 [ KTrader-Broker-API] ( https://github.com/ktrader-tech/ktrader-broker-api ) 的统一同步调用方式,降低心智负担,提升开发效率
13+ * 内置自成交风控,存在自成交风险的下单请求会本地拒单
14+ * 内置撤单数量风控,单合约日内撤单数达到 499 次后会本地拒绝该合约的撤单请求
15+ * 内置 CTP 流控处理,调用层无需关注任何 CTP 流控信息
16+ * 内置维护本地持仓、订单、成交、Tick 缓存,让查询请求快速返回,不受流控阻塞
17+ * 支持期货及期权的交易(目前尚不支持期权行权及自对冲,仅支持期权交易)
18+ * 自动查询账户真实的手续费率(包括中金所申报手续费)与保证金率,并计算持仓、订单、成交相关的手续费、保证金、冻结资金(期权也支持)
19+ * 封装提供了一些 CTP 原生不支持的功能,如查询当前已订阅行情,Tick 中带有合约交易状态及 Tick 内成交量成交额等
20+ * 网络断开重连时会自动订阅原先已订阅的行情,不用手动重新订阅
21+ * 众所周知,CTP 使用繁琐(如登录流程)且存在很多的坑(如批量订阅行情每34个订阅会丢失一个订阅),但本框架封装后暴露给终端用户的接口是简洁且统一的
22+ * 支持 7x24 小时不间断运行
23+
24+ ## 快速入门
25+ 这里以类库的使用方式为例,首先参考 [ Download] ( #download ) 部分添加类库依赖,然后就可以使用本框架了:
26+ ``` kotlin
27+ import kotlinx.coroutines.runBlocking
28+ import org.rationalityfrontline.kevent.KEVENT
29+ import org.rationalityfrontline.ktrader.broker.api.*
30+ import org.rationalityfrontline.ktrader.broker.ctp.CtpBrokerApi
31+
32+ fun main () {
33+ println (" ------------ 启动 ------------" )
34+ // 创建 CTP 配置参数
35+ val config = mutableMapOf (
36+ " mdFronts" to listOf ( // 行情前置地址
37+ " tcp://0.0.0.0:0" ,
38+ ),
39+ " tdFronts" to listOf ( // 交易前置地址
40+ " tcp://0.0.0.0:0" ,
41+ ),
42+ " investorId" to " 123456" , // 资金账号
43+ " password" to " 123456" , // 资金账号密码
44+ " brokerId" to " 1234" , // BROKER ID
45+ " appId" to " rf_ktrader_1.0.0" , // APPID
46+ " authCode" to " ASDFGHJKL" , // 授权码
47+ " cachePath" to " ./build/flow/" , // 本地缓存文件存储目录
48+ " disableAutoSubscribe" to false , // 是否禁用自动订阅
49+ " disableFeeCalculation" to false , // 是否禁用费用计算
50+ )
51+ // 创建 CtpBrokerApi 实例
52+ val api = CtpBrokerApi (config, KEVENT )
53+ // 订阅所有事件
54+ KEVENT .subscribeMultiple<BrokerEvent >(BrokerEventType .values().asList()) { event -> runBlocking {
55+ // 处理事件推送
56+ val brokerEvent = event.data
57+ when (brokerEvent.type) {
58+ // Tick 推送
59+ BrokerEventType .MD_TICK -> {
60+ val tick = brokerEvent.data as Tick
61+ // 当某合约触及涨停价时,以跌停价挂1手多单开仓限价委托单
62+ if (tick.lastPrice == tick.todayHighLimitPrice) {
63+ api.insertOrder(tick.code, tick.todayLowLimitPrice, 1 , Direction .LONG , OrderOffset .OPEN , OrderType .LIMIT )
64+ }
65+ }
66+ // 其它事件(网络连接、订单回报、成交回报等)
67+ else -> {
68+ println (brokerEvent)
69+ }
70+ }
71+ }}
72+ // 测试 api
73+ runBlocking {
74+ api.connect()
75+ println (" CTP 已连接" )
76+ println (" 当前交易日:${api.getTradingDay()} " )
77+ println (" 查询账户资金:" )
78+ println (api.queryAssets())
79+ println (" 查询账户持仓:" )
80+ println (api.queryPositions().joinToString(" \n " ))
81+ println (" 查询当日全部订单:" )
82+ println (api.queryOrders(onlyUnfinished = false ).joinToString(" \n " ))
83+ println (" 查询当日全部成交记录:" )
84+ println (api.queryTrades().joinToString(" \n " ))
85+ // 订阅行情
86+ api.subscribeMarketData(" SHFE.ru2109" )
87+ // Thread.currentThread().join() // 如果需要 7x24 小时不间断运行,取消注释此行。(如需主动退出运行请使用 System.exit(0) 或 exitProcess(0))
88+ api.close()
89+ println (" CTP 已关闭" )
90+ }
91+ // 清空 KEVENT
92+ KEVENT .clear()
93+ println (" ------------ 退出 ------------" )
94+ }
95+ ```
96+
97+ ## 示例项目
98+ 本框架在 examples 目录下提供了一些示例项目帮助使用者快速入门及创建新项目:
99+
100+ [ library-basic] ( https://github.com/ktrader-tech/ktrader-broker-ctp/tree/master/examples/library-basic ) :展示以类库方式使用本框架的最简单基础的示例项目
101+
102+ ## 使用说明
103+ 相较于 [ KTrader-Broker-API] ( https://github.com/ktrader-tech/ktrader-broker-api ) 标准接口,本框架需要说明的参数及额外扩展如下:
104+ ``` text
105+ configKeys:
106+ {
107+ mdFronts: List<String> 行情前置
108+ tdFronts: List<String> 交易前置
109+ investorId: String 投资者资金账号
110+ password: String 投资者资金账号的密码
111+ brokerId: String 经纪商ID
112+ appId: String 交易终端软件的标识码
113+ authCode: String 交易终端软件的授权码
114+ userProductInfo: String 交易终端软件的产品信息
115+ cachePath: String 存贮订阅信息文件等临时文件的目录
116+ disableAutoSubscribe: Boolean 是否禁止自动订阅持仓合约的行情(用于计算合约今仓保证金以及查询持仓时返回最新价及盈亏)
117+ disableFeeCalculation: Boolean 是否禁止计算保证金及手续费(首次计算某个合约的费用时,可能会查询该合约的最新 Tick、保证金率、手续费率,造成额外开销,后续再次计算时则会使用上次查询的结果)
118+ }
119+ methodExtras:
120+ {
121+ subscribeMarketData/unsubscribeMarketData/subscribeAllMarketData/unsubscribeAllMarketData: [isForce: Boolean = false]【是否强制向交易所发送未更改的订阅请求(默认只发送未/已被订阅的标的的订阅请求)】
122+ insertOrder: [minVolume: Int]【最小成交量。仅当下单类型为 OrderType.FAK 时生效】
123+ querySecurity: [queryFee: Boolean = false]【是否查询保证金率及手续费率,如果之前没查过,可能会耗时。当 useCache 为 false 时无效】
124+ }
125+ customMethods:
126+ null
127+ customEvents:
128+ null
129+ ```
130+
8131## Download
9132
10133** Gradle:**
@@ -16,6 +139,8 @@ repositories {
16139
17140dependencies {
18141 implementation(" org.rationalityfrontline.ktrader:ktrader-broker-ctp:1.1.1" )
142+ // 如果需要使用其它版本的 JCTP,取消注释下面一行,并填入自己需要的版本号
143+ // implementation("org.rationalityfrontline:jctp") { version { strictly("6.6.1_P1_CP-1.0.0") } }
19144}
20145```
21146
0 commit comments