hft-js 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,2 +1,5 @@
1
1
  # hft.js
2
+
3
+ [![NPM Version](https://img.shields.io/npm/v/hft-js)](https://www.npmjs.com/package/hft-js)
4
+
2
5
  High-Frequency Trading in Node.js
@@ -0,0 +1,33 @@
1
+ import { OffsetType, OrderData, OrderFlag, SideType } from "./typedef.js";
2
+ import { ICancelOrderResultReceiver, ICancelOrderRiskManager, ICommissionRateReceiver, IErrorReceiver, IInstrumentReceiver, IInstrumentsReceiver, IMarginRateReceiver, IMarketProvider, IOrdersReceiver, IPlaceOrderRiskManager, IPositionsReceiver, IRuntimeEngine, IStrategy, ITickReceiver, ITraderProvider, ITradingAccountsReceiver, IPlaceOrderResultReceiver, IPositionReceiver, IPositionDetailsReceiver } from "./interfaces.js";
3
+ export declare class Broker implements IRuntimeEngine {
4
+ private readonly trader;
5
+ private readonly market;
6
+ private readonly traderLifecycle;
7
+ private readonly marketLifecycle;
8
+ private readonly strategies;
9
+ private readonly placeOrderRiskManagers;
10
+ private readonly cancelOrderRiskManagers;
11
+ constructor(trader: ITraderProvider, market: IMarketProvider, errorReceiver?: IErrorReceiver);
12
+ start(): boolean;
13
+ stop(): void;
14
+ addStrategy(strategy: IStrategy): void;
15
+ removeStrategy(strategy: IStrategy): void;
16
+ addPlaceOrderRiskManager(riskMgr: IPlaceOrderRiskManager): void;
17
+ addCancelOrderRiskManager(riskMgr: ICancelOrderRiskManager): void;
18
+ subscribe(symbols: string[], receiver: ITickReceiver): void;
19
+ unsubscribe(symbols: string[], receiver: ITickReceiver): void;
20
+ placeOrder(strategy: IStrategy, symbol: string, offset: OffsetType, side: SideType, volume: number, price: number, flag: OrderFlag, receiver: IPlaceOrderResultReceiver): void;
21
+ cancelOrder(strategy: IStrategy, order: OrderData, receiver: ICancelOrderResultReceiver): void;
22
+ getTradingDay(): number;
23
+ queryCommissionRate(symbol: string, receiver: ICommissionRateReceiver): void;
24
+ queryMarginRate(symbol: string, receiver: IMarginRateReceiver): void;
25
+ queryInstrument(symbol: string, receiver: IInstrumentReceiver): void;
26
+ queryPosition(symbol: string, receiver: IPositionReceiver): void;
27
+ queryInstruments(receiver: IInstrumentsReceiver): void;
28
+ queryTradingAccounts(receiver: ITradingAccountsReceiver): void;
29
+ queryPositions(receiver: IPositionsReceiver): void;
30
+ queryPositionDetails(receiver: IPositionDetailsReceiver): void;
31
+ queryOrders(receiver: IOrdersReceiver): void;
32
+ }
33
+ export declare const createBroker: (trader: ITraderProvider, market: IMarketProvider, errorReceiver?: IErrorReceiver) => Broker;
package/lib/broker.js ADDED
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /*
3
+ * broker.ts
4
+ *
5
+ * Copyright (c) 2025 Xiongfei Shi
6
+ *
7
+ * Author: Xiongfei Shi <xiongfei.shi(a)icloud.com>
8
+ * License: Apache-2.0
9
+ *
10
+ * https://github.com/shixiongfei/hft.js
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.createBroker = exports.Broker = void 0;
14
+ var Broker = /** @class */ (function () {
15
+ function Broker(trader, market, errorReceiver) {
16
+ var _this = this;
17
+ this.strategies = [];
18
+ this.placeOrderRiskManagers = [];
19
+ this.cancelOrderRiskManagers = [];
20
+ this.trader = trader;
21
+ this.market = market;
22
+ this.marketLifecycle = {
23
+ onOpen: function () {
24
+ if (_this.market.hasRecorder()) {
25
+ _this.trader.queryInstruments({
26
+ onInstruments: function (instruments) {
27
+ if (instruments) {
28
+ _this.market.startRecorder(instruments);
29
+ }
30
+ },
31
+ });
32
+ }
33
+ _this.strategies.forEach(function (strategy) { return strategy.onInit(_this); });
34
+ },
35
+ onClose: function () {
36
+ _this.strategies.forEach(function (strategy) { return strategy.onDestroy(_this); });
37
+ _this.market.stopRecorder();
38
+ },
39
+ onError: function (error, message) {
40
+ if (errorReceiver) {
41
+ errorReceiver.onError(error, message);
42
+ }
43
+ },
44
+ };
45
+ this.traderLifecycle = {
46
+ onOpen: function () {
47
+ _this.market.open(_this.marketLifecycle);
48
+ },
49
+ onClose: function () {
50
+ _this.market.close(_this.marketLifecycle);
51
+ },
52
+ onError: function (error, message) {
53
+ if (errorReceiver) {
54
+ errorReceiver.onError(error, message);
55
+ }
56
+ },
57
+ };
58
+ }
59
+ Broker.prototype.start = function () {
60
+ return this.trader.open(this.traderLifecycle);
61
+ };
62
+ Broker.prototype.stop = function () {
63
+ return this.trader.close(this.traderLifecycle);
64
+ };
65
+ Broker.prototype.addStrategy = function (strategy) {
66
+ if (!this.strategies.includes(strategy)) {
67
+ this.strategies.push(strategy);
68
+ this.trader.addReceiver(strategy);
69
+ }
70
+ };
71
+ Broker.prototype.removeStrategy = function (strategy) {
72
+ var index = this.strategies.indexOf(strategy);
73
+ if (index < 0) {
74
+ return;
75
+ }
76
+ this.strategies.splice(index, 1);
77
+ this.trader.removeReceiver(strategy);
78
+ };
79
+ Broker.prototype.addPlaceOrderRiskManager = function (riskMgr) {
80
+ if (!this.placeOrderRiskManagers.includes(riskMgr)) {
81
+ this.placeOrderRiskManagers.push(riskMgr);
82
+ }
83
+ };
84
+ Broker.prototype.addCancelOrderRiskManager = function (riskMgr) {
85
+ if (!this.cancelOrderRiskManagers.includes(riskMgr)) {
86
+ this.cancelOrderRiskManagers.push(riskMgr);
87
+ }
88
+ };
89
+ Broker.prototype.subscribe = function (symbols, receiver) {
90
+ return this.market.subscribe(symbols, receiver);
91
+ };
92
+ Broker.prototype.unsubscribe = function (symbols, receiver) {
93
+ return this.market.unsubscribe(symbols, receiver);
94
+ };
95
+ Broker.prototype.placeOrder = function (strategy, symbol, offset, side, volume, price, flag, receiver) {
96
+ for (var _i = 0, _a = this.placeOrderRiskManagers; _i < _a.length; _i++) {
97
+ var placeOrderRiskManager = _a[_i];
98
+ var result = placeOrderRiskManager.onPlaceOrder(symbol, offset, side, volume, price, flag);
99
+ if (typeof result === "boolean") {
100
+ if (!result) {
101
+ strategy.onRisk("place-order-risk");
102
+ receiver.onPlaceOrderError("Risk Rejected");
103
+ return;
104
+ }
105
+ }
106
+ else {
107
+ strategy.onRisk("place-order-risk", result);
108
+ receiver.onPlaceOrderError("Risk Rejected");
109
+ return;
110
+ }
111
+ }
112
+ return this.trader.placeOrder(symbol, offset, side, volume, price, flag, receiver);
113
+ };
114
+ Broker.prototype.cancelOrder = function (strategy, order, receiver) {
115
+ for (var _i = 0, _a = this.cancelOrderRiskManagers; _i < _a.length; _i++) {
116
+ var cancelOrderRiskManager = _a[_i];
117
+ var result = cancelOrderRiskManager.onCancelOrder(order);
118
+ if (typeof result === "boolean") {
119
+ if (!result) {
120
+ strategy.onRisk("cancel-order-risk");
121
+ receiver.onCancelOrderError("Risk Rejected");
122
+ return;
123
+ }
124
+ }
125
+ else {
126
+ strategy.onRisk("cancel-order-risk", result);
127
+ receiver.onCancelOrderError("Risk Rejected");
128
+ return;
129
+ }
130
+ }
131
+ return this.trader.cancelOrder(order, receiver);
132
+ };
133
+ Broker.prototype.getTradingDay = function () {
134
+ return this.trader.getTradingDay();
135
+ };
136
+ Broker.prototype.queryCommissionRate = function (symbol, receiver) {
137
+ return this.trader.queryCommissionRate(symbol, receiver);
138
+ };
139
+ Broker.prototype.queryMarginRate = function (symbol, receiver) {
140
+ return this.trader.queryMarginRate(symbol, receiver);
141
+ };
142
+ Broker.prototype.queryInstrument = function (symbol, receiver) {
143
+ return this.trader.queryInstrument(symbol, receiver);
144
+ };
145
+ Broker.prototype.queryPosition = function (symbol, receiver) {
146
+ return this.trader.queryPosition(symbol, receiver);
147
+ };
148
+ Broker.prototype.queryInstruments = function (receiver) {
149
+ return this.trader.queryInstruments(receiver);
150
+ };
151
+ Broker.prototype.queryTradingAccounts = function (receiver) {
152
+ return this.trader.queryTradingAccounts(receiver);
153
+ };
154
+ Broker.prototype.queryPositions = function (receiver) {
155
+ return this.trader.queryPositions(receiver);
156
+ };
157
+ Broker.prototype.queryPositionDetails = function (receiver) {
158
+ return this.trader.queryPositionDetails(receiver);
159
+ };
160
+ Broker.prototype.queryOrders = function (receiver) {
161
+ return this.trader.queryOrders(receiver);
162
+ };
163
+ return Broker;
164
+ }());
165
+ exports.Broker = Broker;
166
+ var createBroker = function (trader, market, errorReceiver) { return new Broker(trader, market, errorReceiver); };
167
+ exports.createBroker = createBroker;
168
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../src/broker.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -0,0 +1,7 @@
1
+ export * from "./typedef.js";
2
+ export * from "./interfaces.js";
3
+ export * from "./broker.js";
4
+ export * from "./tape.js";
5
+ export * from "./trader.js";
6
+ export * from "./market.js";
7
+ export { CTPUserInfo } from "./provider.js";
package/lib/index.js CHANGED
@@ -1,3 +1,33 @@
1
1
  "use strict";
2
- console.log("High-Frequency Trading in Node.js");
2
+ /*
3
+ * index.ts
4
+ *
5
+ * Copyright (c) 2025 Xiongfei Shi
6
+ *
7
+ * Author: Xiongfei Shi <xiongfei.shi(a)icloud.com>
8
+ * License: Apache-2.0
9
+ *
10
+ * https://github.com/shixiongfei/hft.js
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
24
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
25
+ };
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ __exportStar(require("./typedef.js"), exports);
28
+ __exportStar(require("./interfaces.js"), exports);
29
+ __exportStar(require("./broker.js"), exports);
30
+ __exportStar(require("./tape.js"), exports);
31
+ __exportStar(require("./trader.js"), exports);
32
+ __exportStar(require("./market.js"), exports);
3
33
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,kDAAgC;AAChC,8CAA4B;AAC5B,4CAA0B;AAC1B,8CAA4B;AAC5B,8CAA4B"}
@@ -0,0 +1,8 @@
1
+ import * as hft from ".";
2
+ export type Configure = {
3
+ FlowTdPath: string;
4
+ FlowMdPath: string;
5
+ FrontTdAddrs: string[];
6
+ FrontMdAddrs: string[];
7
+ UserInfo: hft.CTPUserInfo;
8
+ };
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ /*
3
+ * index.test.ts
4
+ *
5
+ * Copyright (c) 2025 Xiongfei Shi
6
+ *
7
+ * Author: Xiongfei Shi <xiongfei.shi(a)icloud.com>
8
+ * License: Apache-2.0
9
+ *
10
+ * https://github.com/shixiongfei/hft.js
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ var __importDefault = (this && this.__importDefault) || function (mod) {
46
+ return (mod && mod.__esModule) ? mod : { "default": mod };
47
+ };
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ var node_fs_1 = __importDefault(require("node:fs"));
50
+ var node_process_1 = require("node:process");
51
+ var hft = __importStar(require("."));
52
+ var existsFile = function (filename) {
53
+ try {
54
+ node_fs_1.default.accessSync(filename);
55
+ return true;
56
+ }
57
+ catch (_a) {
58
+ return false;
59
+ }
60
+ };
61
+ var config = JSON.parse(node_fs_1.default.readFileSync("test.conf.json", "utf8"));
62
+ if (!existsFile(config.FlowTdPath)) {
63
+ node_fs_1.default.mkdirSync(config.FlowTdPath, { recursive: true });
64
+ }
65
+ if (!existsFile(config.FlowMdPath)) {
66
+ node_fs_1.default.mkdirSync(config.FlowMdPath, { recursive: true });
67
+ }
68
+ var Strategy = /** @class */ (function () {
69
+ function Strategy(engine) {
70
+ this.symbol = "ni2505.SHFE";
71
+ this.engine = engine;
72
+ }
73
+ Strategy.prototype.onInit = function (subscriber) {
74
+ var _this = this;
75
+ subscriber.subscribe([this.symbol], this);
76
+ console.log("Strategy init");
77
+ console.log("Trading Day", this.engine.getTradingDay());
78
+ this.engine.queryInstrument(this.symbol, {
79
+ onInstrument: function (instrument) {
80
+ if (!instrument) {
81
+ console.error("Symbol", _this.symbol, "error");
82
+ (0, node_process_1.exit)(1);
83
+ }
84
+ console.log("Instrument", instrument);
85
+ },
86
+ });
87
+ this.engine.queryCommissionRate(this.symbol, {
88
+ onCommissionRate: function (rate) {
89
+ console.log("Commission Rate", rate);
90
+ },
91
+ });
92
+ this.engine.queryMarginRate(this.symbol, {
93
+ onMarginRate: function (rate) {
94
+ console.log("Margin Rate", rate);
95
+ },
96
+ });
97
+ this.engine.queryTradingAccounts({
98
+ onTradingAccounts: function (accounts) {
99
+ console.log("Trading Accounts", accounts);
100
+ },
101
+ });
102
+ this.engine.queryOrders({
103
+ onOrders: function (orders) {
104
+ console.log("Orders", orders);
105
+ },
106
+ });
107
+ this.engine.queryPositionDetails({
108
+ onPositionDetails: function (positionDetails) {
109
+ console.log("Position Details", positionDetails);
110
+ },
111
+ });
112
+ this.engine.queryPositions({
113
+ onPositions: function (positions) {
114
+ console.log("Positions", positions);
115
+ },
116
+ });
117
+ setTimeout(function () {
118
+ if (!_this.lastTick) {
119
+ console.error("Market data is not found");
120
+ return;
121
+ }
122
+ _this.engine.placeOrder(_this, _this.symbol, "open", "long", 1, _this.lastTick.orderBook.asks.price[0], "limit", {
123
+ onPlaceOrderSent: function (receiptId) {
124
+ console.log("Open Place Order Receipt Id", receiptId);
125
+ },
126
+ onPlaceOrderError: function (reason) {
127
+ console.error("Open Place Order Error", reason);
128
+ },
129
+ });
130
+ }, 30 * 1000);
131
+ };
132
+ Strategy.prototype.onDestroy = function (unsubscriber) {
133
+ unsubscriber.unsubscribe([this.symbol], this);
134
+ console.log("Strategy destroy");
135
+ };
136
+ Strategy.prototype.onRisk = function (type, reason) {
137
+ console.log("Trigger Risk Control", type, reason);
138
+ };
139
+ Strategy.prototype.onEntrust = function (order) {
140
+ console.log("Entrust order", order);
141
+ };
142
+ Strategy.prototype.onTrade = function (order, trade) {
143
+ console.log("Order", order, "Traded", trade);
144
+ };
145
+ Strategy.prototype.onFinish = function (order) {
146
+ var _this = this;
147
+ console.log("Finish Order", order);
148
+ setTimeout(function () {
149
+ _this.engine.queryPosition(_this.symbol, {
150
+ onPosition: function (position) {
151
+ if (!position || !_this.lastTick) {
152
+ return;
153
+ }
154
+ var todayLong = position.today.long.position - position.today.long.frozen;
155
+ if (todayLong > 0) {
156
+ _this.engine.placeOrder(_this, _this.symbol, "close-today", "short", todayLong, _this.lastTick.orderBook.bids.price[0], "limit", {
157
+ onPlaceOrderSent: function (receiptId) {
158
+ console.log("Close Place Order Receipt Id", receiptId);
159
+ },
160
+ onPlaceOrderError: function (reason) {
161
+ console.error("Close Place Order Error", reason);
162
+ },
163
+ });
164
+ }
165
+ },
166
+ });
167
+ }, 30 * 1000);
168
+ };
169
+ Strategy.prototype.onCancel = function (order) {
170
+ console.log("Cancel Order", order);
171
+ };
172
+ Strategy.prototype.onReject = function (order) {
173
+ console.log("Reject Order", order);
174
+ };
175
+ Strategy.prototype.onTick = function (tick) {
176
+ //const tape = hft.calcTapeData(tick, this.lastTick);
177
+ //console.log(tick);
178
+ //console.log(tape);
179
+ this.lastTick = tick;
180
+ };
181
+ return Strategy;
182
+ }());
183
+ var trader = hft.createTrader(config.FlowTdPath, config.FrontTdAddrs, config.UserInfo);
184
+ var market = hft.createMarket(config.FlowMdPath, config.FrontMdAddrs, config.UserInfo);
185
+ var enableRecorder = false;
186
+ if (enableRecorder) {
187
+ market.setRecorder({
188
+ onMarketData: function (marketData) {
189
+ console.log(marketData.InstrumentID, marketData.LastPrice);
190
+ },
191
+ }, function (instruments) {
192
+ return instruments
193
+ .filter(function (instrument) { return instrument.productType === "future"; })
194
+ .map(function (instrument) { return instrument.symbol; });
195
+ });
196
+ }
197
+ var broker = hft.createBroker(trader, market, {
198
+ onError: function (error, message) {
199
+ console.error(error, message);
200
+ },
201
+ });
202
+ broker.addStrategy(new Strategy(broker));
203
+ if (!broker.start()) {
204
+ console.error("Broker start failed");
205
+ (0, node_process_1.exit)(1);
206
+ }
207
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { CommissionRate, InstrumentData, MarginRate, OffsetType, OrderData, OrderFlag, PositionData, PositionDetail, ProductType, SideType, TickData, TradeData, TradingAccount } from "./typedef.js";
2
+ export type RiskType = "place-order-risk" | "cancel-order-risk";
3
+ export interface IPlaceOrderRiskManager {
4
+ onPlaceOrder: (symbol: string, offset: OffsetType, side: SideType, volume: number, price: number, flag: OrderFlag) => boolean | string;
5
+ }
6
+ export interface ICancelOrderRiskManager {
7
+ onCancelOrder: (order: OrderData) => boolean | string;
8
+ }
9
+ export interface IRiskManagerReceiver {
10
+ onRisk: (type: RiskType, reason?: string) => void;
11
+ }
12
+ export type ErrorType = "login-error" | "query-order-error" | "query-trade-error" | "query-instrument-error" | "query-margin-rate-error" | "query-commission-rate-error" | "query-accounts-error" | "query-positions-error" | "query-position-details-error";
13
+ export interface IErrorReceiver {
14
+ onError: (error: ErrorType, message: string) => void;
15
+ }
16
+ export interface ILifecycleListener extends IErrorReceiver {
17
+ onOpen: () => void;
18
+ onClose: () => void;
19
+ }
20
+ export interface IOrderReceiver {
21
+ onEntrust: (order: OrderData) => void;
22
+ onTrade: (order: OrderData, trade: TradeData) => void;
23
+ onFinish: (order: OrderData) => void;
24
+ onCancel: (order: OrderData) => void;
25
+ onReject: (order: OrderData) => void;
26
+ }
27
+ export interface IOrdersReceiver {
28
+ onOrders: (orders: OrderData[]) => void;
29
+ }
30
+ export interface ITickReceiver {
31
+ onTick: (tick: TickData) => void;
32
+ }
33
+ export interface ITickSubscriber {
34
+ subscribe: (symbols: string[], receiver: ITickReceiver) => void;
35
+ }
36
+ export interface ITickUnsubscriber {
37
+ unsubscribe: (symbols: string[], receiver: ITickReceiver) => void;
38
+ }
39
+ export interface IStrategy extends IRiskManagerReceiver, IOrderReceiver {
40
+ onInit: (subscriber: ITickSubscriber) => void;
41
+ onDestroy: (unsubscriber: ITickUnsubscriber) => void;
42
+ }
43
+ export interface ICommissionRateReceiver {
44
+ onCommissionRate: (rate: CommissionRate | undefined) => void;
45
+ }
46
+ export interface IMarginRateReceiver {
47
+ onMarginRate: (rate: MarginRate | undefined) => void;
48
+ }
49
+ export interface IInstrumentReceiver {
50
+ onInstrument: (instrument: InstrumentData | undefined) => void;
51
+ }
52
+ export interface IInstrumentsReceiver {
53
+ onInstruments: (instruments: InstrumentData[] | undefined) => void;
54
+ }
55
+ export interface ITradingAccountsReceiver {
56
+ onTradingAccounts: (accounts: TradingAccount[] | undefined) => void;
57
+ }
58
+ export interface IPositionReceiver {
59
+ onPosition: (position: PositionData | undefined) => void;
60
+ }
61
+ export interface IPositionsReceiver {
62
+ onPositions: (positions: PositionData[] | undefined) => void;
63
+ }
64
+ export interface IPositionDetailsReceiver {
65
+ onPositionDetails: (positionDetails: PositionDetail[] | undefined) => void;
66
+ }
67
+ export interface IProvider {
68
+ open: (lifecycle: ILifecycleListener) => boolean;
69
+ close: (lifecycle: ILifecycleListener) => void;
70
+ }
71
+ export interface IOrderEmitter {
72
+ addReceiver: (receiver: IOrderReceiver) => void;
73
+ removeReceiver: (receiver: IOrderReceiver) => void;
74
+ }
75
+ export interface IQueryApi {
76
+ getTradingDay: () => number;
77
+ queryCommissionRate: (symbol: string, receiver: ICommissionRateReceiver) => void;
78
+ queryMarginRate: (symbol: string, receiver: IMarginRateReceiver) => void;
79
+ queryInstrument: (symbol: string, receiver: IInstrumentReceiver) => void;
80
+ queryPosition: (symbol: string, receiver: IPositionReceiver) => void;
81
+ queryInstruments: (receiver: IInstrumentsReceiver, type?: ProductType) => void;
82
+ queryTradingAccounts: (receiver: ITradingAccountsReceiver) => void;
83
+ queryPositions: (receiver: IPositionsReceiver) => void;
84
+ queryPositionDetails: (receiver: IPositionDetailsReceiver) => void;
85
+ queryOrders: (receiver: IOrdersReceiver) => void;
86
+ }
87
+ export interface IMarketRecorderReceiver {
88
+ onMarketData: (marketData: any) => void;
89
+ }
90
+ export type IMarketRecorderSymbols = (instrument: InstrumentData[]) => string[];
91
+ export interface IMarketProvider extends IProvider, ITickSubscriber, ITickUnsubscriber {
92
+ hasRecorder: () => boolean;
93
+ setRecorder: (receiver: IMarketRecorderReceiver, symbols: IMarketRecorderSymbols) => void;
94
+ startRecorder: (instrument: InstrumentData[]) => void;
95
+ stopRecorder: () => void;
96
+ }
97
+ export type IPlaceOrderResultReceiver = {
98
+ onPlaceOrderSent: (receiptId: string) => void;
99
+ onPlaceOrderError: (reason: string) => void;
100
+ };
101
+ export type ICancelOrderResultReceiver = {
102
+ onCancelOrderSent: () => void;
103
+ onCancelOrderError: (reason: string) => void;
104
+ };
105
+ export interface ITraderProvider extends IProvider, IOrderEmitter, IQueryApi {
106
+ placeOrder: (symbol: string, offset: OffsetType, side: SideType, volume: number, price: number, flag: OrderFlag, receiver: IPlaceOrderResultReceiver) => void;
107
+ cancelOrder: (order: OrderData, receiver: ICancelOrderResultReceiver) => void;
108
+ }
109
+ export interface IRuntimeEngine extends IQueryApi, ITickSubscriber, ITickUnsubscriber {
110
+ addStrategy: (strategy: IStrategy) => void;
111
+ removeStrategy: (strategy: IStrategy) => void;
112
+ addPlaceOrderRiskManager: (riskMgr: IPlaceOrderRiskManager) => void;
113
+ addCancelOrderRiskManager: (riskMgr: ICancelOrderRiskManager) => void;
114
+ placeOrder: (strategy: IStrategy, symbol: string, offset: OffsetType, side: SideType, volume: number, price: number, flag: OrderFlag, receiver: IPlaceOrderResultReceiver) => void;
115
+ cancelOrder: (strategy: IStrategy, order: OrderData, receiver: ICancelOrderResultReceiver) => void;
116
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /*
3
+ * interfaces.ts
4
+ *
5
+ * Copyright (c) 2025 Xiongfei Shi
6
+ *
7
+ * Author: Xiongfei Shi <xiongfei.shi(a)icloud.com>
8
+ * License: Apache-2.0
9
+ *
10
+ * https://github.com/shixiongfei/hft.js
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,21 @@
1
+ import { CTPProvider, CTPUserInfo } from "./provider.js";
2
+ import { InstrumentData } from "./typedef.js";
3
+ import { ILifecycleListener, IMarketProvider, IMarketRecorderReceiver, IMarketRecorderSymbols, ITickReceiver } from "./interfaces.js";
4
+ export declare class Market extends CTPProvider implements IMarketProvider {
5
+ private marketApi?;
6
+ private recorder?;
7
+ private recorderSymbols?;
8
+ private readonly recordings;
9
+ private readonly symbols;
10
+ private readonly subscribers;
11
+ constructor(flowMdPath: string, frontMdAddrs: string | string[], userInfo: CTPUserInfo);
12
+ hasRecorder(): boolean;
13
+ setRecorder(receiver: IMarketRecorderReceiver, symbols: IMarketRecorderSymbols): void;
14
+ open(lifecycle: ILifecycleListener): boolean;
15
+ close(lifecycle: ILifecycleListener): void;
16
+ startRecorder(instrument: InstrumentData[]): void;
17
+ stopRecorder(): void;
18
+ subscribe(symbols: string[], receiver: ITickReceiver): void;
19
+ unsubscribe(symbols: string[], receiver: ITickReceiver): void;
20
+ }
21
+ export declare const createMarket: (flowMdPath: string, frontMdAddrs: string | string[], userInfo: CTPUserInfo) => Market;