hft-js 0.0.0 → 0.1.1

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.
@@ -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;
package/lib/market.js ADDED
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+ /*
3
+ * market.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 __extends = (this && this.__extends) || (function () {
13
+ var extendStatics = function (d, b) {
14
+ extendStatics = Object.setPrototypeOf ||
15
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
16
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
17
+ return extendStatics(d, b);
18
+ };
19
+ return function (d, b) {
20
+ if (typeof b !== "function" && b !== null)
21
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
22
+ extendStatics(d, b);
23
+ function __() { this.constructor = d; }
24
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
25
+ };
26
+ })();
27
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
28
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
29
+ if (ar || !(i in from)) {
30
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
31
+ ar[i] = from[i];
32
+ }
33
+ }
34
+ return to.concat(ar || Array.prototype.slice.call(from));
35
+ };
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.createMarket = exports.Market = void 0;
41
+ var napi_ctp_1 = __importDefault(require("napi-ctp"));
42
+ var provider_js_1 = require("./provider.js");
43
+ var isValidPrice = function (x) { return x !== Number.MAX_VALUE && x !== 0; };
44
+ var isValidVolume = function (x) { return x !== Number.MAX_VALUE && x !== 0; };
45
+ var Market = /** @class */ (function (_super) {
46
+ __extends(Market, _super);
47
+ function Market(flowMdPath, frontMdAddrs, userInfo) {
48
+ var _this = _super.call(this, flowMdPath, frontMdAddrs, userInfo) || this;
49
+ _this.recordings = new Set();
50
+ _this.symbols = new Map();
51
+ _this.subscribers = new Map();
52
+ return _this;
53
+ }
54
+ Market.prototype.hasRecorder = function () {
55
+ return !!this.recorder;
56
+ };
57
+ Market.prototype.setRecorder = function (receiver, symbols) {
58
+ this.recorder = receiver;
59
+ this.recorderSymbols = symbols;
60
+ };
61
+ Market.prototype.open = function (lifecycle) {
62
+ var _this = this;
63
+ if (this.marketApi) {
64
+ return true;
65
+ }
66
+ this.marketApi = napi_ctp_1.default.createMarketData(this.flowPath, this.frontAddrs);
67
+ this.marketApi.on(napi_ctp_1.default.MarketDataEvent.FrontConnected, function () {
68
+ _this._withRetry(function () { return _this.marketApi.reqUserLogin(_this.userInfo); });
69
+ });
70
+ var fired = false;
71
+ this.marketApi.on(napi_ctp_1.default.MarketDataEvent.RspUserLogin, function (_, options) {
72
+ if (_this._isErrorResp(lifecycle, options, "login-error")) {
73
+ return;
74
+ }
75
+ var instrumentIds = new Set(__spreadArray(__spreadArray([], Array.from(_this.recordings), true), Object.keys(_this.subscribers), true));
76
+ if (instrumentIds.size > 0) {
77
+ _this._withRetry(function () {
78
+ return _this.marketApi.subscribeMarketData(Array.from(instrumentIds));
79
+ });
80
+ }
81
+ if (!fired) {
82
+ fired = true;
83
+ lifecycle.onOpen();
84
+ }
85
+ });
86
+ this.marketApi.on(napi_ctp_1.default.MarketDataEvent.RtnDepthMarketData, function (depthMarketData) {
87
+ var instrumentId = depthMarketData.InstrumentID;
88
+ if (_this.recorder && _this.recordings.has(instrumentId)) {
89
+ _this.recorder.onMarketData(depthMarketData);
90
+ }
91
+ var symbol = _this.symbols.get(instrumentId);
92
+ if (!symbol) {
93
+ return;
94
+ }
95
+ var receivers = _this.subscribers.get(instrumentId);
96
+ if (!receivers || receivers.length === 0) {
97
+ return;
98
+ }
99
+ var orderBook = {
100
+ asks: { price: [], volume: [] },
101
+ bids: { price: [], volume: [] },
102
+ };
103
+ if (isValidPrice(depthMarketData.AskPrice1) &&
104
+ isValidVolume(depthMarketData.AskVolume1)) {
105
+ orderBook.asks.price.push(depthMarketData.AskPrice1);
106
+ orderBook.asks.volume.push(depthMarketData.AskVolume1);
107
+ if (isValidPrice(depthMarketData.AskPrice2) &&
108
+ isValidVolume(depthMarketData.AskVolume2)) {
109
+ orderBook.asks.price.push(depthMarketData.AskPrice2);
110
+ orderBook.asks.volume.push(depthMarketData.AskVolume2);
111
+ if (isValidPrice(depthMarketData.AskPrice3) &&
112
+ isValidVolume(depthMarketData.AskVolume3)) {
113
+ orderBook.asks.price.push(depthMarketData.AskPrice3);
114
+ orderBook.asks.volume.push(depthMarketData.AskVolume3);
115
+ if (isValidPrice(depthMarketData.AskPrice4) &&
116
+ isValidVolume(depthMarketData.AskVolume4)) {
117
+ orderBook.asks.price.push(depthMarketData.AskPrice4);
118
+ orderBook.asks.volume.push(depthMarketData.AskVolume4);
119
+ if (isValidPrice(depthMarketData.AskPrice5) &&
120
+ isValidVolume(depthMarketData.AskVolume5)) {
121
+ orderBook.asks.price.push(depthMarketData.AskPrice5);
122
+ orderBook.asks.volume.push(depthMarketData.AskVolume5);
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ if (isValidPrice(depthMarketData.BidPrice1) &&
129
+ isValidVolume(depthMarketData.BidVolume1)) {
130
+ orderBook.bids.price.push(depthMarketData.BidPrice1);
131
+ orderBook.bids.volume.push(depthMarketData.BidVolume1);
132
+ if (isValidPrice(depthMarketData.BidPrice2) &&
133
+ isValidVolume(depthMarketData.BidVolume2)) {
134
+ orderBook.bids.price.push(depthMarketData.BidPrice2);
135
+ orderBook.bids.volume.push(depthMarketData.BidVolume2);
136
+ if (isValidPrice(depthMarketData.BidPrice3) &&
137
+ isValidVolume(depthMarketData.BidVolume3)) {
138
+ orderBook.bids.price.push(depthMarketData.BidPrice3);
139
+ orderBook.bids.volume.push(depthMarketData.BidVolume3);
140
+ if (isValidPrice(depthMarketData.BidPrice4) &&
141
+ isValidVolume(depthMarketData.BidVolume4)) {
142
+ orderBook.bids.price.push(depthMarketData.BidPrice4);
143
+ orderBook.bids.volume.push(depthMarketData.BidVolume4);
144
+ if (isValidPrice(depthMarketData.BidPrice5) &&
145
+ isValidVolume(depthMarketData.BidVolume5)) {
146
+ orderBook.bids.price.push(depthMarketData.BidPrice5);
147
+ orderBook.bids.volume.push(depthMarketData.BidVolume5);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ var time = _this._parseTime(depthMarketData.UpdateTime);
154
+ var tick = Object.freeze({
155
+ symbol: symbol,
156
+ date: parseInt(depthMarketData.ActionDay),
157
+ time: time + depthMarketData.UpdateMillisec / 1000,
158
+ tradingDay: parseInt(depthMarketData.TradingDay),
159
+ preOpenInterest: depthMarketData.PreOpenInterest,
160
+ preClose: depthMarketData.PreClosePrice,
161
+ openInterest: depthMarketData.OpenInterest,
162
+ openPrice: depthMarketData.OpenPrice,
163
+ highPrice: depthMarketData.HighestPrice,
164
+ lowPrice: depthMarketData.LowestPrice,
165
+ lastPrice: depthMarketData.LastPrice,
166
+ volume: depthMarketData.Volume,
167
+ amount: depthMarketData.Turnover,
168
+ limits: Object.freeze({
169
+ upper: depthMarketData.UpperLimitPrice,
170
+ lower: depthMarketData.LowerLimitPrice,
171
+ }),
172
+ bandings: Object.freeze({
173
+ upper: depthMarketData.BandingUpperPrice,
174
+ lower: depthMarketData.BandingLowerPrice,
175
+ }),
176
+ orderBook: Object.freeze(orderBook),
177
+ });
178
+ receivers.forEach(function (receiver) { return receiver.onTick(tick); });
179
+ });
180
+ return true;
181
+ };
182
+ Market.prototype.close = function (lifecycle) {
183
+ if (!this.marketApi) {
184
+ return;
185
+ }
186
+ this.marketApi.close();
187
+ this.marketApi = undefined;
188
+ lifecycle.onClose();
189
+ };
190
+ Market.prototype.startRecorder = function (instrument) {
191
+ var _this = this;
192
+ if (!this.recorderSymbols) {
193
+ return;
194
+ }
195
+ var symbols = this.recorderSymbols(instrument);
196
+ var instrumentIds = new Set();
197
+ symbols.forEach(function (symbol) {
198
+ var instrumentId = _this._parseSymbol(symbol)[0];
199
+ if (_this.recordings.has(instrumentId)) {
200
+ return;
201
+ }
202
+ _this.recordings.add(instrumentId);
203
+ if (!_this.subscribers.has(instrumentId)) {
204
+ _this.symbols.set(instrumentId, symbol);
205
+ instrumentIds.add(instrumentId);
206
+ }
207
+ });
208
+ if (instrumentIds.size > 0) {
209
+ this._withRetry(function () { var _a; return (_a = _this.marketApi) === null || _a === void 0 ? void 0 : _a.subscribeMarketData(Array.from(instrumentIds)); });
210
+ }
211
+ };
212
+ Market.prototype.stopRecorder = function () {
213
+ var _this = this;
214
+ if (this.recordings.size === 0) {
215
+ return;
216
+ }
217
+ var instrumentIds = new Set();
218
+ this.recordings.forEach(function (instrumentId) {
219
+ if (!_this.subscribers.has(instrumentId)) {
220
+ _this.symbols.delete(instrumentId);
221
+ instrumentIds.add(instrumentId);
222
+ }
223
+ });
224
+ this.recordings.clear();
225
+ if (instrumentIds.size > 0) {
226
+ this._withRetry(function () { var _a; return (_a = _this.marketApi) === null || _a === void 0 ? void 0 : _a.unsubscribeMarketData(Array.from(instrumentIds)); });
227
+ }
228
+ };
229
+ Market.prototype.subscribe = function (symbols, receiver) {
230
+ var _this = this;
231
+ var instrumentIds = new Set();
232
+ symbols.forEach(function (symbol) {
233
+ var instrumentId = _this._parseSymbol(symbol)[0];
234
+ var receivers = _this.subscribers.get(instrumentId);
235
+ if (receivers) {
236
+ if (!receivers.includes(receiver)) {
237
+ receivers.push(receiver);
238
+ }
239
+ }
240
+ else {
241
+ _this.subscribers.set(instrumentId, [receiver]);
242
+ if (!_this.recordings.has(instrumentId)) {
243
+ _this.symbols.set(instrumentId, symbol);
244
+ instrumentIds.add(instrumentId);
245
+ }
246
+ }
247
+ });
248
+ if (instrumentIds.size > 0) {
249
+ this._withRetry(function () { var _a; return (_a = _this.marketApi) === null || _a === void 0 ? void 0 : _a.subscribeMarketData(Array.from(instrumentIds)); });
250
+ }
251
+ };
252
+ Market.prototype.unsubscribe = function (symbols, receiver) {
253
+ var _this = this;
254
+ var instrumentIds = new Set();
255
+ symbols.forEach(function (symbol) {
256
+ var instrumentId = _this._parseSymbol(symbol)[0];
257
+ var receivers = _this.subscribers.get(instrumentId);
258
+ if (!receivers) {
259
+ return;
260
+ }
261
+ if (receivers.length > 0) {
262
+ var index = receivers.indexOf(receiver);
263
+ if (index < 0) {
264
+ return;
265
+ }
266
+ receivers.splice(index, 1);
267
+ }
268
+ if (receivers.length === 0) {
269
+ _this.subscribers.delete(instrumentId);
270
+ if (!_this.recordings.has(instrumentId)) {
271
+ _this.symbols.delete(instrumentId);
272
+ instrumentIds.add(instrumentId);
273
+ }
274
+ }
275
+ });
276
+ if (instrumentIds.size > 0) {
277
+ this._withRetry(function () { var _a; return (_a = _this.marketApi) === null || _a === void 0 ? void 0 : _a.unsubscribeMarketData(Array.from(instrumentIds)); });
278
+ }
279
+ };
280
+ return Market;
281
+ }(provider_js_1.CTPProvider));
282
+ exports.Market = Market;
283
+ var createMarket = function (flowMdPath, frontMdAddrs, userInfo) { return new Market(flowMdPath, frontMdAddrs, userInfo); };
284
+ exports.createMarket = createMarket;
285
+ //# sourceMappingURL=market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../src/market.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import ctp from "napi-ctp";
2
+ import { ErrorType, ILifecycleListener } from "./interfaces.js";
3
+ export type CTPUserInfo = {
4
+ BrokerID: string;
5
+ UserID: string;
6
+ Password: string;
7
+ InvestorID: string;
8
+ UserProductInfo: string;
9
+ AuthCode: string;
10
+ AppID: string;
11
+ };
12
+ export declare class CTPProvider {
13
+ protected readonly flowPath: string;
14
+ protected readonly frontAddrs: string | string[];
15
+ protected readonly userInfo: CTPUserInfo;
16
+ constructor(flowPath: string, frontAddrs: string | string[], userInfo: CTPUserInfo);
17
+ private _sleep;
18
+ protected _withRetry(request: () => number | undefined, ms?: number): Promise<number | undefined>;
19
+ protected _parseSymbol(symbol: string): [string, string];
20
+ protected _isErrorResp(lifecycle: ILifecycleListener, options: ctp.CallbackOptions, error: ErrorType): boolean;
21
+ protected _parseTime(time: string): number;
22
+ }
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /*
3
+ * provider.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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ var __importDefault = (this && this.__importDefault) || function (mod) {
49
+ return (mod && mod.__esModule) ? mod : { "default": mod };
50
+ };
51
+ Object.defineProperty(exports, "__esModule", { value: true });
52
+ exports.CTPProvider = void 0;
53
+ var napi_ctp_1 = __importDefault(require("napi-ctp"));
54
+ var CTPProvider = /** @class */ (function () {
55
+ function CTPProvider(flowPath, frontAddrs, userInfo) {
56
+ this.flowPath = flowPath;
57
+ this.frontAddrs = frontAddrs;
58
+ this.userInfo = userInfo;
59
+ }
60
+ CTPProvider.prototype._sleep = function (ms) {
61
+ return new Promise(function (resolve) {
62
+ setTimeout(resolve, ms);
63
+ });
64
+ };
65
+ CTPProvider.prototype._withRetry = function (request_1) {
66
+ return __awaiter(this, arguments, void 0, function (request, ms) {
67
+ var retval;
68
+ if (ms === void 0) { ms = 100; }
69
+ return __generator(this, function (_a) {
70
+ switch (_a.label) {
71
+ case 0:
72
+ retval = request();
73
+ if (retval === 0) {
74
+ return [2 /*return*/, napi_ctp_1.default.getLastRequestId()];
75
+ }
76
+ if (-2 !== retval && -3 !== retval) {
77
+ return [2 /*return*/, retval];
78
+ }
79
+ return [4 /*yield*/, this._sleep(ms)];
80
+ case 1:
81
+ _a.sent();
82
+ _a.label = 2;
83
+ case 2: return [3 /*break*/, 0];
84
+ case 3: return [2 /*return*/];
85
+ }
86
+ });
87
+ });
88
+ };
89
+ CTPProvider.prototype._parseSymbol = function (symbol) {
90
+ var _a = symbol.split("."), instrumentId = _a[0], exchangeId = _a[1];
91
+ return [instrumentId, exchangeId];
92
+ };
93
+ CTPProvider.prototype._isErrorResp = function (lifecycle, options, error) {
94
+ if (!options.rspInfo) {
95
+ return false;
96
+ }
97
+ lifecycle.onError(error, "".concat(options.rspInfo.ErrorID, ":").concat(options.rspInfo.ErrorMsg));
98
+ return true;
99
+ };
100
+ CTPProvider.prototype._parseTime = function (time) {
101
+ var _a = time.split(":").map(function (x) { return parseInt(x); }), hour = _a[0], minute = _a[1], second = _a[2];
102
+ return hour * 10000 + minute * 100 + second;
103
+ };
104
+ return CTPProvider;
105
+ }());
106
+ exports.CTPProvider = CTPProvider;
107
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,sDAA2B;AAa3B;IAKE,qBACE,QAAgB,EAChB,UAA6B,EAC7B,QAAqB;QAErB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEO,4BAAM,GAAd,UAAe,EAAU;QACvB,OAAO,IAAI,OAAO,CAAO,UAAC,OAAO;YAC/B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAEe,gCAAU,GAA1B;4DAA2B,OAAiC,EAAE,EAAQ;;YAAR,mBAAA,EAAA,QAAQ;;;;wBAE5D,MAAM,GAAG,OAAO,EAAE,CAAC;wBAEzB,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;4BACjB,sBAAO,kBAAG,CAAC,gBAAgB,EAAE,EAAC;wBAChC,CAAC;wBAED,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;4BACnC,sBAAO,MAAM,EAAC;wBAChB,CAAC;wBAED,qBAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAA;;wBAArB,SAAqB,CAAC;;;;;;;KAEzB;IAES,kCAAY,GAAtB,UAAuB,MAAc;QAC7B,IAAA,KAA6B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAA7C,YAAY,QAAA,EAAE,UAAU,QAAqB,CAAC;QACrD,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC;IAES,kCAAY,GAAtB,UACE,SAA6B,EAC7B,OAA4B,EAC5B,KAAgB;QAEhB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,SAAS,CAAC,OAAO,CACf,KAAK,EACL,UAAG,OAAO,CAAC,OAAO,CAAC,OAAO,cAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAE,CACzD,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAES,gCAAU,GAApB,UAAqB,IAAY;QACzB,IAAA,KAAyB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,QAAQ,CAAC,CAAC,CAAC,EAAX,CAAW,CAAC,EAA/D,IAAI,QAAA,EAAE,MAAM,QAAA,EAAE,MAAM,QAA2C,CAAC;QACvE,OAAO,IAAI,GAAG,KAAK,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;IAC9C,CAAC;IACH,kBAAC;AAAD,CAAC,AA/DD,IA+DC;AA/DY,kCAAW"}
package/lib/tape.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { TapeData, TickData } from "./typedef.js";
2
+ export declare const calcTapeData: (tick: TickData, preTick?: TickData) => TapeData;
package/lib/tape.js ADDED
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /*
3
+ * tape.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.calcTapeData = void 0;
14
+ var calcTapeType = function (volumeDelta, interestDelta) {
15
+ if (interestDelta > 0) {
16
+ return volumeDelta === interestDelta ? "dual-open" : "open";
17
+ }
18
+ if (interestDelta < 0) {
19
+ return volumeDelta + interestDelta === 0 ? "dual-close" : "close";
20
+ }
21
+ if (volumeDelta > 0) {
22
+ return "turnover";
23
+ }
24
+ return "no-deal";
25
+ };
26
+ var calcTapeDirection = function (tick, preTick) {
27
+ var _a, _b, _c, _d, _e, _f;
28
+ var lastPrice = tick.lastPrice;
29
+ if (preTick) {
30
+ var preAskPrice1 = (_a = preTick.orderBook.asks.price[0]) !== null && _a !== void 0 ? _a : Number.MAX_VALUE;
31
+ if (lastPrice >= preAskPrice1) {
32
+ return "up";
33
+ }
34
+ var preBidPrice1 = (_b = preTick.orderBook.bids.price[0]) !== null && _b !== void 0 ? _b : Number.MIN_VALUE;
35
+ if (lastPrice <= preBidPrice1) {
36
+ return "down";
37
+ }
38
+ var askPrice1 = (_c = tick.orderBook.asks.price[0]) !== null && _c !== void 0 ? _c : Number.MAX_VALUE;
39
+ if (lastPrice >= askPrice1) {
40
+ return "up";
41
+ }
42
+ var bidPrice1 = (_d = tick.orderBook.bids.price[0]) !== null && _d !== void 0 ? _d : Number.MIN_VALUE;
43
+ if (lastPrice <= bidPrice1) {
44
+ return "down";
45
+ }
46
+ var prePrice = preTick.lastPrice;
47
+ if (lastPrice > prePrice) {
48
+ return "up";
49
+ }
50
+ if (lastPrice < prePrice) {
51
+ return "down";
52
+ }
53
+ if (bidPrice1 >= preAskPrice1) {
54
+ return "up";
55
+ }
56
+ if (askPrice1 <= preBidPrice1) {
57
+ return "down";
58
+ }
59
+ return "none";
60
+ }
61
+ else {
62
+ var askPrice1 = (_e = tick.orderBook.asks.price[0]) !== null && _e !== void 0 ? _e : Number.MAX_VALUE;
63
+ if (lastPrice >= askPrice1) {
64
+ return "up";
65
+ }
66
+ var bidPrice1 = (_f = tick.orderBook.bids.price[0]) !== null && _f !== void 0 ? _f : Number.MIN_VALUE;
67
+ if (lastPrice <= bidPrice1) {
68
+ return "down";
69
+ }
70
+ if (lastPrice > tick.preClose) {
71
+ return "up";
72
+ }
73
+ if (lastPrice < tick.preClose) {
74
+ return "down";
75
+ }
76
+ return "none";
77
+ }
78
+ };
79
+ var calcTapeStatus = function (tapeType, tapeDirection) {
80
+ if (tapeType === "open" && tapeDirection === "up") {
81
+ return "open-long";
82
+ }
83
+ if (tapeType === "open" && tapeDirection === "down") {
84
+ return "open-short";
85
+ }
86
+ if (tapeType === "close" && tapeDirection === "up") {
87
+ return "close-short";
88
+ }
89
+ if (tapeType === "close" && tapeDirection === "down") {
90
+ return "close-long";
91
+ }
92
+ if (tapeType === "turnover" && tapeDirection === "up") {
93
+ return "turnover-long";
94
+ }
95
+ if (tapeType === "turnover" && tapeDirection === "down") {
96
+ return "turnover-short";
97
+ }
98
+ if (tapeType === "dual-open") {
99
+ return "dual-open";
100
+ }
101
+ if (tapeType === "dual-close") {
102
+ return "dual-close";
103
+ }
104
+ return "invalid";
105
+ };
106
+ var calcTapeData = function (tick, preTick) {
107
+ var _a = preTick
108
+ ? [tick.volume - preTick.volume, tick.openInterest - preTick.openInterest]
109
+ : [tick.volume, tick.openInterest - tick.preOpenInterest], volumeDelta = _a[0], interestDelta = _a[1];
110
+ var tapeType = calcTapeType(volumeDelta, interestDelta);
111
+ var tapeDirection = calcTapeDirection(tick, preTick);
112
+ var tapeStatus = calcTapeStatus(tapeType, tapeDirection);
113
+ return {
114
+ symbol: tick.symbol,
115
+ date: tick.date,
116
+ time: tick.time,
117
+ volumeDelta: volumeDelta,
118
+ interestDelta: interestDelta,
119
+ type: tapeType,
120
+ direction: tapeDirection,
121
+ status: tapeStatus,
122
+ };
123
+ };
124
+ exports.calcTapeData = calcTapeData;
125
+ //# sourceMappingURL=tape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tape.js","sourceRoot":"","sources":["../src/tape.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAUH,IAAM,YAAY,GAAG,UAAC,WAAmB,EAAE,aAAqB;IAC9D,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,WAAW,KAAK,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9D,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,WAAW,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;IACpE,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,IAAM,iBAAiB,GAAG,UACxB,IAAc,EACd,OAAkB;;IAElB,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAEjC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAM,YAAY,GAAG,MAAA,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,SAAS,CAAC;QAEzE,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAM,YAAY,GAAG,MAAA,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,SAAS,CAAC;QAEzE,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,SAAS,CAAC;QAEnE,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,SAAS,CAAC;QAEnE,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;QAEnC,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,SAAS,CAAC;QAEnE,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAI,MAAM,CAAC,SAAS,CAAC;QAEnE,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UACrB,QAAkB,EAClB,aAA4B;IAE5B,IAAI,QAAQ,KAAK,MAAM,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,QAAQ,KAAK,MAAM,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QACpD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QACrD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,QAAQ,KAAK,UAAU,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QACtD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,IAAI,QAAQ,KAAK,UAAU,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QACxD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEK,IAAM,YAAY,GAAG,UAAC,IAAc,EAAE,OAAkB;IACvD,IAAA,KAA+B,OAAO;QAC1C,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1E,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,EAFpD,WAAW,QAAA,EAAE,aAAa,QAE0B,CAAC;IAE5D,IAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,IAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE3D,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,WAAW;QACxB,aAAa,EAAE,aAAa;QAC5B,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,aAAa;QACxB,MAAM,EAAE,UAAU;KACnB,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,YAAY,gBAmBvB"}