wenay-common 1.0.50 → 1.0.52
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.
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FuncTimeWait = exports.funcTimeW = void 0;
|
|
4
|
+
const map = {
|
|
5
|
+
binanceSpot: binanceSpotHistory2(),
|
|
6
|
+
binanceFutures: binanceSpotHistory3()
|
|
7
|
+
};
|
|
8
|
+
function binanceSpotHistory2() {
|
|
9
|
+
return {
|
|
10
|
+
symbols: () => ({})
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function binanceSpotHistory3() {
|
|
14
|
+
return {
|
|
15
|
+
symbols: () => ({})
|
|
16
|
+
};
|
|
17
|
+
}
|
|
4
18
|
function funcTimeW() {
|
|
5
19
|
const dStatic = {};
|
|
6
20
|
const data = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funcTimeWait.js","sourceRoot":"","sources":["../../src/Common/funcTimeWait.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"funcTimeWait.js","sourceRoot":"","sources":["../../src/Common/funcTimeWait.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { tSetHistoryData } from "../LoadBase";
|
|
3
3
|
import { tGetAllData, tSocketInput, tUpDateAllKline } from "../IHistoryBase";
|
|
4
|
-
import { TF } from "../../Common/Time";
|
|
5
4
|
export { LoadQuoteBase } from "../LoadBase";
|
|
6
5
|
type tFetch = any | ((input: any | URL, init?: any | undefined) => Promise<any>);
|
|
7
6
|
type tBinanceSymbolsAllObjs = {
|
|
@@ -83,40 +82,22 @@ export declare function BinanceSocketDCoinMAll(WebSocket: any): (callback: (mas:
|
|
|
83
82
|
}[]) => void, disable: () => boolean, onclose: () => void) => void;
|
|
84
83
|
export declare const BinanceLoadEasySpot: (data?: {
|
|
85
84
|
fetch?: tFetch;
|
|
86
|
-
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<
|
|
87
|
-
bars: tSetHistoryData[];
|
|
88
|
-
tf: TF;
|
|
89
|
-
}>;
|
|
85
|
+
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<tSetHistoryData[]>;
|
|
90
86
|
export declare const BinanceLoadEasyFutures: (data?: {
|
|
91
87
|
fetch?: tFetch;
|
|
92
|
-
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<
|
|
93
|
-
bars: tSetHistoryData[];
|
|
94
|
-
tf: TF;
|
|
95
|
-
}>;
|
|
88
|
+
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<tSetHistoryData[]>;
|
|
96
89
|
export declare const BinanceLoadEasyFuturesM: (data?: {
|
|
97
90
|
fetch?: tFetch;
|
|
98
|
-
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<
|
|
99
|
-
bars: tSetHistoryData[];
|
|
100
|
-
tf: TF;
|
|
101
|
-
}>;
|
|
91
|
+
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<tSetHistoryData[]>;
|
|
102
92
|
export declare const MexcLoadEasyFuturesM: (data?: {
|
|
103
93
|
fetch?: tFetch;
|
|
104
|
-
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<
|
|
105
|
-
bars: tSetHistoryData[];
|
|
106
|
-
tf: TF;
|
|
107
|
-
}>;
|
|
94
|
+
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<tSetHistoryData[]>;
|
|
108
95
|
export declare const GateIoLoadEasySpot: (data?: {
|
|
109
96
|
fetch?: tFetch;
|
|
110
|
-
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<
|
|
111
|
-
bars: tSetHistoryData[];
|
|
112
|
-
tf: TF;
|
|
113
|
-
}>;
|
|
97
|
+
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<tSetHistoryData[]>;
|
|
114
98
|
export declare const USALoadEasyFuturesM: (data?: {
|
|
115
99
|
fetch?: tFetch;
|
|
116
|
-
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<
|
|
117
|
-
bars: tSetHistoryData[];
|
|
118
|
-
tf: TF;
|
|
119
|
-
}>;
|
|
100
|
+
}) => (info: import("../LoadBase").tInfoForLoadHistory) => Promise<tSetHistoryData[]>;
|
|
120
101
|
export declare namespace Test {
|
|
121
102
|
function Test1(): void;
|
|
122
103
|
}
|
|
@@ -8,9 +8,9 @@ export type tSymbol = string;
|
|
|
8
8
|
export type tExchange = string;
|
|
9
9
|
export type tTF = TF;
|
|
10
10
|
export type tSymbolLoadInfo = {
|
|
11
|
-
readonly
|
|
11
|
+
readonly symbol: tSymbol;
|
|
12
12
|
readonly exchangeName?: tExchange;
|
|
13
|
-
readonly tf
|
|
13
|
+
readonly tf: tTF;
|
|
14
14
|
};
|
|
15
15
|
export type tInfoForLoadHistory = tSymbolLoadInfo & {
|
|
16
16
|
time1: Date;
|
|
@@ -53,8 +53,5 @@ type tBinanceLoadBase<Bar> = {
|
|
|
53
53
|
};
|
|
54
54
|
export declare function LoadQuoteBase<Bar>(setting: tBinanceLoadBase<Bar>, data?: {
|
|
55
55
|
fetch?: tFetch3;
|
|
56
|
-
}): (info: tInfoForLoadHistory) => Promise<
|
|
57
|
-
bars: Bar[];
|
|
58
|
-
tf: TF;
|
|
59
|
-
}>;
|
|
56
|
+
}): (info: tInfoForLoadHistory) => Promise<Bar[]>;
|
|
60
57
|
export {};
|
package/lib/Exchange/LoadBase.js
CHANGED
|
@@ -6,44 +6,34 @@ const funcTimeWait_1 = require("../Common/funcTimeWait");
|
|
|
6
6
|
function LoadQuoteBase(setting, data) {
|
|
7
7
|
const { base, maxLoadBars, countConnect, intervalToName } = setting;
|
|
8
8
|
const maxLoadBars2 = setting.maxLoadBars2 ?? maxLoadBars;
|
|
9
|
-
const date = [Date.now()];
|
|
10
9
|
const startMap = new Map();
|
|
11
|
-
let count = 0;
|
|
12
10
|
const keyName = setting.nameKey ?? "loadKey";
|
|
13
11
|
const time = setting.time ?? 60000;
|
|
14
12
|
async function waitLimit() {
|
|
15
|
-
++count;
|
|
16
|
-
const t1 = funcTimeWait_1.FuncTimeWait.byWeight(keyName, setting.maxLoadBars) - (Date.now() - time);
|
|
17
13
|
funcTimeWait_1.FuncTimeWait.add({ type: keyName, weight: 1 });
|
|
14
|
+
const t1 = funcTimeWait_1.FuncTimeWait.byWeight(keyName, setting.maxLoadBars) - (Date.now() - time);
|
|
18
15
|
if (t1 > 0)
|
|
19
16
|
await (0, Common_1.sleepAsync)(t1);
|
|
20
|
-
--count;
|
|
21
|
-
}
|
|
22
|
-
function searchTF(info) {
|
|
23
|
-
let a = intervalToName.length - 1;
|
|
24
|
-
const sec1 = info.tf?.sec ?? 60000;
|
|
25
|
-
for (; a > 0; a--) {
|
|
26
|
-
if (intervalToName[a].time.sec <= sec1 && (sec1 % intervalToName[a].time.sec) == 0)
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
return intervalToName[a];
|
|
30
17
|
}
|
|
18
|
+
const mapTimeToName = new Map(intervalToName.map((e) => [e.time.sec, e]));
|
|
31
19
|
const _fetch = data?.fetch ?? fetch;
|
|
32
20
|
return async (info) => {
|
|
33
|
-
const infoTF =
|
|
34
|
-
let lastTime;
|
|
21
|
+
const infoTF = mapTimeToName.get(info.tf.sec);
|
|
35
22
|
if (!_fetch)
|
|
36
23
|
throw "_fetch - не определен";
|
|
24
|
+
if (!infoTF)
|
|
25
|
+
throw "нет такого таймфрейма";
|
|
26
|
+
let lastTime;
|
|
37
27
|
const nameForMap = info.exchangeName + infoTF.name;
|
|
38
28
|
let leftTime = startMap.get(nameForMap);
|
|
39
29
|
if (!leftTime) {
|
|
40
30
|
await waitLimit();
|
|
41
|
-
leftTime = await setting.funcFistTime({ symbol: info.
|
|
31
|
+
leftTime = await setting.funcFistTime({ symbol: info.symbol, baseURL: base, interval: infoTF.name, fetch: _fetch });
|
|
42
32
|
startMap.set(nameForMap, leftTime);
|
|
43
33
|
}
|
|
44
34
|
const [time1, time2] = [Math.max(info.time1.valueOf(), leftTime.valueOf()), info.time2.valueOf()];
|
|
45
35
|
if (time2 <= time1) {
|
|
46
|
-
return
|
|
36
|
+
return [];
|
|
47
37
|
}
|
|
48
38
|
const arr = [];
|
|
49
39
|
const interval = infoTF.time.valueOf();
|
|
@@ -70,7 +60,7 @@ function LoadQuoteBase(setting, data) {
|
|
|
70
60
|
maxLoadBars: maxLoadBars,
|
|
71
61
|
fetch: _fetch,
|
|
72
62
|
baseURL: base,
|
|
73
|
-
symbol: info.
|
|
63
|
+
symbol: info.symbol,
|
|
74
64
|
interval: infoTF.name,
|
|
75
65
|
startTime: new Date(arr[i]),
|
|
76
66
|
endTime: new Date(arr[i - 1]),
|
|
@@ -80,18 +70,13 @@ function LoadQuoteBase(setting, data) {
|
|
|
80
70
|
return setting.funcLoad(data);
|
|
81
71
|
})());
|
|
82
72
|
}
|
|
83
|
-
if (count > 0) {
|
|
84
|
-
}
|
|
85
73
|
const resulI = await Promise.allSettled(map);
|
|
86
74
|
const result = [];
|
|
87
75
|
resulI.forEach((e, i) => {
|
|
88
76
|
if (e.status == "fulfilled")
|
|
89
77
|
result.unshift(...e.value);
|
|
90
78
|
});
|
|
91
|
-
return
|
|
92
|
-
bars: result,
|
|
93
|
-
tf: infoTF.time
|
|
94
|
-
};
|
|
79
|
+
return result;
|
|
95
80
|
};
|
|
96
81
|
}
|
|
97
82
|
exports.LoadQuoteBase = LoadQuoteBase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadBase.js","sourceRoot":"","sources":["../../src/Exchange/LoadBase.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAG5C,yDAAoD;
|
|
1
|
+
{"version":3,"file":"LoadBase.js","sourceRoot":"","sources":["../../src/Exchange/LoadBase.ts"],"names":[],"mappings":"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"}
|