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