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 +3 -0
- package/lib/broker.d.ts +33 -0
- package/lib/broker.js +168 -0
- package/lib/broker.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +31 -1
- package/lib/index.js.map +1 -1
- package/lib/index.test.d.ts +8 -0
- package/lib/index.test.js +207 -0
- package/lib/index.test.js.map +1 -0
- package/lib/interfaces.d.ts +116 -0
- package/lib/interfaces.js +13 -0
- package/lib/interfaces.js.map +1 -0
- package/lib/market.d.ts +21 -0
- package/lib/market.js +285 -0
- package/lib/market.js.map +1 -0
- package/lib/provider.d.ts +22 -0
- package/lib/provider.js +107 -0
- package/lib/provider.js.map +1 -0
- package/lib/tape.d.ts +2 -0
- package/lib/tape.js +125 -0
- package/lib/tape.js.map +1 -0
- package/lib/trader.d.ts +71 -0
- package/lib/trader.js +1112 -0
- package/lib/trader.js.map +1 -0
- package/lib/typedef.d.ts +150 -0
- package/lib/typedef.js +13 -0
- package/lib/typedef.js.map +1 -0
- package/package.json +7 -2
- package/src/broker.ts +253 -0
- package/src/index.test.ts +247 -0
- package/src/index.ts +18 -1
- package/src/interfaces.ts +234 -0
- package/src/market.ts +370 -0
- package/src/provider.ts +88 -0
- package/src/tape.ts +169 -0
- package/src/trader.ts +1524 -0
- package/src/typedef.ts +201 -0
package/README.md
CHANGED
package/lib/broker.d.ts
ADDED
|
@@ -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
package/lib/index.js
CHANGED
|
@@ -1,3 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
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,
|
|
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,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"}
|
package/lib/market.d.ts
ADDED
|
@@ -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;
|