Skip to content

Commit 00daa0d

Browse files
初步达到可用程度
1 parent fc7a6c8 commit 00daa0d

File tree

7 files changed

+354
-12
lines changed

7 files changed

+354
-12
lines changed

lib/build.gradle.kts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
plugins {
2-
kotlin("jvm") version "1.4.20"
2+
kotlin("jvm") version "1.5.10"
33
`java-library`
44
`maven-publish`
55
signing
6-
id("org.jetbrains.dokka") version "1.4.10"
7-
id("org.javamodularity.moduleplugin") version "1.7.0"
6+
id("org.jetbrains.dokka") version "1.4.32"
7+
id("org.javamodularity.moduleplugin") version "1.8.7"
88
}
99

1010
group = "org.rationalityfrontline.ktrader"
11-
version = "0.1.1-SNAPSHOT"
11+
version = "0.1.6-SNAPSHOT"
1212
val NAME = "ktrader-broker-api"
1313
val DESC = "KTrader Broker API"
1414
val GITHUB_REPO = "RationalityFrontline/ktrader-broker-api"
1515

1616
repositories {
17+
mavenLocal()
1718
mavenCentral()
18-
jcenter()
1919
}
2020

2121
dependencies {
22-
api("org.pf4j:pf4j:3.4.1")
23-
testImplementation(platform("org.junit:junit-bom:5.7.0"))
24-
testImplementation("org.junit.jupiter:junit-jupiter:5.7.0")
22+
compileOnly("org.pf4j:pf4j:3.7.0-SNAPSHOT")
23+
api("org.rationalityfrontline:kevent:2.0.0")
2524
}
2625

2726
sourceSets.main {
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module ktrader.broker.api {
22
requires kotlin.stdlib;
3-
requires transitive pf4j;
3+
requires static org.pf4j;
4+
requires transitive kevent;
45

56
exports org.rationalityfrontline.ktrader.broker.api;
67
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.rationalityfrontline.ktrader.broker.api
2+
3+
import org.pf4j.ExtensionPoint
4+
import org.rationalityfrontline.kevent.KEvent
5+
6+
abstract class Broker : ExtensionPoint {
7+
abstract val name: String
8+
abstract val version: String
9+
abstract val configKeys: List<Pair<String, String>>
10+
open val methodExtras: List<Pair<String, String>> = listOf()
11+
open val customMethods: List<Pair<String, String>> = listOf()
12+
open val customEvents: List<Pair<String, String>> = listOf()
13+
abstract fun createApi(config: Map<String, Any>, kEvent: KEvent): BrokerApi
14+
private fun formatPairList(list: List<Pair<String, String>>): String {
15+
return if (list.isEmpty()) "null" else {
16+
val indent = " "
17+
list.joinToString(separator = "\n", prefix = "{\n", postfix = "\n$indent}") { "$indent ${it.first}: ${it.second}" }
18+
}
19+
}
20+
override fun toString(): String {
21+
return """
22+
Broker@${hashCode()}, name=$name, version=$version
23+
configKeys:
24+
${formatPairList(configKeys)}
25+
methodExtras:
26+
${formatPairList(methodExtras)}
27+
customMethods:
28+
${formatPairList(customMethods)}
29+
customEvents:
30+
${formatPairList(customEvents)}
31+
""".trimIndent()
32+
}
33+
}
Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,76 @@
11
package org.rationalityfrontline.ktrader.broker.api
22

3-
import org.pf4j.ExtensionPoint
3+
import org.rationalityfrontline.kevent.KEvent
4+
import java.time.LocalDate
5+
import java.time.LocalDateTime
46

5-
interface BrokerApi : ExtensionPoint {
6-
fun getVersion(): String
7+
abstract class BrokerApi(val config: Map<String, Any>, val kEvent: KEvent) {
8+
abstract val name: String
9+
abstract val version: String
10+
abstract val account: String
11+
open val sourceId: String get() = "${name}_${account}_${hashCode()}"
12+
abstract val mdConnected: Boolean
13+
abstract val tdConnected: Boolean
14+
val createTime: LocalDateTime = LocalDateTime.now()
15+
16+
abstract suspend fun connect(connectMd: Boolean = true, connectTd: Boolean = true, extras: Map<String, Any>? = null)
17+
18+
abstract suspend fun close()
19+
20+
open fun getTradingDay(): LocalDate = LocalDate.now()
21+
22+
abstract suspend fun subscribeMarketData(codes: Collection<String>, extras: Map<String, Any>? = null)
23+
24+
abstract suspend fun unsubscribeMarketData(codes: Collection<String>, extras: Map<String, Any>? = null)
25+
26+
abstract suspend fun subscribeAllMarketData(extras: Map<String, Any>? = null)
27+
28+
abstract suspend fun unsubscribeAllMarketData(extras: Map<String, Any>? = null)
29+
30+
abstract suspend fun querySubscriptions(useCache: Boolean = true, extras: Map<String, Any>? = null): List<String>
31+
32+
abstract suspend fun queryLastTick(code: String, useCache: Boolean = true, extras: Map<String, Any>? = null): Tick
33+
34+
abstract suspend fun queryInstrument(code: String, useCache: Boolean = true, extras: Map<String, Any>? = null): Instrument
35+
36+
abstract suspend fun queryAllInstruments(useCache: Boolean = true, extras: Map<String, Any>? = null): List<Instrument>
37+
38+
abstract suspend fun queryAssets(useCache: Boolean = true, extras: Map<String, Any>? = null): Assets
39+
40+
abstract suspend fun queryPositions(code: String? = null, useCache: Boolean = true, extras: Map<String, Any>? = null): List<Position>
41+
42+
abstract suspend fun queryOrder(orderId: String, useCache: Boolean = true, extras: Map<String, Any>? = null): Order
43+
44+
abstract suspend fun queryOrders(code: String? = null, onlyUnfinished: Boolean = true, useCache: Boolean = true, extras: Map<String, Any>? = null): List<Order>
45+
46+
abstract suspend fun queryTrade(tradeId: String, useCache: Boolean = true, extras: Map<String, Any>? = null): Order
47+
48+
abstract suspend fun queryTrades(code: String? = null, useCache: Boolean = true, extras: Map<String, Any>? = null): List<Trade>
49+
50+
abstract fun insertOrder(
51+
code: String, price: Double, volume: Int, direction: Direction, offset: OrderOffset,
52+
orderType: OrderType = OrderType.LIMIT, extras: Map<String, Any>? = null
53+
): Order
54+
55+
abstract fun cancelOrder(orderId: String, extras: Map<String, Any>? = null)
56+
57+
open fun prepareFeeCalculation(extras: Map<String, Any>? = null) {}
58+
59+
open fun calculatePositions(positions: List<Position>, extras: Map<String, Any>? = null): List<Position> = positions
60+
61+
open fun calculateFrozenCash(order: Order, extras: Map<String, Any>? = null): Double = 0.0
62+
63+
open fun calculateCommission(order: Order, extras: Map<String, Any>? = null): Double = 0.0
64+
65+
open suspend fun customSuspendRequest(method: String, params: Map<String, Any>? = null): Any {
66+
throw IllegalArgumentException("Unsupported suspend custom method:$method")
67+
}
68+
69+
open fun customRequest(method: String, params: Map<String, Any>? = null): Any {
70+
throw IllegalArgumentException("Unsupported custom method:$method")
71+
}
72+
73+
override fun toString(): String {
74+
return "$name@$version@$account@${hashCode()}"
75+
}
776
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.rationalityfrontline.ktrader.broker.api
2+
3+
enum class BrokerEventType {
4+
MD_ERROR,
5+
MD_CUSTOM_EVENT,
6+
MD_NET_CONNECTED,
7+
MD_NET_DISCONNECTED,
8+
MD_USER_LOGGED_IN,
9+
MD_USER_LOGGED_OUT,
10+
MD_TICK,
11+
TD_ERROR,
12+
TD_CUSTOM_EVENT,
13+
TD_NET_CONNECTED,
14+
TD_NET_DISCONNECTED,
15+
TD_USER_LOGGED_IN,
16+
TD_USER_LOGGED_OUT,
17+
TD_ORDER_STATUS,
18+
TD_ORDER_FILLED,
19+
}
20+
21+
data class BrokerEvent(
22+
val type: BrokerEventType,
23+
val sourceId: String,
24+
val data: Any,
25+
)
26+
27+
data class CustomEvent(
28+
val type: String,
29+
val data: Any,
30+
)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.rationalityfrontline.ktrader.broker.api
2+
3+
enum class InstrumentType {
4+
UNKNOWN,
5+
FUTURES,
6+
OPTIONS,
7+
STOCK,
8+
}
9+
10+
enum class OptionsType {
11+
CALL,
12+
PUT,
13+
}
14+
15+
enum class Direction {
16+
LONG,
17+
SHORT,
18+
}
19+
20+
enum class TickDirection {
21+
UP,
22+
STAY,
23+
DOWN,
24+
}
25+
26+
enum class OrderOffset {
27+
OPEN,
28+
CLOSE,
29+
CLOSE_TODAY,
30+
CLOSE_YESTERDAY,
31+
}
32+
33+
enum class OrderType {
34+
CUSTOM,
35+
LIMIT,
36+
MARKET,
37+
FAK,
38+
FOK,
39+
STOP,
40+
}
41+
42+
enum class OrderStatus {
43+
SUBMITTING,
44+
ACCEPTED,
45+
PARTIALLY_FILLED,
46+
FILLED,
47+
CANCELING,
48+
CANCELED,
49+
ERROR,
50+
}
51+
52+
enum class MarketStatus {
53+
UNKNOWN,
54+
AUCTION_ORDERING,
55+
AUCTION_MATCHED,
56+
CONTINUOUS_MATCHING,
57+
STOP_TRADING,
58+
CLOSED,
59+
}

0 commit comments

Comments
 (0)