Skip to content

Commit 6c3796a

Browse files
committed
demo app
1 parent fda1bf8 commit 6c3796a

File tree

3 files changed

+193
-2
lines changed

3 files changed

+193
-2
lines changed

.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
/src/
2-
/demo/
1+
/src/

demo/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.dotenv

demo/app.js

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
import 'dotenv/config';
2+
import chalk from 'chalk';
3+
import { MexcClient } from '../src/nodejs/MexcClient.js';
4+
import ora from 'ora';
5+
import figlet from 'figlet';
6+
import gradient from 'gradient-string';
7+
8+
async function sleep(ms) {
9+
return new Promise(resolve => setTimeout(resolve, ms));
10+
}
11+
12+
async function showBanner() {
13+
console.clear();
14+
console.log('\n');
15+
16+
figlet.text(`MEXC Futures API Bypass`, {
17+
font: 'Small',
18+
horizontalLayout: 'default',
19+
verticalLayout: 'default'
20+
}, (err, data) => {
21+
if (err) return;
22+
console.log(gradient.pastel.multiline(data));
23+
});
24+
25+
await sleep(100);
26+
console.log(chalk.blueBright(' MEXC Futures API Bypass Demo'));
27+
console.log(chalk.cyanBright(` Author: @aptyp4uk1337 ${chalk.gray('|')} ${new Date().toLocaleString()}\n`));
28+
}
29+
30+
async function main() {
31+
try {
32+
await showBanner();
33+
34+
const spinner = ora({
35+
text: chalk.yellow('Initializing MEXC Client...'),
36+
color: 'yellow'
37+
}).start();
38+
39+
const client = new MexcClient({
40+
apiKey: process.env.API_KEY,
41+
isTestnet: true,
42+
});
43+
44+
await sleep(1000);
45+
spinner.succeed(chalk.green('MEXC Client initialized successfully\n'));
46+
47+
// --- Step 1: Get account info ---
48+
const balanceSpinner = ora(chalk.yellow('Fetching account balance...')).start();
49+
const balance = await client.getAsset({ currency: 'USDT' });
50+
balanceSpinner.succeed(chalk.green('Balance data received\n'));
51+
52+
console.log(chalk.gray('┌──────────────────────────────────────────────┐'));
53+
console.log(chalk.gray('│') + chalk.bold(' ACCOUNT SUMMARY ') + chalk.gray('│'));
54+
console.log(chalk.gray('├──────────────────────────────────────────────┤'));
55+
console.log(chalk.gray('│') + ` 💰 Available: ${chalk.greenBright(`${balance.data.availableBalance.toFixed(2)} USDT`)}${' '.repeat(12)}` + chalk.gray('│'));
56+
console.log(chalk.gray('│') + ` 📊 Unrealized PnL: ${balance.data.unrealized >= 0 ? chalk.greenBright(`${balance.data.unrealized.toFixed(2)}`) : chalk.redBright(`${balance.data.unrealized.toFixed(2)}`)} USDT` + ' '.repeat(5) + chalk.gray('│'));
57+
console.log(chalk.gray('└──────────────────────────────────────────────┘\n'));
58+
59+
// --- Step 2: Open positions ---
60+
const openOrders = [
61+
{ symbol: 'BTC_USDT', side: 1, vol: 15, leverage: 25, emoji: '₿' },
62+
{ symbol: 'ETH_USDT', side: 3, vol: 1, leverage: 10, emoji: 'Ξ' },
63+
{ symbol: 'XRP_USDT', side: 1, vol: 100, leverage: 5, emoji: '✕' },
64+
{ symbol: 'BTC_USDT', side: 3, vol: 50, leverage: 5, stopLossPrice: 112000, takeProfitPrice: 110000, emoji: '₿' },
65+
{ symbol: 'ETH_USDT', side: 3, vol: 5, leverage: 10, stopLossPrice: 3000, takeProfitPrice: 2400, emoji: 'Ξ' },
66+
];
67+
68+
const openedOrderIds = [];
69+
70+
console.log(chalk.blue.bold('🛫 OPENING POSITIONS'));
71+
console.log(chalk.gray('──────────────────────────────────────────────\n'));
72+
73+
for (const order of openOrders) {
74+
const orderSpinner = ora({
75+
text: `${order.emoji} Processing ${order.symbol} ${order.side === 1 ? 'LONG' : 'SHORT'}...`,
76+
color: 'cyan'
77+
}).start();
78+
79+
const params = {
80+
symbol: order.symbol,
81+
type: 5,
82+
side: order.side,
83+
openType: 2,
84+
vol: order.vol,
85+
leverage: order.leverage,
86+
...(order.stopLossPrice && { stopLossPrice: order.stopLossPrice }),
87+
...(order.takeProfitPrice && { takeProfitPrice: order.takeProfitPrice }),
88+
};
89+
90+
const response = await client.createOrder(params);
91+
const orderId = response?.data?.orderId;
92+
if (orderId) openedOrderIds.push(orderId);
93+
94+
await sleep(300);
95+
96+
const direction = order.side === 1 ?
97+
chalk.bgGreen.white(' LONG ') :
98+
chalk.bgRed.white(' SHORT ');
99+
100+
orderSpinner.succeed([
101+
`${direction} ${order.emoji} ${chalk.bold(order.symbol)}`,
102+
`Leverage: ${chalk.yellow(order.leverage + 'x')}`,
103+
`Volume: ${chalk.yellow(order.vol)}`,
104+
order.stopLossPrice ? `SL: ${chalk.red(order.stopLossPrice)}` : '',
105+
order.takeProfitPrice ? `TP: ${chalk.green(order.takeProfitPrice)}` : '',
106+
chalk.gray(`ID: ${orderId}`)
107+
].filter(Boolean).join(' | '));
108+
109+
await sleep(500);
110+
}
111+
112+
// --- Step 3: Cancel some orders ---
113+
console.log(`\n${chalk.magenta.bold('🛑 CANCELLING ORDERS')}`);
114+
console.log(chalk.gray('──────────────────────────────────────────────\n'));
115+
116+
const idsToCancel = openedOrderIds.slice(0, 2);
117+
118+
if (idsToCancel.length > 0) {
119+
const cancelSpinner = ora({
120+
text: `Cancelling ${idsToCancel.length} orders...`,
121+
color: 'magenta'
122+
}).start();
123+
124+
await client.cancelOrders({ ids: idsToCancel });
125+
await sleep(800);
126+
127+
cancelSpinner.succeed([
128+
chalk.gray('Cancelled orders:'),
129+
chalk.yellow(idsToCancel.join(', '))
130+
].join(' '));
131+
} else {
132+
console.log(chalk.yellow('⚠️ No orders available for cancellation'));
133+
}
134+
135+
// --- Step 4: Close positions ---
136+
const closingOrders = [
137+
{ symbol: 'BTC_USDT', side: 4, vol: 15, leverage: 25, emoji: '₿' },
138+
{ symbol: 'ETH_USDT', side: 2, vol: 1, leverage: 10, emoji: 'Ξ' },
139+
];
140+
141+
console.log(`\n${chalk.blue.bold('🛬 CLOSING POSITIONS')}`);
142+
console.log(chalk.gray('──────────────────────────────────────────────\n'));
143+
144+
for (const order of closingOrders) {
145+
const closeSpinner = ora({
146+
text: `${order.emoji} Closing ${order.symbol} position...`,
147+
color: 'blue'
148+
}).start();
149+
150+
const params = {
151+
symbol: order.symbol,
152+
type: 5,
153+
side: order.side,
154+
openType: 2,
155+
vol: order.vol,
156+
leverage: order.leverage,
157+
};
158+
159+
const response = await client.createOrder(params);
160+
const orderId = response?.data?.orderId;
161+
162+
await sleep(500);
163+
closeSpinner.succeed([
164+
`${chalk.bgBlue.white(' CLOSE ')} ${order.emoji} ${chalk.bold(order.symbol)}`,
165+
`Volume: ${chalk.yellow(order.vol)}`,
166+
chalk.gray(`ID: ${orderId}`)
167+
].join(' | '));
168+
}
169+
170+
// --- Final cleanup ---
171+
console.log(`\n${chalk.gray.bold('🧹 FINAL CLEANUP')}`);
172+
console.log(chalk.gray('──────────────────────────────────────────────\n'));
173+
174+
const cleanupSpinner = ora({
175+
text: 'Performing final cleanup...',
176+
color: 'gray'
177+
}).start();
178+
179+
await sleep(2000);
180+
await client.closeAllPositions();
181+
182+
cleanupSpinner.succeed(chalk.green('All positions have been force-closed'));
183+
console.log(`\n${chalk.bold.green('✅ All operations completed successfully!')}\n`);
184+
185+
} catch (error) {
186+
console.error(`\n${chalk.bgRed.white(' ERROR ')} ${chalk.redBright(error.message)}\n`);
187+
process.exit(1);
188+
}
189+
}
190+
191+
main();

0 commit comments

Comments
 (0)