hft-js 0.2.0 → 0.4.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/lib/bar.d.ts +2 -2
- package/lib/bar.js +43 -67
- package/lib/bar.js.map +1 -1
- package/lib/broker.d.ts +5 -4
- package/lib/broker.js +92 -106
- package/lib/broker.js.map +1 -1
- package/lib/index.js +9 -25
- package/lib/index.js.map +1 -1
- package/lib/index.test.d.ts +1 -1
- package/lib/index.test.js +82 -111
- package/lib/index.test.js.map +1 -1
- package/lib/interfaces.d.ts +5 -5
- package/lib/interfaces.js +2 -3
- package/lib/interfaces.js.map +1 -1
- package/lib/market.d.ts +4 -4
- package/lib/market.js +135 -163
- package/lib/market.js.map +1 -1
- package/lib/provider.d.ts +3 -3
- package/lib/provider.js +34 -86
- package/lib/provider.js.map +1 -1
- package/lib/tape.d.ts +1 -1
- package/lib/tape.js +19 -24
- package/lib/tape.js.map +1 -1
- package/lib/trader.d.ts +5 -4
- package/lib/trader.js +501 -510
- package/lib/trader.js.map +1 -1
- package/lib/typedef.d.ts +5 -1
- package/lib/typedef.js +2 -3
- package/lib/typedef.js.map +1 -1
- package/lib/utils.d.ts +2 -2
- package/lib/utils.js +28 -78
- package/lib/utils.js.map +1 -1
- package/package.json +9 -8
- package/src/bar.ts +7 -13
- package/src/broker.ts +11 -21
- package/src/index.test.ts +29 -21
- package/src/index.ts +1 -1
- package/src/interfaces.ts +10 -6
- package/src/market.ts +25 -16
- package/src/provider.ts +8 -8
- package/src/tape.ts +2 -2
- package/src/trader.ts +127 -60
- package/src/typedef.ts +6 -2
- package/src/utils.ts +25 -35
package/lib/index.test.js
CHANGED
|
@@ -1,154 +1,122 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*
|
|
3
2
|
* index.test.ts
|
|
4
3
|
*
|
|
5
|
-
* Copyright (c) 2025 Xiongfei Shi
|
|
4
|
+
* Copyright (c) 2025-2026 Xiongfei Shi
|
|
6
5
|
*
|
|
7
6
|
* Author: Xiongfei Shi <xiongfei.shi(a)icloud.com>
|
|
8
7
|
* License: Apache-2.0
|
|
9
8
|
*
|
|
10
9
|
* https://github.com/shixiongfei/hft.js
|
|
11
10
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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 config = JSON.parse(node_fs_1.default.readFileSync("test.conf.json", "utf8"));
|
|
53
|
-
var Strategy = /** @class */ (function () {
|
|
54
|
-
function Strategy(engine) {
|
|
55
|
-
this.symbol = config.Test.Symbol;
|
|
11
|
+
import process from "node:process";
|
|
12
|
+
import fs from "node:fs";
|
|
13
|
+
import * as hft from "./index.js";
|
|
14
|
+
const config = JSON.parse(fs.readFileSync("test.conf.json", "utf8"));
|
|
15
|
+
class Strategy {
|
|
16
|
+
lastTick;
|
|
17
|
+
lastBar;
|
|
18
|
+
engine;
|
|
19
|
+
symbol = config.Test.Symbol;
|
|
20
|
+
constructor(engine) {
|
|
56
21
|
this.engine = engine;
|
|
57
22
|
}
|
|
58
|
-
|
|
59
|
-
var _this = this;
|
|
23
|
+
onInit() {
|
|
60
24
|
this.engine.subscribe([this.symbol], this);
|
|
61
25
|
this.engine.subscribeBar([this.symbol], this);
|
|
62
26
|
console.log("Strategy init");
|
|
63
27
|
console.log("Trading Day", this.engine.getTradingDay());
|
|
64
28
|
this.engine.queryInstrument(this.symbol, {
|
|
65
|
-
onInstrument:
|
|
29
|
+
onInstrument: (instrument) => {
|
|
66
30
|
if (!instrument) {
|
|
67
|
-
console.error("Symbol",
|
|
68
|
-
|
|
31
|
+
console.error("Symbol", this.symbol, "error");
|
|
32
|
+
process.exit(1);
|
|
69
33
|
}
|
|
70
34
|
console.log("Instrument", instrument);
|
|
71
35
|
},
|
|
72
36
|
});
|
|
73
37
|
this.engine.queryCommissionRate(this.symbol, {
|
|
74
|
-
onCommissionRate:
|
|
38
|
+
onCommissionRate: (rate) => {
|
|
75
39
|
console.log("Commission Rate", rate);
|
|
76
40
|
},
|
|
77
41
|
});
|
|
78
42
|
this.engine.queryMarginRate(this.symbol, {
|
|
79
|
-
onMarginRate:
|
|
43
|
+
onMarginRate: (rate) => {
|
|
80
44
|
console.log("Margin Rate", rate);
|
|
81
45
|
},
|
|
82
46
|
});
|
|
83
47
|
this.engine.queryTradingAccounts({
|
|
84
|
-
onTradingAccounts:
|
|
48
|
+
onTradingAccounts: (accounts) => {
|
|
85
49
|
console.log("Trading Accounts", accounts);
|
|
86
50
|
},
|
|
87
51
|
});
|
|
88
52
|
this.engine.queryOrders({
|
|
89
|
-
onOrders:
|
|
53
|
+
onOrders: (orders) => {
|
|
90
54
|
console.log("Orders", orders);
|
|
91
55
|
},
|
|
92
56
|
});
|
|
93
57
|
this.engine.queryPositionDetails({
|
|
94
|
-
onPositionDetails:
|
|
58
|
+
onPositionDetails: (positionDetails) => {
|
|
95
59
|
console.log("Position Details", positionDetails);
|
|
96
60
|
},
|
|
97
61
|
});
|
|
98
62
|
this.engine.queryPositions({
|
|
99
|
-
onPositions:
|
|
63
|
+
onPositions: (positions) => {
|
|
100
64
|
console.log("Positions", positions);
|
|
101
65
|
},
|
|
102
66
|
});
|
|
103
|
-
setTimeout(
|
|
104
|
-
if (!
|
|
67
|
+
setTimeout(() => {
|
|
68
|
+
if (!this.lastTick) {
|
|
105
69
|
console.error("Market data is not found");
|
|
106
70
|
return;
|
|
107
71
|
}
|
|
108
|
-
if (
|
|
109
|
-
console.log(
|
|
72
|
+
if (this.lastBar) {
|
|
73
|
+
console.log(this.lastBar);
|
|
74
|
+
}
|
|
75
|
+
const price = this.lastTick.orderBook.asks.price[0];
|
|
76
|
+
if (!price) {
|
|
77
|
+
console.error("Invalid price");
|
|
78
|
+
return;
|
|
110
79
|
}
|
|
111
|
-
hft.buyOpen(
|
|
112
|
-
onPlaceOrderSent:
|
|
80
|
+
hft.buyOpen(this.engine, this, this.symbol, 1, price, {
|
|
81
|
+
onPlaceOrderSent: (receiptId) => {
|
|
113
82
|
console.log("Open Place Order Receipt Id", receiptId);
|
|
114
83
|
},
|
|
115
|
-
onPlaceOrderError:
|
|
84
|
+
onPlaceOrderError: (reason) => {
|
|
116
85
|
console.error("Open Place Order Error", reason);
|
|
117
86
|
},
|
|
118
87
|
});
|
|
119
88
|
}, 30 * 1000);
|
|
120
|
-
}
|
|
121
|
-
|
|
89
|
+
}
|
|
90
|
+
onDestroy() {
|
|
122
91
|
this.engine.unsubscribeBar([this.symbol], this);
|
|
123
92
|
this.engine.unsubscribe([this.symbol], this);
|
|
124
93
|
console.log("Strategy destroy");
|
|
125
|
-
}
|
|
126
|
-
|
|
94
|
+
}
|
|
95
|
+
onRisk(type, reason) {
|
|
127
96
|
console.log("Trigger Risk Control", type, reason);
|
|
128
|
-
}
|
|
129
|
-
|
|
97
|
+
}
|
|
98
|
+
onEntrust(order) {
|
|
130
99
|
console.log("Entrust order", order);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
var _this = this;
|
|
100
|
+
}
|
|
101
|
+
onTrade(order, trade) {
|
|
134
102
|
console.log("Order", order, "Traded", trade);
|
|
135
103
|
if (order.status === "filled") {
|
|
136
|
-
setTimeout(
|
|
137
|
-
|
|
138
|
-
onPosition:
|
|
139
|
-
if (!position || !
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
this.engine.queryPosition(this.symbol, {
|
|
106
|
+
onPosition: (position) => {
|
|
107
|
+
if (!position || !this.lastTick) {
|
|
140
108
|
return;
|
|
141
109
|
}
|
|
142
|
-
|
|
110
|
+
const todayLong = position.today.long.position - position.today.long.frozen;
|
|
143
111
|
if (todayLong > 0) {
|
|
144
|
-
if (
|
|
145
|
-
console.log(
|
|
112
|
+
if (this.lastBar) {
|
|
113
|
+
console.log(this.lastBar);
|
|
146
114
|
}
|
|
147
|
-
hft.sellClose(
|
|
148
|
-
onPlaceOrderSent:
|
|
115
|
+
hft.sellClose(this.engine, this, this.symbol, todayLong, 0, true, {
|
|
116
|
+
onPlaceOrderSent: (receiptId) => {
|
|
149
117
|
console.log("Close Place Order Receipt Id", receiptId);
|
|
150
118
|
},
|
|
151
|
-
onPlaceOrderError:
|
|
119
|
+
onPlaceOrderError: (reason) => {
|
|
152
120
|
console.error("Close Place Order Error", reason);
|
|
153
121
|
},
|
|
154
122
|
});
|
|
@@ -157,56 +125,59 @@ var Strategy = /** @class */ (function () {
|
|
|
157
125
|
});
|
|
158
126
|
}, 30 * 1000);
|
|
159
127
|
}
|
|
160
|
-
}
|
|
161
|
-
|
|
128
|
+
}
|
|
129
|
+
onCancel(order) {
|
|
162
130
|
console.log("Cancel Order", order);
|
|
163
|
-
}
|
|
164
|
-
|
|
131
|
+
}
|
|
132
|
+
onReject(order) {
|
|
165
133
|
console.log("Reject Order", order);
|
|
166
|
-
}
|
|
167
|
-
|
|
134
|
+
}
|
|
135
|
+
onTick(tick, tape) {
|
|
168
136
|
//console.log(tick);
|
|
169
137
|
//console.log(tape);
|
|
170
138
|
this.lastTick = tick;
|
|
171
|
-
}
|
|
172
|
-
|
|
139
|
+
}
|
|
140
|
+
onBar(bar) {
|
|
173
141
|
console.log(bar);
|
|
174
142
|
this.lastBar = bar;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
var market = hft.createMarket(config.FlowMdPath, config.FrontMdAddrs, {
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const market = hft.createMarket(config.FlowMdPath, config.FrontMdAddrs, {
|
|
179
146
|
listener: {
|
|
180
|
-
onSubscribed:
|
|
181
|
-
console.log(
|
|
147
|
+
onSubscribed: (symbol) => {
|
|
148
|
+
console.log(`Market subscribed: ${symbol}`);
|
|
182
149
|
},
|
|
183
|
-
onUnsubscribed:
|
|
184
|
-
console.log(
|
|
150
|
+
onUnsubscribed: (symbol) => {
|
|
151
|
+
console.log(`Market unsubscribed: ${symbol}`);
|
|
185
152
|
},
|
|
186
153
|
},
|
|
187
154
|
});
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
155
|
+
const trader = hft.createTrader(config.FlowTdPath, config.FrontTdAddrs, config.UserInfo, { fastQueryLastTick: (instrumentId) => market.getLastTick(instrumentId) });
|
|
156
|
+
const recorder = market.getRecorder();
|
|
157
|
+
const enableRecorder = false;
|
|
191
158
|
if (enableRecorder && recorder) {
|
|
192
159
|
recorder.setRecorder({
|
|
193
|
-
|
|
160
|
+
onOpen: () => {
|
|
161
|
+
console.log("Market Recorder is started");
|
|
162
|
+
},
|
|
163
|
+
onClose: () => {
|
|
164
|
+
console.log("Market Recorder is stopped");
|
|
165
|
+
},
|
|
166
|
+
onMarketData: (marketData) => {
|
|
194
167
|
console.log(marketData.InstrumentID, marketData.LastPrice);
|
|
195
168
|
},
|
|
196
|
-
},
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
.map(function (instrument) { return instrument.symbol; });
|
|
200
|
-
});
|
|
169
|
+
}, (instruments) => instruments
|
|
170
|
+
.filter((instrument) => instrument.productType === "futures")
|
|
171
|
+
.map((instrument) => instrument.symbol));
|
|
201
172
|
}
|
|
202
|
-
|
|
203
|
-
onError
|
|
173
|
+
const broker = hft.createBroker(trader, market, {
|
|
174
|
+
onError(error, message) {
|
|
204
175
|
console.error(error, message);
|
|
205
176
|
},
|
|
206
177
|
});
|
|
207
178
|
broker.addStrategy(new Strategy(broker));
|
|
208
179
|
if (!broker.start()) {
|
|
209
180
|
console.error("Broker start failed");
|
|
210
|
-
|
|
181
|
+
process.exit(1);
|
|
211
182
|
}
|
|
212
183
|
//# sourceMappingURL=index.test.js.map
|
package/lib/index.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
|
package/lib/interfaces.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BarData, CommissionRate, InstrumentData, MarginRate, OffsetType, OrderData, OrderFlag, OrderStatistic, PositionData, PositionDetail, ProductType, SideType, TapeData, TickData, TradeData, TradingAccount } from "./typedef.js";
|
|
1
|
+
import type { BarData, CommissionRate, InstrumentData, MarginRate, OffsetType, OrderData, OrderFlag, OrderStatistic, PositionData, PositionDetail, ProductType, SideType, TapeData, TickData, TradeData, TradingAccount } from "./typedef.js";
|
|
2
2
|
export type RiskType = "place-order-risk" | "cancel-order-risk";
|
|
3
3
|
export interface IPlaceOrderRiskManager {
|
|
4
4
|
onPlaceOrder: (symbol: string, offset: OffsetType, side: SideType, volume: number, price: number, flag: OrderFlag) => boolean | string;
|
|
@@ -13,7 +13,7 @@ export type ErrorType = "login-error" | "query-order-error" | "query-trade-error
|
|
|
13
13
|
export interface IErrorReceiver {
|
|
14
14
|
onError: (error: ErrorType, message: string) => void;
|
|
15
15
|
}
|
|
16
|
-
export interface ILifecycleListener
|
|
16
|
+
export interface ILifecycleListener {
|
|
17
17
|
onOpen: () => void;
|
|
18
18
|
onClose: () => void;
|
|
19
19
|
}
|
|
@@ -74,8 +74,8 @@ export interface IPositionDetailsReceiver {
|
|
|
74
74
|
onPositionDetails: (positionDetails: PositionDetail[] | undefined) => void;
|
|
75
75
|
}
|
|
76
76
|
export interface IProvider {
|
|
77
|
-
open: (lifecycle: ILifecycleListener) => boolean;
|
|
78
|
-
close: (lifecycle: ILifecycleListener) => void;
|
|
77
|
+
open: (lifecycle: ILifecycleListener, errorReceiver: IErrorReceiver) => boolean;
|
|
78
|
+
close: (lifecycle: ILifecycleListener, errorReceiver: IErrorReceiver) => void;
|
|
79
79
|
}
|
|
80
80
|
export interface IOrderEmitter {
|
|
81
81
|
addOrderReceiver: (receiver: IOrderReceiver) => void;
|
|
@@ -95,7 +95,7 @@ export interface IQueryProvider {
|
|
|
95
95
|
queryPositionDetails: (receiver: IPositionDetailsReceiver) => void;
|
|
96
96
|
queryOrders: (receiver: IOrdersReceiver) => void;
|
|
97
97
|
}
|
|
98
|
-
export interface IMarketRecorderReceiver {
|
|
98
|
+
export interface IMarketRecorderReceiver extends ILifecycleListener {
|
|
99
99
|
onMarketData: (marketData: any) => void;
|
|
100
100
|
}
|
|
101
101
|
export type IMarketRecorderSymbols = (instrument: InstrumentData[]) => string[];
|
package/lib/interfaces.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*
|
|
3
2
|
* interfaces.ts
|
|
4
3
|
*
|
|
5
|
-
* Copyright (c) 2025 Xiongfei Shi
|
|
4
|
+
* Copyright (c) 2025-2026 Xiongfei Shi
|
|
6
5
|
*
|
|
7
6
|
* Author: Xiongfei Shi <xiongfei.shi(a)icloud.com>
|
|
8
7
|
* License: Apache-2.0
|
|
9
8
|
*
|
|
10
9
|
* https://github.com/shixiongfei/hft.js
|
|
11
10
|
*/
|
|
12
|
-
|
|
11
|
+
export {};
|
|
13
12
|
//# sourceMappingURL=interfaces.js.map
|
package/lib/interfaces.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
package/lib/market.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { CTPProvider } from "./provider.js";
|
|
2
|
-
import { InstrumentData, OrderBook } from "./typedef.js";
|
|
3
|
-
import { ILifecycleListener, IMarketProvider, IMarketRecorderProvider, IMarketRecorderReceiver, IMarketRecorderSymbols, ITickReceiver } from "./interfaces.js";
|
|
2
|
+
import type { InstrumentData, OrderBook } from "./typedef.js";
|
|
3
|
+
import type { IErrorReceiver, ILifecycleListener, IMarketProvider, IMarketRecorderProvider, IMarketRecorderReceiver, IMarketRecorderSymbols, ITickReceiver } from "./interfaces.js";
|
|
4
4
|
export interface IMarketListener {
|
|
5
5
|
onSubscribed: (symbol: string) => void;
|
|
6
6
|
onUnsubscribed: (symbol: string) => void;
|
|
@@ -40,8 +40,8 @@ export declare class Market extends CTPProvider implements IMarketProvider, IMar
|
|
|
40
40
|
bandings: import("./typedef.js").PriceRange;
|
|
41
41
|
orderBook: OrderBook;
|
|
42
42
|
}> | undefined;
|
|
43
|
-
open(lifecycle: ILifecycleListener): boolean;
|
|
44
|
-
close(lifecycle: ILifecycleListener): void;
|
|
43
|
+
open(lifecycle: ILifecycleListener, errorReceiver: IErrorReceiver): boolean;
|
|
44
|
+
close(lifecycle: ILifecycleListener, _errorReceiver: IErrorReceiver): void;
|
|
45
45
|
startRecorder(instrument: InstrumentData[]): void;
|
|
46
46
|
stopRecorder(): void;
|
|
47
47
|
subscribe(symbols: string[], receiver: ITickReceiver): void;
|