@anrmk/str-package 0.2.10 → 0.2.12
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 +0 -1
- package/dist/IBybitSignRequest-cA1RCbDS.d.cts +13 -0
- package/dist/IBybitSignRequest-cA1RCbDS.d.ts +13 -0
- package/dist/chunk-36QZINNQ.js +39 -0
- package/dist/chunk-36QZINNQ.js.map +1 -0
- package/dist/{chunk-F66ICNBF.js → chunk-A26C5LUZ.js} +3 -3
- package/dist/{chunk-F66ICNBF.js.map → chunk-A26C5LUZ.js.map} +1 -1
- package/dist/{chunk-UBUM5Z2U.js → chunk-T23XINGG.js} +48 -10
- package/dist/chunk-T23XINGG.js.map +1 -0
- package/dist/{chunk-AV3OIAHZ.js → chunk-V45RVFQE.js} +16 -3
- package/dist/chunk-V45RVFQE.js.map +1 -0
- package/dist/clients/index.cjs +5 -7
- package/dist/clients/index.cjs.map +1 -1
- package/dist/clients/index.d.cts +3 -2
- package/dist/clients/index.d.ts +3 -2
- package/dist/clients/index.js +3 -2
- package/dist/{enums-Dmg2vIi2.d.ts → enums-CFM0khJf.d.cts} +16 -1
- package/dist/{enums-Dmg2vIi2.d.cts → enums-CFM0khJf.d.ts} +16 -1
- package/dist/index.cjs +46 -105
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +4 -4
- package/dist/providers/bybit/index.cjs +46 -7
- package/dist/providers/bybit/index.cjs.map +1 -1
- package/dist/providers/bybit/index.d.cts +6 -3
- package/dist/providers/bybit/index.d.ts +6 -3
- package/dist/providers/bybit/index.js +2 -1
- package/dist/types/bybit/index.cjs +15 -0
- package/dist/types/bybit/index.cjs.map +1 -1
- package/dist/types/bybit/index.d.cts +137 -112
- package/dist/types/bybit/index.d.ts +137 -112
- package/dist/types/bybit/index.js +1 -1
- package/dist/types/challenge/index.d.cts +94 -46
- package/dist/types/challenge/index.d.ts +94 -46
- package/dist/utils/index.cjs +0 -98
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +2 -18
- package/dist/utils/index.d.ts +2 -18
- package/dist/utils/index.js +3 -3
- package/package.json +1 -6
- package/dist/TChallengeProgress-Cg8bg3uq.d.cts +0 -63
- package/dist/TChallengeProgress-DWLlui_L.d.ts +0 -63
- package/dist/chunk-6R5UUXX4.js +0 -133
- package/dist/chunk-6R5UUXX4.js.map +0 -1
- package/dist/chunk-AV3OIAHZ.js.map +0 -1
- package/dist/chunk-UBUM5Z2U.js.map +0 -1
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { a as IBybitApiKeyVipLevel,
|
|
2
|
-
import { a as TChallengeProgress, b as TChallengeWalletBalance } from '../../TChallengeProgress-DWLlui_L.js';
|
|
3
|
-
export { T as TChallengeClosedPnl } from '../../TChallengeProgress-DWLlui_L.js';
|
|
1
|
+
import { a as IBybitApiKeyVipLevel, I as IBybitAccountType, c as IBybitCoinType } from '../../enums-CFM0khJf.js';
|
|
4
2
|
export { TSyncResponse } from '../index.js';
|
|
5
3
|
|
|
6
4
|
type TChallengeType = "ONE_STEP" | "TWO_STEPS" | "THREE_STEPS";
|
|
@@ -12,22 +10,23 @@ type TChallengeProvider = "BYBIT" | "CLEO" | "TEALSTREET" | "TIGER";
|
|
|
12
10
|
type TChallengeStatus = "ACTIVE" | "EXPIRED" | "COMPLETED" | "FAILED";
|
|
13
11
|
type TChallengeRule = {
|
|
14
12
|
readonly id: string;
|
|
13
|
+
readonly nextRuleId: string | null;
|
|
15
14
|
name: string;
|
|
16
15
|
type: TChallengeType;
|
|
17
16
|
mode: TChallengeMode;
|
|
18
17
|
tradingPeriod: string;
|
|
19
18
|
minTradingDays: number;
|
|
20
|
-
|
|
19
|
+
positionDrawdownPct: number;
|
|
21
20
|
maxLossPct: number;
|
|
22
21
|
minLossPct: number;
|
|
23
22
|
dailyDrawdownPct: number;
|
|
24
23
|
profitTargetPct: number;
|
|
25
24
|
feePolicy: string;
|
|
26
25
|
prohibitedActions: string[];
|
|
27
|
-
|
|
26
|
+
tiers?: TChallengeTier[];
|
|
27
|
+
readonly isActive: boolean;
|
|
28
28
|
readonly createdAt: string;
|
|
29
29
|
readonly updatedAt: string;
|
|
30
|
-
tiers?: TChallengeTier[];
|
|
31
30
|
};
|
|
32
31
|
interface TChallengeRuleGroup {
|
|
33
32
|
label: string;
|
|
@@ -36,16 +35,16 @@ interface TChallengeRuleGroup {
|
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
type TChallengeAccountInfo = {
|
|
39
|
-
challengeId: string;
|
|
38
|
+
readonly challengeId: string;
|
|
40
39
|
unifiedMarginStatus: number;
|
|
41
40
|
marginMode: string;
|
|
42
41
|
isMasterTrader: boolean;
|
|
43
42
|
spotHedgingStatus: "ON" | "OFF";
|
|
44
|
-
updatedAt: string;
|
|
43
|
+
readonly updatedAt: string;
|
|
45
44
|
};
|
|
46
45
|
|
|
47
46
|
type TChallengeApiKeyInfo = {
|
|
48
|
-
challengeId: string;
|
|
47
|
+
readonly challengeId: string;
|
|
49
48
|
bybitApiKeyId: string;
|
|
50
49
|
note: string;
|
|
51
50
|
apiKey: string;
|
|
@@ -55,8 +54,6 @@ type TChallengeApiKeyInfo = {
|
|
|
55
54
|
ips: string[];
|
|
56
55
|
type: number;
|
|
57
56
|
deadlineDay: number;
|
|
58
|
-
expiredAt: string;
|
|
59
|
-
createdAt: string;
|
|
60
57
|
uta: string;
|
|
61
58
|
userId: string;
|
|
62
59
|
inviterId: string;
|
|
@@ -69,11 +66,78 @@ type TChallengeApiKeyInfo = {
|
|
|
69
66
|
kycLevel: number;
|
|
70
67
|
kycRegion: string;
|
|
71
68
|
hasCredentials: boolean;
|
|
69
|
+
readonly expiredAt: string;
|
|
70
|
+
readonly createdAt: string;
|
|
71
|
+
readonly updatedAt: string;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
type TChallengeClosedPnl = {
|
|
75
|
+
readonly id: string;
|
|
76
|
+
readonly challengeId: string;
|
|
77
|
+
symbol: string;
|
|
78
|
+
orderId: string;
|
|
79
|
+
side: string;
|
|
80
|
+
qty: number;
|
|
81
|
+
orderPrice: string;
|
|
82
|
+
orderType: string;
|
|
83
|
+
execType: string;
|
|
84
|
+
closedSize: number;
|
|
85
|
+
cumEntryValue: number;
|
|
86
|
+
avgEntryPrice: number;
|
|
87
|
+
cumExitValue: number;
|
|
88
|
+
avgExitPrice: number;
|
|
89
|
+
closedPnl: number;
|
|
90
|
+
fillCount: number;
|
|
91
|
+
leverage: number;
|
|
92
|
+
createdTime: string;
|
|
93
|
+
updatedTime: string;
|
|
94
|
+
readonly isTradingDayRecord: boolean;
|
|
95
|
+
readonly createdAt: string;
|
|
96
|
+
readonly updatedAt: string;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
type TChallengeWalletBalance = {
|
|
100
|
+
readonly challengeId: string;
|
|
101
|
+
accountType: IBybitAccountType;
|
|
102
|
+
totalEquity: number;
|
|
103
|
+
totalPerpUpl: number;
|
|
104
|
+
totalWalletBalance: number;
|
|
105
|
+
totalAvailableBalance: number;
|
|
106
|
+
capital: number;
|
|
107
|
+
/** Coin-specific balance details */
|
|
108
|
+
equity: number;
|
|
109
|
+
totalPositionMm?: number;
|
|
110
|
+
totalPositionIm?: number;
|
|
111
|
+
usdValue: number;
|
|
112
|
+
unrealisedPnl: number;
|
|
113
|
+
walletBalance: number;
|
|
114
|
+
availableToWithdraw: number;
|
|
115
|
+
cumRealisedPnl?: number;
|
|
116
|
+
bonus?: number;
|
|
117
|
+
coin: string;
|
|
118
|
+
readonly createdAt: string;
|
|
119
|
+
readonly updatedAt: string;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
type TChallengeProgress = {
|
|
123
|
+
readonly challengeId: string;
|
|
124
|
+
totalLoss: number;
|
|
125
|
+
tradingDays: number;
|
|
126
|
+
dailyDrawdown: number;
|
|
127
|
+
profitTarget: number;
|
|
128
|
+
dailyStartingEquity: number;
|
|
129
|
+
dailyStartingUpdatedAt: string;
|
|
130
|
+
dailyMaxEquity: number;
|
|
131
|
+
dailyMinEquity: number;
|
|
132
|
+
dailyMaxUpdatedAt: string;
|
|
133
|
+
dailyMinUpdatedAt: string;
|
|
134
|
+
readonly createdAt: string;
|
|
72
135
|
readonly updatedAt: string;
|
|
73
136
|
};
|
|
74
137
|
|
|
75
138
|
type TChallengePositionInfo = {
|
|
76
|
-
|
|
139
|
+
readonly id: string;
|
|
140
|
+
readonly challengeId: string;
|
|
77
141
|
positionIdx: number;
|
|
78
142
|
riskId: number;
|
|
79
143
|
riskLimitValue: number;
|
|
@@ -107,57 +171,40 @@ type TChallengePositionInfo = {
|
|
|
107
171
|
isReduceOnly: boolean;
|
|
108
172
|
mmrSysUpdatedTime: string | null;
|
|
109
173
|
leverageSysUpdatedTime: string | null;
|
|
110
|
-
updatedAt: string;
|
|
174
|
+
readonly updatedAt: string;
|
|
111
175
|
};
|
|
112
176
|
|
|
113
|
-
type
|
|
114
|
-
id
|
|
115
|
-
challengeId: string;
|
|
116
|
-
ctype: TChallengeType;
|
|
117
|
-
capital: number;
|
|
118
|
-
currency: string;
|
|
119
|
-
ttype: TTradingType;
|
|
120
|
-
ddtype: TDrawdownType;
|
|
177
|
+
type TChallengeBase = {
|
|
178
|
+
readonly id: string;
|
|
121
179
|
readonly status: TChallengeStatus;
|
|
122
180
|
readonly statusDescription: string;
|
|
123
181
|
provider: string;
|
|
182
|
+
capital: number;
|
|
183
|
+
currency: string;
|
|
124
184
|
startDate: string;
|
|
125
185
|
endDate: string;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
hasCredentials: boolean;
|
|
131
|
-
apiKeyHint?: string;
|
|
186
|
+
readonly createdAt: string;
|
|
187
|
+
readonly updatedAt: string;
|
|
188
|
+
};
|
|
189
|
+
type TChallengeItem = TChallengeBase & {
|
|
132
190
|
apiKeyInfo?: TChallengeApiKeyInfo;
|
|
133
191
|
statistics?: TChallengeStatistics;
|
|
134
192
|
progress?: TChallengeProgress;
|
|
135
193
|
rule?: TChallengeRule;
|
|
136
194
|
wallet?: TChallengeWalletBalance;
|
|
137
195
|
};
|
|
138
|
-
type TChallengeListItem = {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
ddtype: TDrawdownType | null;
|
|
144
|
-
readonly status: TChallengeStatus;
|
|
145
|
-
readonly statusDescription: string;
|
|
146
|
-
provider: string;
|
|
147
|
-
startDate: string;
|
|
148
|
-
endDate: string | null;
|
|
196
|
+
type TChallengeListItem = TChallengeBase & {
|
|
197
|
+
statistics?: TChallengeStatistics;
|
|
198
|
+
progress?: TChallengeProgress;
|
|
199
|
+
rule?: TChallengeRule;
|
|
200
|
+
wallet?: TChallengeWalletBalance;
|
|
149
201
|
daysActive: number | null;
|
|
150
202
|
daysRemaining: number | null;
|
|
151
203
|
apiKeyHint?: string;
|
|
152
204
|
hasCredentials: boolean;
|
|
153
|
-
statistics?: TChallengeStatistics | null;
|
|
154
|
-
progress?: TChallengeProgress | null;
|
|
155
|
-
rule?: TChallengeRule | null;
|
|
156
|
-
wallet?: TChallengeWalletBalance | null;
|
|
157
205
|
};
|
|
158
206
|
|
|
159
207
|
type TChallengeStatistics = {
|
|
160
|
-
readonly id: string | null;
|
|
161
208
|
readonly challengeId: string;
|
|
162
209
|
totalClosedTradesCount: number;
|
|
163
210
|
totalClosedTrades: number;
|
|
@@ -170,10 +217,11 @@ type TChallengeStatistics = {
|
|
|
170
217
|
totalLongWins: number;
|
|
171
218
|
totalShortTrades: number;
|
|
172
219
|
totalShortWins: number;
|
|
173
|
-
readonly updatedAt: string;
|
|
174
220
|
loosesRate?: number;
|
|
175
221
|
totalCumEntryValue?: number;
|
|
176
222
|
totalCumExitValue?: number;
|
|
223
|
+
readonly createdAt: string;
|
|
224
|
+
readonly updatedAt: string;
|
|
177
225
|
};
|
|
178
226
|
|
|
179
227
|
type TChallengeTier = {
|
|
@@ -182,9 +230,9 @@ type TChallengeTier = {
|
|
|
182
230
|
capital: TChallengeCapital;
|
|
183
231
|
currency: IBybitCoinType;
|
|
184
232
|
priceUsd: number;
|
|
185
|
-
isActive: boolean;
|
|
233
|
+
readonly isActive: boolean;
|
|
186
234
|
readonly createdAt: string;
|
|
187
235
|
readonly updatedAt: string;
|
|
188
236
|
};
|
|
189
237
|
|
|
190
|
-
export {
|
|
238
|
+
export type { TChallengeAccountInfo, TChallengeApiKeyInfo, TChallengeCapital, TChallengeClosedPnl, TChallengeItem, TChallengeListItem, TChallengeMode, TChallengePositionInfo, TChallengeProgress, TChallengeProvider, TChallengeRule, TChallengeRuleGroup, TChallengeStatistics, TChallengeStatus, TChallengeTier, TChallengeType, TChallengeWalletBalance, TDrawdownType, TTradingType };
|
package/dist/utils/index.cjs
CHANGED
|
@@ -105,109 +105,11 @@ var isSameUtcDay = (left, right) => {
|
|
|
105
105
|
return leftDate.toISOString().slice(0, 10) === rightDate.toISOString().slice(0, 10);
|
|
106
106
|
};
|
|
107
107
|
|
|
108
|
-
// src/utils/challengeHelper.ts
|
|
109
|
-
var createDefaultWallet = (challengeId = "", capital = 0) => ({
|
|
110
|
-
challengeId,
|
|
111
|
-
accountType: "UNIFIED" /* UNIFIED */,
|
|
112
|
-
totalEquity: 0,
|
|
113
|
-
totalPerpUpl: 0,
|
|
114
|
-
totalWalletBalance: 0,
|
|
115
|
-
totalAvailableBalance: 0,
|
|
116
|
-
capital,
|
|
117
|
-
equity: 0,
|
|
118
|
-
usdValue: 0,
|
|
119
|
-
unrealisedPnl: 0,
|
|
120
|
-
walletBalance: 0,
|
|
121
|
-
availableToWithdraw: 0,
|
|
122
|
-
coin: "USDT" /* USDT */,
|
|
123
|
-
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
124
|
-
});
|
|
125
|
-
var createDefaultProgress = (challengeId = "", currentEquity = 0) => ({
|
|
126
|
-
id: (/* @__PURE__ */ new Date()).getTime().toString(),
|
|
127
|
-
challengeId,
|
|
128
|
-
currentEquity,
|
|
129
|
-
totalLoss: 0,
|
|
130
|
-
tradingDays: 0,
|
|
131
|
-
dailyDrawdown: 0,
|
|
132
|
-
profitTarget: 0,
|
|
133
|
-
dailyStartingEquity: 0,
|
|
134
|
-
dailyStartingUpdatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
135
|
-
dailyMaxEquity: 0,
|
|
136
|
-
dailyMinEquity: 0,
|
|
137
|
-
dailyMaxUpdatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
138
|
-
dailyMinUpdatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
139
|
-
});
|
|
140
|
-
var tradingDaysCountCalculation = async (closedPnlData, minPositionSize) => {
|
|
141
|
-
if (!closedPnlData || closedPnlData.length === 0) {
|
|
142
|
-
return 0;
|
|
143
|
-
}
|
|
144
|
-
const closedPnlGrouped = closedPnlData.reduce(
|
|
145
|
-
(acc, trade) => {
|
|
146
|
-
const day = trade.updatedTime.split("T")[0];
|
|
147
|
-
if (!acc[day]) {
|
|
148
|
-
acc[day] = [];
|
|
149
|
-
}
|
|
150
|
-
acc[day].push(trade);
|
|
151
|
-
return acc;
|
|
152
|
-
},
|
|
153
|
-
{}
|
|
154
|
-
);
|
|
155
|
-
return await Object.values(closedPnlGrouped).reduce((count, dayTrades) => {
|
|
156
|
-
const hasQualifyingTrade = dayTrades.some((trade) => {
|
|
157
|
-
const entryValue = trade.cumEntryValue;
|
|
158
|
-
const closedPnL = trade.closedPnl;
|
|
159
|
-
const passesSize = entryValue >= minPositionSize;
|
|
160
|
-
const minRequiredPnL = entryValue * 0.01;
|
|
161
|
-
const passesPnL = Math.abs(closedPnL) >= minRequiredPnL;
|
|
162
|
-
return passesSize && passesPnL;
|
|
163
|
-
});
|
|
164
|
-
return hasQualifyingTrade ? count + 1 : count;
|
|
165
|
-
}, 0);
|
|
166
|
-
};
|
|
167
|
-
var currentDailyEquity = (wallet, progress) => {
|
|
168
|
-
const today = (/* @__PURE__ */ new Date()).toISOString();
|
|
169
|
-
const startDate = (/* @__PURE__ */ new Date()).setUTCHours(0, 0, 0, 0);
|
|
170
|
-
const startDateStr = new Date(startDate).toISOString();
|
|
171
|
-
const { equity, unrealisedPnl } = wallet;
|
|
172
|
-
const {
|
|
173
|
-
dailyStartingEquity,
|
|
174
|
-
dailyMaxEquity,
|
|
175
|
-
dailyMinEquity,
|
|
176
|
-
dailyStartingUpdatedAt,
|
|
177
|
-
dailyMaxUpdatedAt,
|
|
178
|
-
dailyMinUpdatedAt
|
|
179
|
-
} = progress;
|
|
180
|
-
let isSameDay = isSameUtcDay(dailyStartingUpdatedAt, startDateStr);
|
|
181
|
-
const newDailyStartingUpdatedAt = isSameDay ? dailyStartingUpdatedAt : startDateStr;
|
|
182
|
-
const newDailyStartingEquity = isSameDay ? dailyStartingEquity : equity;
|
|
183
|
-
isSameDay = isSameUtcDay(dailyMaxUpdatedAt, today);
|
|
184
|
-
let newMaxUpdatedAt = isSameDay ? dailyMaxUpdatedAt : today;
|
|
185
|
-
const newdailyMaxEquity = Math.max(isSameDay ? dailyMaxEquity : equity, equity);
|
|
186
|
-
isSameDay = isSameUtcDay(dailyMinUpdatedAt, today);
|
|
187
|
-
const newMinUpdatedAt = isSameDay ? dailyMinUpdatedAt : today;
|
|
188
|
-
const newdailyMinEquity = Math.min(isSameDay ? dailyMinEquity : equity, equity);
|
|
189
|
-
const dailyEquityDrawdown = equity - newdailyMaxEquity;
|
|
190
|
-
return {
|
|
191
|
-
currentEquity: equity,
|
|
192
|
-
dailyDrawdown: dailyEquityDrawdown,
|
|
193
|
-
dailyStartingEquity: newDailyStartingEquity,
|
|
194
|
-
dailyStartingUpdatedAt: newDailyStartingUpdatedAt.slice(0, 10),
|
|
195
|
-
dailyMaxEquity: newdailyMaxEquity,
|
|
196
|
-
dailyMaxUpdatedAt: newMaxUpdatedAt,
|
|
197
|
-
dailyMinEquity: newdailyMinEquity,
|
|
198
|
-
dailyMinUpdatedAt: newMinUpdatedAt
|
|
199
|
-
};
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
exports.createDefaultProgress = createDefaultProgress;
|
|
203
|
-
exports.createDefaultWallet = createDefaultWallet;
|
|
204
|
-
exports.currentDailyEquity = currentDailyEquity;
|
|
205
108
|
exports.getBybitTimestamp = getBybitTimestamp;
|
|
206
109
|
exports.isSameUtcDay = isSameUtcDay;
|
|
207
110
|
exports.parseNumber = parseNumber;
|
|
208
111
|
exports.signBybitRequest = signBybitRequest;
|
|
209
112
|
exports.syncBybitServerTime = syncBybitServerTime;
|
|
210
113
|
exports.toIsoDate = toIsoDate;
|
|
211
|
-
exports.tradingDaysCountCalculation = tradingDaysCountCalculation;
|
|
212
114
|
//# sourceMappingURL=index.cjs.map
|
|
213
115
|
//# sourceMappingURL=index.cjs.map
|
package/dist/utils/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/providers/bybit/constants.ts","../../src/providers/bybit/get-server-time.ts","../../src/utils/bybitHelper.ts","../../src/utils/helper.ts","../../src/utils/challengeHelper.ts"],"names":["createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"5000\",\n defaultCoin : \"USDT\"\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}","import { createHmac } from \"crypto\";\nimport { env } from \"node:process\";\nimport { getServerTime } from \"../providers/bybit\";\nimport { BYBIT_CONSTANTS } from \"../providers/bybit/constants\";\nimport type { IBybitSignRequest } from \"../types/bybit\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n\n const payload = `${timestamp}${apiKey}${BYBIT_CONSTANTS.recvWindowTimeoutMs}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const localTimeBefore = Date.now();\n const { result } = await getServerTime();\n\n const serverTime = parseInt(result.timeNano, 10) / 1000000;\n const localTimeAfter = Date.now();\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const estimatedLatency = (localTimeAfter - localTimeBefore) / 2;\n const timeOffset = Math.round(serverTime - (localTimeBefore + estimatedLatency));\n\n return timeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n return String(Date.now() + timeOffset);\n}","export const parseNumber = (\n value: number | string | null | undefined,\n): number | null => {\n if (value === null || value === undefined) {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nexport const toIsoDate = (\n value: string | number | null | undefined,\n): string | null => {\n const parsed = parseNumber(value);\n if (parsed === null || parsed <= 0) {\n return null;\n }\n\n const date = new Date(parsed);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date.toISOString();\n};\n\nexport const isSameUtcDay = (\n left: string | null | undefined,\n right: string | null | undefined,\n): boolean => {\n if (!left || !right) {\n return false;\n }\n\n const normalizedLeft = left.trim();\n const normalizedRight = right.trim();\n\n if (!normalizedLeft || !normalizedRight) {\n return false;\n }\n\n const leftDate = new Date(normalizedLeft);\n const rightDate = new Date(normalizedRight);\n\n if (Number.isNaN(leftDate.getTime()) || Number.isNaN(rightDate.getTime())) {\n return false;\n }\n\n return (\n leftDate.toISOString().slice(0, 10) === rightDate.toISOString().slice(0, 10)\n );\n};\n","import {\n TChallengeClosedPnl,\n TChallengeProgress,\n TChallengeWalletBalance,\n} from \"../types/challenge\";\nimport { IBybitAccountType, IBybitCoinType } from \"../types/bybit/enums\";\nimport { isSameUtcDay } from \"./helper\";\n\nexport const createDefaultWallet = (\n challengeId: string = \"\",\n capital: number = 0,\n): TChallengeWalletBalance =>\n ({\n challengeId,\n accountType: IBybitAccountType.UNIFIED,\n totalEquity: 0,\n totalPerpUpl: 0,\n totalWalletBalance: 0,\n totalAvailableBalance: 0,\n capital,\n\n equity: 0,\n usdValue: 0,\n unrealisedPnl: 0,\n walletBalance: 0,\n availableToWithdraw: 0,\n coin: IBybitCoinType.USDT,\n updatedAt: new Date().toISOString(),\n }) as TChallengeWalletBalance;\n\nexport const createDefaultProgress = (\n challengeId: string = \"\",\n currentEquity: number = 0,\n): TChallengeProgress =>\n ({\n id: new Date().getTime().toString(),\n challengeId,\n currentEquity,\n totalLoss: 0,\n tradingDays: 0,\n dailyDrawdown: 0,\n profitTarget: 0,\n dailyStartingEquity: 0,\n dailyStartingUpdatedAt: new Date().toISOString(),\n dailyMaxEquity: 0,\n dailyMinEquity: 0,\n dailyMaxUpdatedAt: new Date().toISOString(),\n dailyMinUpdatedAt: new Date().toISOString(),\n }) as TChallengeProgress;\n\n // A trading day counts if you open and close at least one trade \n// that day with a position size ≥ 5% of the initial balance and a PnL of ±1% or more.\nexport const tradingDaysCountCalculation = async (\n closedPnlData: TChallengeClosedPnl[] | null,\n minPositionSize: number,\n): Promise<number> => {\n if (!closedPnlData || closedPnlData.length === 0) {\n return 0;\n }\n\n const closedPnlGrouped = closedPnlData.reduce(\n (acc, trade) => {\n const day = trade.updatedTime.split(\"T\")[0];\n if (!acc[day]) {\n acc[day] = [];\n }\n acc[day].push(trade);\n return acc;\n },\n {} as Record<string, TChallengeClosedPnl[]>,\n );\n\n return await Object.values(closedPnlGrouped).reduce((count, dayTrades) => {\n // Check if any trade closed today met the minimum size requirement\n const hasQualifyingTrade = dayTrades.some((trade) => {\n const entryValue = trade.cumEntryValue;\n const closedPnL = trade.closedPnl;\n\n // 1. Position size must be >= 5% of initial balance\n const passesSize = entryValue >= minPositionSize;\n\n // 2. PnL must be >= 1% of the position size itself\n const minRequiredPnL = entryValue * 0.01;\n const passesPnL = Math.abs(closedPnL) >= minRequiredPnL;\n\n return passesSize && passesPnL;\n });\n\n return hasQualifyingTrade ? count + 1 : count;\n }, 0);\n};\n\nexport const currentDailyEquity = (\n wallet: TChallengeWalletBalance,\n progress: TChallengeProgress\n) => {\n const today = new Date().toISOString();\n const startDate = new Date().setUTCHours(0, 0, 0, 0);\n const startDateStr = new Date(startDate).toISOString();\n\n const { equity, unrealisedPnl } = wallet;\n const { dailyStartingEquity, dailyMaxEquity, dailyMinEquity, \n dailyStartingUpdatedAt, dailyMaxUpdatedAt, dailyMinUpdatedAt } = progress;\n \n // Determine if the daily starting equity should be updated based on whether it's a new day\n let isSameDay = isSameUtcDay(dailyStartingUpdatedAt, startDateStr)\n const newDailyStartingUpdatedAt = isSameDay ? dailyStartingUpdatedAt : startDateStr;\n const newDailyStartingEquity = isSameDay ? dailyStartingEquity : equity;\n\n // Determine if the max and min daily equity should be updated based on whether it's a new day\n isSameDay = isSameUtcDay(dailyMaxUpdatedAt, today);\n let newMaxUpdatedAt = isSameDay ? dailyMaxUpdatedAt : today;\n const newdailyMaxEquity = Math.max(isSameDay ? dailyMaxEquity : equity , equity);\n \n // Determine if the min daily equity should be updated based on whether it's a new day\n isSameDay = isSameUtcDay(dailyMinUpdatedAt, today);\n const newMinUpdatedAt = isSameDay ? dailyMinUpdatedAt : today;\n const newdailyMinEquity = Math.min(isSameDay ? dailyMinEquity : equity, equity);\n\n //Trailing Drawdown: The difference between the day’s highest equity and the lowest equity reached afterward, both including unrealized P&L.\n const dailyEquityDrawdown = equity - newdailyMaxEquity;\n \n return {\n currentEquity: equity,\n dailyDrawdown: dailyEquityDrawdown,\n\n dailyStartingEquity: newDailyStartingEquity,\n dailyStartingUpdatedAt: newDailyStartingUpdatedAt.slice(0, 10),\n\n dailyMaxEquity: newdailyMaxEquity,\n dailyMaxUpdatedAt: newMaxUpdatedAt,\n\n dailyMinEquity: newdailyMinEquity,\n dailyMinUpdatedAt: newMinUpdatedAt,\n };\n};"]}
|
|
1
|
+
{"version":3,"sources":["../../src/providers/bybit/constants.ts","../../src/providers/bybit/get-server-time.ts","../../src/utils/bybitHelper.ts","../../src/utils/helper.ts"],"names":["createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["export const BYBIT_CONSTANTS = {\n baseUrl: process.env.BYBIT_BASE_URL || \"https://api-demo.bybit.com\",\n fetchTimeoutMs: Number(process.env.BYBIT_FETCH_TIMEOUT_MS) || 10000,\n recvWindowTimeoutMs: process.env.BYBIT_RECV_WINDOW_TIMEOUT_MS || \"5000\",\n defaultCoin : \"USDT\"\n}","import { BYBIT_CONSTANTS } from \"./constants\";\nimport { IBybitServerTime, IBybitApiResponse } from \"../../types/bybit\";\n\nexport async function getServerTime(): Promise<IBybitApiResponse<IBybitServerTime>> {\n let bybitRes: Response;\n try {\n bybitRes = await fetch(`${BYBIT_CONSTANTS.baseUrl}/v5/market/time`,\n {\n cache: \"no-store\",\n }\n );\n } catch (error) {\n console.error(\"ByBit Server Time network error\", error);\n throw new Error(\"ByBit Server Time network error\", { cause: error });\n }\n\n if (!bybitRes.ok) {\n console.error(\"ByBit Server Time request failed\", bybitRes.status, bybitRes.statusText);\n throw new Error(`ByBit Server Time request failed: ${bybitRes.status}`);\n }\n\n let bybitJson: IBybitApiResponse<IBybitServerTime>;\n\n try {\n bybitJson = (await bybitRes.json()) as IBybitApiResponse<IBybitServerTime>;\n } catch (error) {\n console.error(\"Invalid ByBit Server Time response\", error);\n throw new Error(\"Invalid ByBit Server Time response\", { cause: error });\n }\n\n if (!bybitJson) {\n throw new Error(\"Invalid ByBit Server Time response\");\n }\n\n if (bybitJson.retCode !== 0) {\n console.error(\"ByBit Server Time API error\", bybitJson);\n throw new Error(bybitJson.retMsg ?? \"ByBit server time error\");\n }\n\n return bybitJson;\n}","import { createHmac } from \"crypto\";\nimport { getServerTime } from \"../providers/bybit\";\nimport { BYBIT_CONSTANTS } from \"../providers/bybit/constants\";\nimport type { IBybitSignRequest } from \"../types/bybit\";\n\nexport function signBybitRequest(request: IBybitSignRequest) {\n const { credentials, queryString, timeOffset } = request;\n const { apiSecret, apiKey } = credentials;\n\n const timestamp = getBybitTimestamp(timeOffset);\n\n const payload = `${timestamp}${apiKey}${BYBIT_CONSTANTS.recvWindowTimeoutMs}${queryString ?? \"\"}`;\n const signature = createHmac(\"sha256\", apiSecret)\n .update(payload)\n .digest(\"hex\");\n\n return { signature, timestamp };\n}\n\nexport async function syncBybitServerTime(): Promise<number> {\n const localTimeBefore = Date.now();\n const { result } = await getServerTime();\n\n const serverTime = parseInt(result.timeNano, 10) / 1000000;\n const localTimeAfter = Date.now();\n\n // Estimate the local time at which Bybit generated\n // the response by using the midpoint.\n const estimatedLatency = (localTimeAfter - localTimeBefore) / 2;\n const timeOffset = Math.round(serverTime - (localTimeBefore + estimatedLatency));\n\n return timeOffset;\n}\n\nexport function getBybitTimestamp(timeOffset: number = 0): string {\n return String(Date.now() + timeOffset);\n}","export const parseNumber = (\n value: number | string | null | undefined,\n): number | null => {\n if (value === null || value === undefined) {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nexport const toIsoDate = (\n value: string | number | null | undefined,\n): string | null => {\n const parsed = parseNumber(value);\n if (parsed === null || parsed <= 0) {\n return null;\n }\n\n const date = new Date(parsed);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date.toISOString();\n};\n\nexport const isSameUtcDay = (\n left: string | null | undefined,\n right: string | null | undefined,\n): boolean => {\n if (!left || !right) {\n return false;\n }\n\n const normalizedLeft = left.trim();\n const normalizedRight = right.trim();\n\n if (!normalizedLeft || !normalizedRight) {\n return false;\n }\n\n const leftDate = new Date(normalizedLeft);\n const rightDate = new Date(normalizedRight);\n\n if (Number.isNaN(leftDate.getTime()) || Number.isNaN(rightDate.getTime())) {\n return false;\n }\n\n return (\n leftDate.toISOString().slice(0, 10) === rightDate.toISOString().slice(0, 10)\n );\n};\n"]}
|
package/dist/utils/index.d.cts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { IBybitSignRequest } from '../
|
|
2
|
-
import { a as TChallengeProgress, b as TChallengeWalletBalance, T as TChallengeClosedPnl } from '../TChallengeProgress-Cg8bg3uq.cjs';
|
|
3
|
-
import '../enums-Dmg2vIi2.cjs';
|
|
1
|
+
import { a as IBybitSignRequest } from '../IBybitSignRequest-cA1RCbDS.cjs';
|
|
4
2
|
|
|
5
3
|
declare function signBybitRequest(request: IBybitSignRequest): {
|
|
6
4
|
signature: string;
|
|
@@ -9,22 +7,8 @@ declare function signBybitRequest(request: IBybitSignRequest): {
|
|
|
9
7
|
declare function syncBybitServerTime(): Promise<number>;
|
|
10
8
|
declare function getBybitTimestamp(timeOffset?: number): string;
|
|
11
9
|
|
|
12
|
-
declare const createDefaultWallet: (challengeId?: string, capital?: number) => TChallengeWalletBalance;
|
|
13
|
-
declare const createDefaultProgress: (challengeId?: string, currentEquity?: number) => TChallengeProgress;
|
|
14
|
-
declare const tradingDaysCountCalculation: (closedPnlData: TChallengeClosedPnl[] | null, minPositionSize: number) => Promise<number>;
|
|
15
|
-
declare const currentDailyEquity: (wallet: TChallengeWalletBalance, progress: TChallengeProgress) => {
|
|
16
|
-
currentEquity: number;
|
|
17
|
-
dailyDrawdown: number;
|
|
18
|
-
dailyStartingEquity: number;
|
|
19
|
-
dailyStartingUpdatedAt: string;
|
|
20
|
-
dailyMaxEquity: number;
|
|
21
|
-
dailyMaxUpdatedAt: string;
|
|
22
|
-
dailyMinEquity: number;
|
|
23
|
-
dailyMinUpdatedAt: string;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
10
|
declare const parseNumber: (value: number | string | null | undefined) => number | null;
|
|
27
11
|
declare const toIsoDate: (value: string | number | null | undefined) => string | null;
|
|
28
12
|
declare const isSameUtcDay: (left: string | null | undefined, right: string | null | undefined) => boolean;
|
|
29
13
|
|
|
30
|
-
export {
|
|
14
|
+
export { getBybitTimestamp, isSameUtcDay, parseNumber, signBybitRequest, syncBybitServerTime, toIsoDate };
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { IBybitSignRequest } from '../
|
|
2
|
-
import { a as TChallengeProgress, b as TChallengeWalletBalance, T as TChallengeClosedPnl } from '../TChallengeProgress-DWLlui_L.js';
|
|
3
|
-
import '../enums-Dmg2vIi2.js';
|
|
1
|
+
import { a as IBybitSignRequest } from '../IBybitSignRequest-cA1RCbDS.js';
|
|
4
2
|
|
|
5
3
|
declare function signBybitRequest(request: IBybitSignRequest): {
|
|
6
4
|
signature: string;
|
|
@@ -9,22 +7,8 @@ declare function signBybitRequest(request: IBybitSignRequest): {
|
|
|
9
7
|
declare function syncBybitServerTime(): Promise<number>;
|
|
10
8
|
declare function getBybitTimestamp(timeOffset?: number): string;
|
|
11
9
|
|
|
12
|
-
declare const createDefaultWallet: (challengeId?: string, capital?: number) => TChallengeWalletBalance;
|
|
13
|
-
declare const createDefaultProgress: (challengeId?: string, currentEquity?: number) => TChallengeProgress;
|
|
14
|
-
declare const tradingDaysCountCalculation: (closedPnlData: TChallengeClosedPnl[] | null, minPositionSize: number) => Promise<number>;
|
|
15
|
-
declare const currentDailyEquity: (wallet: TChallengeWalletBalance, progress: TChallengeProgress) => {
|
|
16
|
-
currentEquity: number;
|
|
17
|
-
dailyDrawdown: number;
|
|
18
|
-
dailyStartingEquity: number;
|
|
19
|
-
dailyStartingUpdatedAt: string;
|
|
20
|
-
dailyMaxEquity: number;
|
|
21
|
-
dailyMaxUpdatedAt: string;
|
|
22
|
-
dailyMinEquity: number;
|
|
23
|
-
dailyMinUpdatedAt: string;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
10
|
declare const parseNumber: (value: number | string | null | undefined) => number | null;
|
|
27
11
|
declare const toIsoDate: (value: string | number | null | undefined) => string | null;
|
|
28
12
|
declare const isSameUtcDay: (left: string | null | undefined, right: string | null | undefined) => boolean;
|
|
29
13
|
|
|
30
|
-
export {
|
|
14
|
+
export { getBybitTimestamp, isSameUtcDay, parseNumber, signBybitRequest, syncBybitServerTime, toIsoDate };
|
package/dist/utils/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
export { isSameUtcDay, parseNumber, toIsoDate } from '../chunk-36QZINNQ.js';
|
|
2
|
+
export { getBybitTimestamp, signBybitRequest, syncBybitServerTime } from '../chunk-T23XINGG.js';
|
|
3
|
+
import '../chunk-V45RVFQE.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anrmk/str-package",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
4
4
|
"description": "Shared providers, types, and utils for STR services",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -56,11 +56,6 @@
|
|
|
56
56
|
"import": "./dist/utils/bybitHelper.js",
|
|
57
57
|
"require": "./dist/utils/bybitHelper.cjs"
|
|
58
58
|
},
|
|
59
|
-
"./utils/challengeHelper": {
|
|
60
|
-
"types": "./dist/utils/challengeHelper.d.ts",
|
|
61
|
-
"import": "./dist/utils/challengeHelper.js",
|
|
62
|
-
"require": "./dist/utils/challengeHelper.cjs"
|
|
63
|
-
},
|
|
64
59
|
"./utils/helper": {
|
|
65
60
|
"types": "./dist/utils/helper.d.ts",
|
|
66
61
|
"import": "./dist/utils/helper.js",
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { I as IBybitAccountType } from './enums-Dmg2vIi2.cjs';
|
|
2
|
-
|
|
3
|
-
type TChallengeClosedPnl = {
|
|
4
|
-
challengeId: string;
|
|
5
|
-
symbol: string;
|
|
6
|
-
orderId: string;
|
|
7
|
-
side: string;
|
|
8
|
-
qty: number;
|
|
9
|
-
orderPrice: string;
|
|
10
|
-
orderType: string;
|
|
11
|
-
execType: string;
|
|
12
|
-
closedSize: number;
|
|
13
|
-
cumEntryValue: number;
|
|
14
|
-
avgEntryPrice: number;
|
|
15
|
-
cumExitValue: number;
|
|
16
|
-
avgExitPrice: number;
|
|
17
|
-
closedPnl: number;
|
|
18
|
-
fillCount: number;
|
|
19
|
-
leverage: number;
|
|
20
|
-
createdTime: string;
|
|
21
|
-
updatedTime: string;
|
|
22
|
-
updatedAt: string;
|
|
23
|
-
isTradingDayRecord: boolean;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
type TChallengeWalletBalance = {
|
|
27
|
-
challengeId: string;
|
|
28
|
-
accountType: IBybitAccountType;
|
|
29
|
-
totalEquity: number;
|
|
30
|
-
totalPerpUpl: number;
|
|
31
|
-
totalWalletBalance: number;
|
|
32
|
-
totalAvailableBalance: number;
|
|
33
|
-
capital: number;
|
|
34
|
-
/** Coin-specific balance details */
|
|
35
|
-
equity: number;
|
|
36
|
-
totalPositionMm?: number;
|
|
37
|
-
totalPositionIm?: number;
|
|
38
|
-
usdValue: number;
|
|
39
|
-
unrealisedPnl: number;
|
|
40
|
-
walletBalance: number;
|
|
41
|
-
availableToWithdraw: number;
|
|
42
|
-
cumRealisedPnl?: number;
|
|
43
|
-
bonus?: number;
|
|
44
|
-
coin: string;
|
|
45
|
-
updatedAt: string;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
type TChallengeProgress = {
|
|
49
|
-
id: string | null;
|
|
50
|
-
challengeId: string;
|
|
51
|
-
totalLoss: number;
|
|
52
|
-
tradingDays: number;
|
|
53
|
-
dailyDrawdown: number;
|
|
54
|
-
profitTarget: number;
|
|
55
|
-
dailyStartingEquity: number;
|
|
56
|
-
dailyStartingUpdatedAt: string;
|
|
57
|
-
dailyMaxEquity: number;
|
|
58
|
-
dailyMinEquity: number;
|
|
59
|
-
dailyMaxUpdatedAt: string;
|
|
60
|
-
dailyMinUpdatedAt: string;
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
export type { TChallengeClosedPnl as T, TChallengeProgress as a, TChallengeWalletBalance as b };
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { I as IBybitAccountType } from './enums-Dmg2vIi2.js';
|
|
2
|
-
|
|
3
|
-
type TChallengeClosedPnl = {
|
|
4
|
-
challengeId: string;
|
|
5
|
-
symbol: string;
|
|
6
|
-
orderId: string;
|
|
7
|
-
side: string;
|
|
8
|
-
qty: number;
|
|
9
|
-
orderPrice: string;
|
|
10
|
-
orderType: string;
|
|
11
|
-
execType: string;
|
|
12
|
-
closedSize: number;
|
|
13
|
-
cumEntryValue: number;
|
|
14
|
-
avgEntryPrice: number;
|
|
15
|
-
cumExitValue: number;
|
|
16
|
-
avgExitPrice: number;
|
|
17
|
-
closedPnl: number;
|
|
18
|
-
fillCount: number;
|
|
19
|
-
leverage: number;
|
|
20
|
-
createdTime: string;
|
|
21
|
-
updatedTime: string;
|
|
22
|
-
updatedAt: string;
|
|
23
|
-
isTradingDayRecord: boolean;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
type TChallengeWalletBalance = {
|
|
27
|
-
challengeId: string;
|
|
28
|
-
accountType: IBybitAccountType;
|
|
29
|
-
totalEquity: number;
|
|
30
|
-
totalPerpUpl: number;
|
|
31
|
-
totalWalletBalance: number;
|
|
32
|
-
totalAvailableBalance: number;
|
|
33
|
-
capital: number;
|
|
34
|
-
/** Coin-specific balance details */
|
|
35
|
-
equity: number;
|
|
36
|
-
totalPositionMm?: number;
|
|
37
|
-
totalPositionIm?: number;
|
|
38
|
-
usdValue: number;
|
|
39
|
-
unrealisedPnl: number;
|
|
40
|
-
walletBalance: number;
|
|
41
|
-
availableToWithdraw: number;
|
|
42
|
-
cumRealisedPnl?: number;
|
|
43
|
-
bonus?: number;
|
|
44
|
-
coin: string;
|
|
45
|
-
updatedAt: string;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
type TChallengeProgress = {
|
|
49
|
-
id: string | null;
|
|
50
|
-
challengeId: string;
|
|
51
|
-
totalLoss: number;
|
|
52
|
-
tradingDays: number;
|
|
53
|
-
dailyDrawdown: number;
|
|
54
|
-
profitTarget: number;
|
|
55
|
-
dailyStartingEquity: number;
|
|
56
|
-
dailyStartingUpdatedAt: string;
|
|
57
|
-
dailyMaxEquity: number;
|
|
58
|
-
dailyMinEquity: number;
|
|
59
|
-
dailyMaxUpdatedAt: string;
|
|
60
|
-
dailyMinUpdatedAt: string;
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
export type { TChallengeClosedPnl as T, TChallengeProgress as a, TChallengeWalletBalance as b };
|