Skip to content

kuncle/perp-arbitrage-bot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1 Commit
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Perpetual Arbitrage Bot

่ทจ DEX ๆฐธ็ปญๅˆ็บฆๅฅ—ๅˆฉๆœบๅ™จไบบ๏ผŒ่ฟ่กŒๅœจ Arbitrum ้“พไธŠใ€‚็›‘ๆŽง AZverse DEX ไธŽๅคšไธชๆฐธ็ปญๅˆ็บฆไบคๆ˜“ๆ‰€ไน‹้—ด็š„ไปทๆ ผๅทฎๅผ‚๏ผŒ่‡ชๅŠจๆ‰ง่กŒๅฅ—ๅˆฉไบคๆ˜“ใ€‚

ๅŠŸ่ƒฝ็‰นๆ€ง

  • ๐Ÿ”„ ๅฎžๆ—ถไปทๆ ผ็›‘ๆŽง - WebSocket ่ฟžๆŽฅๅคšไธชไบคๆ˜“ๆ‰€๏ผŒๆฏซ็ง’็บงไปทๆ ผๆ›ดๆ–ฐ
  • ๐ŸŽฏ ๅฅ—ๅˆฉๆœบไผšๆฃ€ๆต‹ - ่‡ชๅŠจ่ฎก็ฎ—ไปทๅทฎใ€ๆ‰‹็ปญ่ดนใ€ๆป‘็‚น๏ผŒ็ญ›้€‰ๆœ‰ๅˆฉๅฏๅ›พ็š„ๆœบไผš
  • โšก ่‡ชๅŠจไบคๆ˜“ๆ‰ง่กŒ - ๅŒๆ—ถๅœจไธคไธชไบคๆ˜“ๆ‰€ๅผ€ไป“๏ผŒๆ•่Žทไปทๅทฎๆ”ถ็›Š
  • ๐Ÿ“Š ไป“ไฝ็ฎก็† - ๅฎžๆ—ถ PnL ็›‘ๆŽง๏ผŒ่‡ชๅŠจๆญข็›ˆๆญขๆŸ
  • ๐Ÿ›ก๏ธ ้ฃŽ้™ฉๆŽงๅˆถ - ไป“ไฝ้™ๅˆถใ€ๆ—ฅไบๆŸ้™ๅˆถใ€ๆœ€ๅคงๆŒไป“ๆ—ถ้—ด
  • ๐Ÿ“ข ๅ‘Š่ญฆ้€š็Ÿฅ - ๆ”ฏๆŒ Telegramใ€Discordใ€Webhook ้€š็Ÿฅ
  • ๐Ÿ’พ ๆ•ฐๆฎๆŒไน…ๅŒ– - MySQL ๅญ˜ๅ‚จไบคๆ˜“่ฎฐๅฝ•ๅ’Œๅކๅฒไปทๆ ผ
  • ๐Ÿ“ˆ ๅ›žๆต‹ๅผ•ๆ“Ž - ๅކๅฒๆ•ฐๆฎ้ชŒ่ฏ็ญ–็•ฅๆœ‰ๆ•ˆๆ€ง

ๆ”ฏๆŒ็š„ไบคๆ˜“ๆ‰€

ไบคๆ˜“ๆ‰€ ็ฑปๅž‹ ็Šถๆ€
AZverse DEX (Arbitrum) โœ… ๅทฒๅฎž็Žฐ
Paradex DEX (Starknet) โœ… ๅทฒๅฎž็Žฐ
Binance Futures CEX โœ… ๅทฒๅฎž็Žฐ

ๅฟซ้€Ÿๅผ€ๅง‹

1. ็Žฏๅขƒ่ฆๆฑ‚

  • Rust 1.70+
  • MySQL 8.0+
  • ็จณๅฎš็š„็ฝ‘็ปœ่ฟžๆŽฅ

2. ๅฎ‰่ฃ…

# ๅ…‹้š†้กน็›ฎ
git clone <repository-url>
cd perp-arbitrage-bot

# ็ผ–่ฏ‘
cargo build --release

3. ้…็ฝฎ

# ๅคๅˆถ้…็ฝฎๆจกๆฟ
cp .env.example .env

# ็ผ–่พ‘้…็ฝฎๆ–‡ไปถ
vim .env

4. ๆ•ฐๆฎๅบ“ๅˆๅง‹ๅŒ–

่ฟ่กŒๅ‰้œ€่ฆๅ…ˆๅˆๅง‹ๅŒ–ๆ•ฐๆฎๅบ“๏ผš

# ๅˆ›ๅปบๆ•ฐๆฎๅบ“
mysql -u root -p -e "CREATE DATABASE arbitrage_bot;"

# ๆ‰ง่กŒๅปบ่กจ่„šๆœฌ
mysql -u root -p arbitrage_bot < migrations/001_init.sql

็จ‹ๅบๅฏๅŠจๆ—ถไนŸไผš่‡ชๅŠจๆฃ€ๆŸฅๅนถๅˆ›ๅปบ็ผบๅคฑ็š„่กจใ€‚

5. ่ฟ่กŒ

# Dry Run ๆจกๅผ (ๅช่ง‚ๅฏŸ๏ผŒไธไบคๆ˜“)
DRY_RUN=true cargo run --release

# ๆญฃๅผไบคๆ˜“ๆจกๅผ
DRY_RUN=false cargo run --release

Docker ้ƒจ็ฝฒ

ไฝฟ็”จ Docker Compose (ๆŽจ่)

# ๅคๅˆถ้…็ฝฎๆ–‡ไปถ
cp .env.example .env
# ็ผ–่พ‘้…็ฝฎ
vim .env

# ๅฏๅŠจๆœๅŠก (ๅŒ…ๅซ MySQL)
docker-compose up -d

# ๆŸฅ็œ‹ๆ—ฅๅฟ—
docker-compose logs -f arbitrage-bot

# ๅœๆญขๆœๅŠก
docker-compose down

ๅ•็‹ฌๆž„ๅปบ้•œๅƒ

# ๆž„ๅปบ้•œๅƒ
docker build -t perp-arbitrage-bot .

# ่ฟ่กŒ (้œ€่ฆๅค–้ƒจ MySQL)
docker run -d \
  --name arbitrage-bot \
  --env-file .env \
  -e DB_HOST=host.docker.internal \
  perp-arbitrage-bot

็”Ÿไบง็Žฏๅขƒ้ƒจ็ฝฒ

# ไฝฟ็”จ็”Ÿไบง้…็ฝฎ
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

้…็ฝฎ่ฏดๆ˜Ž

่ฟ่กŒๆจกๅผ

# ่ฎพ็ฝฎไธบ true ๅฏ็”จ่ง‚ๅฏŸๆจกๅผ๏ผŒๅช่พ“ๅ‡บๆœบไผšไธๆ‰ง่กŒไบคๆ˜“
DRY_RUN=true

AZverse ้…็ฝฎ (ๅฟ…้œ€)

AZVERSE_WS_URL=wss://fstream.azverse.xyz/ws/market?type=SYMBOL
AZVERSE_API_URL=https://app.azverse.xyz/fapi
AZVERSE_TOKEN=your_token          # ไปŽๆต่งˆๅ™จ Cookie ่Žทๅ–
AZVERSE_CLIENT_CODE=your_code     # ไปŽๆต่งˆๅ™จ Cookie ่Žทๅ–
AZVERSE_SESSION_ID=your_session   # JSESSIONID

่Žทๅ– AZverse ๅ‡ญ่ฏ:

  1. ็™ปๅฝ• https://app.azverse.xyz
  2. ๆ‰“ๅผ€ๆต่งˆๅ™จๅผ€ๅ‘่€…ๅทฅๅ…ท (F12)
  3. ๅœจ Application > Cookies ไธญๆ‰พๅˆฐ token, client-code, JSESSIONID

Binance Futures ้…็ฝฎ

BINANCE_WS_URL=wss://fstream.binance.com/stream?streams=btcusdt@bookTicker/ethusdt@bookTicker
BINANCE_API_URL=https://fapi.binance.com
BINANCE_API_KEY=your_api_key
BINANCE_API_SECRET=your_api_secret
BINANCE_ENABLED=true
BINANCE_MAKER_FEE=0.02
BINANCE_TAKER_FEE=0.04

Paradex ้…็ฝฎ

PARADEX_WS_URL=wss://ws.api.prod.paradex.trade/v1?cancel-on-disconnect=false
PARADEX_API_URL=https://api.prod.paradex.trade/v1
PARADEX_ENABLED=true
PARADEX_MAKER_FEE=0.02
PARADEX_TAKER_FEE=0.05

Paradex ่ฏดๆ˜Ž:

  • WebSocket ไฝฟ็”จ JSON-RPC ๆ ผๅผ
  • ไบคๆ˜“ๅฏนๆ ผๅผ: BTC-USD-PERP, ETH-USD-PERP
  • ่‡ชๅŠจ่ฎข้˜… order_book ้ข‘้“่Žทๅ–ๆœ€ไผ˜ไนฐๅ–ไปท
  • ๆ— ้œ€ API Key ๅณๅฏ่Žทๅ–่กŒๆƒ…ๆ•ฐๆฎ (ไบคๆ˜“้œ€่ฆ)

้ฃŽ้™ฉๅ‚ๆ•ฐ

# ๅ•ไธชไบคๆ˜“ๅฏนๆœ€ๅคงไป“ไฝ (USD)
MAX_POSITION_SIZE_USD=10000

# ๆ€ปๆ•žๅฃไธŠ้™ (USD)
MAX_TOTAL_EXPOSURE_USD=50000

# ๆ—ฅไบๆŸ้™ๅˆถ (USD) - ่ถ…่ฟ‡ๅŽๆš‚ๅœไบคๆ˜“
DAILY_LOSS_LIMIT_USD=1000

# ๆญขๆŸ็™พๅˆ†ๆฏ”
STOP_LOSS_PERCENT=2.0

# ๆœ€ๅคงๆŒไป“ๆ—ถ้—ด (็ง’) - ่ถ…่ฟ‡ๅŽๅผบๅˆถๅนณไป“
MAX_POSITION_DURATION_SECS=3600

ๅฅ—ๅˆฉๅ‚ๆ•ฐ

# ๆœ€ๅฐไปทๅทฎ้˜ˆๅ€ผ (%) - ไฝŽไบŽๆญคๅ€ผไธๅผ€ไป“
MIN_SPREAD_PERCENT=0.1

# ๅนณไป“ไปทๅทฎ้˜ˆๅ€ผ (%) - ไปทๅทฎๆ”ถๆ•›ๅˆฐๆญคๅ€ผๆ—ถๅนณไป“
EXIT_SPREAD_PERCENT=0.02

# ๅ‘Š่ญฆไปทๅทฎ้˜ˆๅ€ผ (%)
ALERT_SPREAD_PERCENT=0.05

# ไบคๆ˜“ๅฏนๅˆ—่กจ
TRADING_PAIRS=BTC_USDT,ETH_USDT

ๅ‘Š่ญฆ้…็ฝฎ

# Telegram
TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_CHAT_ID=your_chat_id

# Discord
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...

# ๅ‘Š่ญฆ้ข‘็އ้™ๅˆถ (ๆฏๅˆ†้’Ÿ)
ALERT_RATE_LIMIT=10

ๆ•ฐๆฎๅบ“้…็ฝฎ

DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=your_password
DB_DATABASE=arbitrage_bot

่ฟ่กŒๆจกๅผ

Dry Run ๆจกๅผ (ๆŽจ่ๅ…ˆไฝฟ็”จ)

ๅช็›‘ๆŽงไปทๆ ผๅ’Œๆฃ€ๆต‹ๆœบไผš๏ผŒไธๆ‰ง่กŒๅฎž้™…ไบคๆ˜“ใ€‚็”จไบŽ้ชŒ่ฏ็ญ–็•ฅๅ’Œ้…็ฝฎใ€‚

DRY_RUN=true cargo run --release

่พ“ๅ‡บ็คบไพ‹:

INFO ๐Ÿ” DRY RUN MODE ENABLED
INFO ๐Ÿ“Š Price: AZverse BTC_USDT | bid=50000.00 ask=50010.00 mid=50005.00
INFO ๐Ÿ“Š Price: Binance BTC_USDT | bid=50050.00 ask=50060.00 mid=50055.00
INFO ๐ŸŽฏ OPPORTUNITY: BTC_USDT | spread=0.10% | net_profit=$15.00 | long@AZverse short@Binance
INFO    โ””โ”€ [DRY RUN] Would execute: BUY on AZverse, SELL on Binance | size=$10000.00

ๆญฃๅผไบคๆ˜“ๆจกๅผ

DRY_RUN=false cargo run --release

ๅฅ—ๅˆฉ็ญ–็•ฅ่ฏดๆ˜Ž

ๅทฅไฝœๅŽŸ็†

  1. ไปทๆ ผ็›‘ๆŽง: ้€š่ฟ‡ WebSocket ๅฎžๆ—ถ่Žทๅ–ๅ„ไบคๆ˜“ๆ‰€ไปทๆ ผ
  2. ๆœบไผšๆฃ€ๆต‹: ๅฝ“ AZverse ไธŽๅฏนๅ†ฒไบคๆ˜“ๆ‰€ไปทๅทฎ่ถ…่ฟ‡้˜ˆๅ€ผๆ—ถ่งฆๅ‘
  3. ๆ–นๅ‘ๅˆคๆ–ญ:
    • AZverse ไปทๆ ผไฝŽ โ†’ ๅœจ AZverse ๅผ€ๅคš๏ผŒๅฏนๅ†ฒไบคๆ˜“ๆ‰€ๅผ€็ฉบ
    • AZverse ไปทๆ ผ้ซ˜ โ†’ ๅœจ AZverse ๅผ€็ฉบ๏ผŒๅฏนๅ†ฒไบคๆ˜“ๆ‰€ๅผ€ๅคš
  4. ๅˆฉๆถฆ่ฎก็ฎ—: ๅ‡€ๅˆฉๆถฆ = ๆฏ›ๅˆฉๆถฆ - ๆ‰‹็ปญ่ดน - Gas่ดน - ๆป‘็‚น
  5. ๅนณไป“ๆ—ถๆœบ:
    • ไปทๅทฎๆ”ถๆ•›ๅˆฐ้€€ๅ‡บ้˜ˆๅ€ผ
    • ่พพๅˆฐๆญข็›ˆ/ๆญขๆŸ
    • ่ถ…่ฟ‡ๆœ€ๅคงๆŒไป“ๆ—ถ้—ด

้ฃŽ้™ฉๆ็คบ

โš ๏ธ ้‡่ฆ: ๅฅ—ๅˆฉไบคๆ˜“ๅญ˜ๅœจ้ฃŽ้™ฉ๏ผŒๅŒ…ๆ‹ฌไฝ†ไธ้™ไบŽ:

  • ไปทๆ ผๅ‰ง็ƒˆๆณขๅŠจๅฏผ่‡ดไบๆŸ
  • ไบคๆ˜“ๆ‰€ API ๆ•…้šœ
  • ็ฝ‘็ปœๅปถ่ฟŸๅฏผ่‡ดๆ‰ง่กŒๅคฑ่ดฅ
  • ๆตๅŠจๆ€งไธ่ถณๅฏผ่‡ดๆป‘็‚น่ฟ‡ๅคง

ๅปบ่ฎฎ:

  1. ๅ…ˆไฝฟ็”จ Dry Run ๆจกๅผ่ง‚ๅฏŸ
  2. ไปŽๅฐไป“ไฝๅผ€ๅง‹
  3. ่ฎพ็ฝฎๅˆ็†็š„ๆญขๆŸ
  4. ็›‘ๆŽง็ณป็ปŸ่ฟ่กŒ็Šถๆ€

ๅ›žๆต‹

ๅ›žๆต‹ๅผ•ๆ“Ž็”จไบŽๅœจๅކๅฒๆ•ฐๆฎไธŠ้ชŒ่ฏ็ญ–็•ฅๆ•ˆๆžœใ€‚

่ฟ่กŒๅ›žๆต‹

# ไฝฟ็”จ้ป˜่ฎคๅ‚ๆ•ฐ่ฟ่กŒๅ›žๆต‹๏ผˆไฝฟ็”จๆจกๆ‹Ÿๆ•ฐๆฎ๏ผ‰
cargo run --bin backtest

# ่‡ชๅฎšไน‰ๅ‚ๆ•ฐ
cargo run --bin backtest -- \
  --start-date 2024-01-01 \
  --end-date 2024-12-31 \
  --capital 50000 \
  --min-spread 0.15 \
  --exit-spread 0.03 \
  --position-size 5

# ่ฟ่กŒๅ‚ๆ•ฐไผ˜ๅŒ–ๆ‰ซๆ
cargo run --bin backtest -- --sweep

ๅ›žๆต‹ๅ‚ๆ•ฐ

ๅ‚ๆ•ฐ ่ฏดๆ˜Ž ้ป˜่ฎคๅ€ผ
--start-date ๅผ€ๅง‹ๆ—ฅๆœŸ (YYYY-MM-DD) 30ๅคฉๅ‰
--end-date ็ป“ๆŸๆ—ฅๆœŸ (YYYY-MM-DD) ไปŠๅคฉ
--capital ๅˆๅง‹่ต„้‡‘ (USD) 10000
--min-spread ๆœ€ๅฐไปทๅทฎ้˜ˆๅ€ผ (%) 0.1
--exit-spread ๅนณไป“ไปทๅทฎ้˜ˆๅ€ผ (%) 0.02
--position-size ไป“ไฝๅคงๅฐ (% of capital) 10
--sweep ่ฟ่กŒๅ‚ๆ•ฐไผ˜ๅŒ–ๆ‰ซๆ -

ๅ›žๆต‹่พ“ๅ‡บ

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                     Backtest Results                         โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Performance Summary                                          โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Initial Capital:     $    10000.00                          โ•‘
โ•‘ Final Capital:       $    12500.00                          โ•‘
โ•‘ Total Return:               25.00%                          โ•‘
โ•‘ Total PnL:           $     2500.00                          โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Trade Statistics                                             โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Total Trades:                 150                            โ•‘
โ•‘ Winning Trades:               120                            โ•‘
โ•‘ Losing Trades:                 30                            โ•‘
โ•‘ Win Rate:                   80.00%                          โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Risk Metrics                                                 โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Max Drawdown:        $      500.00                          โ•‘
โ•‘ Sharpe Ratio:                2.50                           โ•‘
โ•‘ Profit Factor:               3.20                           โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

ไฝฟ็”จ็œŸๅฎžๆ•ฐๆฎๅ›žๆต‹

  1. ๅ…ˆ่ฟ่กŒ bot ๆ”ถ้›†ๅކๅฒไปทๆ ผๆ•ฐๆฎๅˆฐๆ•ฐๆฎๅบ“
  2. ไฟฎๆ”น src/bin/backtest.rs ไธญ็š„ generate_demo_price_data ๅ‡ฝๆ•ฐ๏ผŒๆ”นไธบไปŽๆ•ฐๆฎๅบ“ๅŠ ่ฝฝ๏ผš
// ไปŽๆ•ฐๆฎๅบ“ๅŠ ่ฝฝไปทๆ ผๆ•ฐๆฎ
let price_data = data_store.get_price_history(
    "BTC_USDT",
    "AZverse", 
    config.start_date,
    config.end_date
).await?;

ไฝŽๆˆๆœฌๅˆท้‡ (Volume Farming)

ๅœจ AZverse ๅ’Œ Paradex ไน‹้—ด่ฟ›่กŒไฝŽๆˆๆœฌไบคๆ˜“้‡ๅˆทๅ–๏ผŒไฝฟ็”จ้™ไปทๅ• (Maker) ้™ไฝŽๆ‰‹็ปญ่ดนใ€‚

ๆˆๆœฌๅˆ†ๆž

่ดน็”จ็ฑปๅž‹ AZverse Paradex ่ฏดๆ˜Ž
Maker ่ดน็އ 0.02% 0.02% ้™ไปทๅ•ๆˆไบค
Taker ่ดน็އ 0.05% 0.05% ๅธ‚ไปทๅ•ๆˆไบค
ๅพ€่ฟ”ๆˆๆœฌ (Maker) - - 0.08%

ไฝฟ็”จ Maker ๅ•ๅฏๅฐ†ๆˆๆœฌไปŽ 0.20% ้™่‡ณ 0.08%๏ผŒๅˆท $10,000 ไบคๆ˜“้‡่Š‚็œ $12ใ€‚

่ฟ่กŒๅˆท้‡ๅ›žๆต‹

# ้ป˜่ฎค้…็ฝฎๅ›žๆต‹ (7ๅคฉๆจกๆ‹Ÿๆ•ฐๆฎ)
cargo run --bin volume_farming

# ่‡ชๅฎšไน‰ๅ‚ๆ•ฐ
cargo run --bin volume_farming -- \
  --min-spread 0.08 \
  --exit-spread 0.02 \
  --position-size 1000 \
  --max-hold 600 \
  --days 14

# ๅ‚ๆ•ฐไผ˜ๅŒ–ๆ‰ซๆ (ๆ‰พๆœ€ไผ˜้…็ฝฎ)
cargo run --bin volume_farming -- --sweep

# ไฝฟ็”จ้ข„่ฎพๆจกๅผ
cargo run --bin volume_farming -- --mode minimum_cost   # ๆœ€ไฝŽๆˆๆœฌๆจกๅผ
cargo run --bin volume_farming -- --mode aggressive     # ๆฟ€่ฟ›ๅˆท้‡ๆจกๅผ

# ไฝฟ็”จ็œŸๅฎžๆ•ฐๆฎๅ›žๆต‹ (้œ€่ฆๅ…ˆๆ”ถ้›†ๆ•ฐๆฎ)
cargo run --bin volume_farming -- --real-data --days 7

ๅˆท้‡ๅ‚ๆ•ฐ

ๅ‚ๆ•ฐ ่ฏดๆ˜Ž ้ป˜่ฎคๅ€ผ
--min-spread ๆœ€ๅฐไปทๅทฎๅผ€ไป“้˜ˆๅ€ผ (%) 0.10
--exit-spread ไปทๅทฎๆ”ถๆ•›ๅนณไป“้˜ˆๅ€ผ (%) 0.02
--position-size ๅ•็ฌ”ไป“ไฝๅคงๅฐ (USD) 500
--max-hold ๆœ€ๅคงๆŒไป“ๆ—ถ้—ด (็ง’) 300
--cooldown ไบคๆ˜“ๅ†ทๅดๆ—ถ้—ด (็ง’) 30
--days ๅ›žๆต‹ๅคฉๆ•ฐ 7
--mode ้ข„่ฎพๆจกๅผ: default/minimum_cost/aggressive default
--sweep ่ฟ่กŒๅ‚ๆ•ฐไผ˜ๅŒ–ๆ‰ซๆ -
--real-data ไฝฟ็”จๆ•ฐๆฎๅบ“ไธญ็š„็œŸๅฎžๆ•ฐๆฎ ๅฆ (้ป˜่ฎคๆจกๆ‹Ÿๆ•ฐๆฎ)

ๆ•ฐๆฎๆฅๆบ่ฏดๆ˜Ž

ๅ›žๆต‹ๆ”ฏๆŒไธค็งๆ•ฐๆฎๆฅๆบ๏ผš

ๆ•ฐๆฎ็ฑปๅž‹ ่ฏดๆ˜Ž ้€‚็”จๅœบๆ™ฏ
ๆจกๆ‹Ÿๆ•ฐๆฎ (้ป˜่ฎค) ้šๆœบ็”Ÿๆˆ็š„ไปทๆ ผๆ•ฐๆฎ๏ผŒ8% ๆฆ‚็އไบง็”Ÿไปทๅทฎๆœบไผš ๅฟซ้€Ÿ้ชŒ่ฏ็ญ–็•ฅ้€ป่พ‘
็œŸๅฎžๆ•ฐๆฎ (--real-data) ไปŽๆ•ฐๆฎๅบ“ price_snapshots ่กจ่ฏปๅ– ๅ‡†็กฎ่ฏ„ไผฐ็ญ–็•ฅๆ•ˆๆžœ

ไฝฟ็”จ็œŸๅฎžๆ•ฐๆฎๅ›žๆต‹

  1. ๅ…ˆ่ฟ่กŒ bot ๆ”ถ้›†ๅކๅฒไปทๆ ผๆ•ฐๆฎ:

    # ไปฅ Dry Run ๆจกๅผ่ฟ่กŒ๏ผŒๅชๆ”ถ้›†ๆ•ฐๆฎไธไบคๆ˜“
    DRY_RUN=true cargo run --release
  2. ็กฎไฟๆ•ฐๆฎๅบ“ไธญๆœ‰ๆ•ฐๆฎ:

    • ๆ•ฐๆฎๅญ˜ๅ‚จๅœจ price_snapshots ่กจ
    • ้œ€่ฆ AZverse ๅ’Œ Paradex ็š„ไปทๆ ผๆ•ฐๆฎ
    • ๅปบ่ฎฎ่‡ณๅฐ‘ๆ”ถ้›† 1-2 ๅคฉ็š„ๆ•ฐๆฎ
  3. ่ฟ่กŒ็œŸๅฎžๆ•ฐๆฎๅ›žๆต‹:

    cargo run --bin volume_farming -- --real-data --days 7

โš ๏ธ ๆณจๆ„: ๅฆ‚ๆžœๆ•ฐๆฎๅบ“ไธญๆฒกๆœ‰่ถณๅคŸ็š„ๅކๅฒๆ•ฐๆฎ๏ผŒๅ›žๆต‹ไผš่‡ชๅŠจๅ›ž้€€ๅˆฐๆจกๆ‹Ÿๆ•ฐๆฎใ€‚

ๆŽจ่้…็ฝฎ (ๅŸบไบŽๅ›žๆต‹)

# .env ๅˆท้‡้…็ฝฎ
MIN_SPREAD_PERCENT=0.06
EXIT_SPREAD_PERCENT=0.02
MAX_POSITION_SIZE_USD=500
MAX_POSITION_DURATION_SECS=600

ๅ›žๆต‹่พ“ๅ‡บ็คบไพ‹

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘              Volume Farming Backtest Results                 โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Volume Statistics                                            โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Total Trades:                3845                            โ•‘
โ•‘ Total Volume:        $ 3845000.00                          โ•‘
โ•‘ Avg Volume/Trade:    $    1000.00                          โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Cost Analysis                                                โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Total Fees Paid:     $    1538.00                          โ•‘
โ•‘ Spread PnL:          $    1125.27                          โ•‘
โ•‘ Net PnL:             $    -412.73                          โ•‘
โ•‘ Cost per $1000 Vol:  $     0.5073                          โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Trade Performance                                            โ•‘
โ• โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•ฃ
โ•‘ Win Rate:                    51.8%                          โ•‘
โ•‘ Avg Spread Captured:      -0.1314%                          โ•‘
โ•‘ Avg Hold Time:                143s                          โ•‘
โ•‘ Spread Closes:               3136                            โ•‘
โ•‘ Timeout Closes:               522                            โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

โœ… ๅˆท $100 ไธ‡ไบคๆ˜“้‡ๆˆๆœฌ็บฆ $507 (0.05%)

็ญ–็•ฅ่ฏดๆ˜Ž

  1. ๅผ€ไป“ๆกไปถ: ๅฝ“ AZverse ไธŽ Paradex ไปทๅทฎ่ถ…่ฟ‡้˜ˆๅ€ผๆ—ถ
  2. ๅฏนๅ†ฒๆ–นๅผ: ไปทๆ ผไฝŽ็š„ไบคๆ˜“ๆ‰€ๅšๅคš๏ผŒไปทๆ ผ้ซ˜็š„ๅš็ฉบ
  3. ๅนณไป“ๆกไปถ:
    • ไปทๅทฎๆ”ถๆ•›ๅˆฐ้€€ๅ‡บ้˜ˆๅ€ผ (็›ˆๅˆฉๅนณไป“)
    • ่ถ…่ฟ‡ๆœ€ๅคงๆŒไป“ๆ—ถ้—ด (่ถ…ๆ—ถๅนณไป“)
  4. ่ดน็”จไผ˜ๅŒ–: ไฝฟ็”จ้™ไปทๅ• (Maker) ่€Œ้žๅธ‚ไปทๅ• (Taker)

้กน็›ฎ็ป“ๆž„

src/
โ”œโ”€โ”€ main.rs           # ไธปๅ…ฅๅฃ๏ผŒไบคๆ˜“ๅพช็Žฏ
โ”œโ”€โ”€ lib.rs            # ๅบ“ๅฏผๅ‡บ
โ”œโ”€โ”€ config.rs         # ้…็ฝฎๅŠ ่ฝฝๅ’Œ้ชŒ่ฏ
โ”œโ”€โ”€ types.rs          # ๆ ธๅฟƒๆ•ฐๆฎ็ฑปๅž‹
โ”œโ”€โ”€ price_monitor.rs  # WebSocket ไปทๆ ผ็›‘ๆŽง
โ”œโ”€โ”€ opportunity.rs    # ๅฅ—ๅˆฉๆœบไผšๆฃ€ๆต‹
โ”œโ”€โ”€ executor.rs       # ไบคๆ˜“ๆ‰ง่กŒ
โ”œโ”€โ”€ position.rs       # ไป“ไฝ็ฎก็†
โ”œโ”€โ”€ risk.rs           # ้ฃŽ้™ฉๆŽงๅˆถ
โ”œโ”€โ”€ alert.rs          # ๅ‘Š่ญฆๆœๅŠก
โ”œโ”€โ”€ storage.rs        # ๆ•ฐๆฎๅบ“ๆ“ไฝœ
โ”œโ”€โ”€ backtest.rs       # ๅ›žๆต‹ๅผ•ๆ“Ž
โ””โ”€โ”€ azverse.rs        # AZverse ้€‚้…ๅ™จ

API ๅ‚่€ƒ

ๆ ธๅฟƒๆจกๅ—

PriceMonitor

// ่Žทๅ–ไปทๆ ผ
let price = monitor.get_price("AZverse", "BTC_USDT").await;

// ๆฃ€ๆŸฅๆ˜ฏๅฆ่ฟ‡ๆœŸ
let is_stale = monitor.is_stale("AZverse").await;

OpportunityDetector

// ๆฃ€ๆต‹ๆœบไผš
let opportunities = detector.detect_opportunities(&prices, position_size);

// ้€‰ๆ‹ฉๆœ€ไฝณๆœบไผš
let best = detector.select_best_opportunity(&opportunities);

TradeExecutor

// ๆ‰ง่กŒๅฅ—ๅˆฉ
let result = executor.execute_arbitrage(&opportunity, size).await;

// ๅนณไป“
let close_result = executor.close_arbitrage_position(&position).await;

RiskManager

// ๆฃ€ๆŸฅๆ˜ฏๅฆๅฏไปฅๅผ€ไป“
risk_manager.can_open_position(size)?;

// ่ฎฐๅฝ• PnL
risk_manager.record_pnl(pnl);

// ๆฃ€ๆŸฅๆ˜ฏๅฆๆš‚ๅœไบคๆ˜“
if risk_manager.is_trading_paused() { ... }

ๆต‹่ฏ•

# ่ฟ่กŒๆ‰€ๆœ‰ๆต‹่ฏ•
cargo test

# ่ฟ่กŒ็‰นๅฎšๆจกๅ—ๆต‹่ฏ•
cargo test opportunity::tests

# ่ฟ่กŒๅฑžๆ€งๆต‹่ฏ•
cargo test prop_

ๆ—ฅๅฟ—็บงๅˆซ

# ่ฏฆ็ป†ๆ—ฅๅฟ—
RUST_LOG=debug cargo run

# ๅชๆ˜พ็คบ่ญฆๅ‘Šๅ’Œ้”™่ฏฏ
RUST_LOG=warn cargo run

# ็‰นๅฎšๆจกๅ—ๆ—ฅๅฟ—
RUST_LOG=perp_arbitrage_bot::opportunity=debug cargo run

ๅธธ่ง้—ฎ้ข˜

Q: WebSocket ่ฟžๆŽฅๅคฑ่ดฅ?

A: ๆฃ€ๆŸฅ็ฝ‘็ปœ่ฟžๆŽฅๅ’Œ WebSocket URL ้…็ฝฎใ€‚็ณป็ปŸไผš่‡ชๅŠจ้‡่ฟž๏ผŒไฝฟ็”จๆŒ‡ๆ•ฐ้€€้ฟ็ญ–็•ฅใ€‚

Q: ไบคๆ˜“ๆ‰ง่กŒๅคฑ่ดฅ?

A: ๆฃ€ๆŸฅ API ๅ‡ญ่ฏๆ˜ฏๅฆๆญฃ็กฎ๏ผŒ่ดฆๆˆทไฝ™้ขๆ˜ฏๅฆๅ……่ถณใ€‚ๆŸฅ็œ‹ๆ—ฅๅฟ—่Žทๅ–่ฏฆ็ป†้”™่ฏฏไฟกๆฏใ€‚

Q: ๆฒกๆœ‰ๆฃ€ๆต‹ๅˆฐๆœบไผš?

A: ๅฏ่ƒฝๆ˜ฏไปทๅทฎๆœช่พพๅˆฐ้˜ˆๅ€ผใ€‚ๅฐ่ฏ•้™ไฝŽ MIN_SPREAD_PERCENT ๆˆ–ไฝฟ็”จ Dry Run ๆจกๅผ่ง‚ๅฏŸใ€‚

Q: ๅฆ‚ไฝ•่Žทๅ– AZverse ๅ‡ญ่ฏ?

A: ็™ปๅฝ• AZverse ็ฝ‘็ซ™ๅŽ๏ผŒไปŽๆต่งˆๅ™จ Cookie ไธญ่Žทๅ– token, client-code, JSESSIONIDใ€‚

License

MIT License

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published