برو به محتوای اصلی
بات

راهنمای کامل معامله الگوریتمی با پایتون در صرافی غیرمتمرکز Hyperliquid

yasin

یاد بگیر چطوری معاملات الگوریتمی‌تو با پایتون و ccxt توی صرافی غیرمتمرکز Hyperliquid راه بندازی و خودکار کنی.

هایپرلیکوئید تازگیا با ایردراپ عظیمش، که یکی از بزرگ‌ترین‌ها بود و بیش از یه میلیارد دلار ارزش داشت، کلی سروصدا کرد! شاید برات سوال باشه که چطور و چرا این کارو کردن. ما هم همین سوالو داشتیم!

بعد از گشت و گذار توی پلتفرم، دلیل موفقیتش کاملاً مشخص شد. هایپرلیکوئید فوق‌العاده طراحی شده، کاربرپسنده و یه API عالی برای معاملات الگوریتمی داره. همه ویژگی‌هایی که برای معاملات دستی می‌خوای رو هم داره. تازه، مزیت اصلی یه صرافی غیرمتمرکز اینه که مستقیماً از کیف پولت معامله می‌کنی، بدون واسطه. علاوه بر این، کارمزدهای معاملاتی خیلی جذابی هم ارائه می‌ده. خلاصه بگم، یه "قدرت کوچیک"ه که خیلی از معامله‌گرای الگوریتمی رو جذب می‌کنه.

خب، بریم سر اصل مطلب! قراره قدم به قدم بهت یاد بدم که چطوری با استفاده از یه Jupyter notebook مبتنی بر پایتون، تو هایپرلیکوئید معامله الگوریتمی انجام بدی. کد متن‌بازش رو می‌تونی اینجا پیدا کنی:
لینک گیت‌هاب 🐍

شروع کار با هایپرلیکوئید: ساخت حساب و تنظیمات اولیه


اتصال به هایپرلیکوئید: از طریق کیف پول یا ایمیل

می‌تونی وب‌سایت رسمی هایپرلیکوئید رو از این لینک پیدا کنی:
Hyperliquid

برای شروع معامله، اولین قدم اینه که حسابت رو به مقداری سرمایه وصل کنی. دو راه اصلی داری:

  1. مستقیم کیف پولت رو وصل کنی
  2. حسابت رو با یه آدرس ایمیل راه بندازی

بیاین سریع هر دو روش رو مرور کنیم:

  1. روی گزینه "Connect" که بالای صفحه سمت راست هست کلیک کن (مرحله ۱ توی اسکرین‌شات). این کار پنل اتصال رو باز می‌کنه (مرحله ۲).
  2. گزینه‌های موجود رو می‌بینی: ایمیل، کیف پول‌های از قبل تنظیم‌شده (WalletConnect، OKX، Coinbase) و یه فیلد برای هر کیف پول دیگه‌ای که ممکنه استفاده کنی.
  3. اگه از افزونه کیف پول مرورگر مثل متامسک استفاده می‌کنی، به عنوان گزینه دوم توی پنل (۲) ظاهر می‌شه. روش کلیک کن.
  4. یه نوتیفیکیشن توی افزونه کیف پولت باز می‌شه. به افزونه برو، اتصال رو تایید کن و مراحل تایید نهایی رو دنبال کن تا لینک کردن حسابت تکمیل بشه.

اگه افزونه کیف پول به مرورگرت وصل نباشه، پنل (۲) یه چیزی شبیه این می‌شه که یه جای خالی به اسم "default wallet" نشون می‌ده.

اگه روش ایمیل رو انتخاب کنی، باید کدی که به ایمیلت فرستاده می‌شه رو وارد کنی. بعدش برای واریز ارز به حسابت کار راحتی داری: کافیه روی دکمه "Deposit" که بالا سمت راست (با شماره ۱ توی اسکرین‌شات) مشخص شده کلیک کنی.

در بخش (۲)، آدرس واریز رو می‌بینی. در حال حاضر فقط USDC روی شبکه Arbitrum One پشتیبانی می‌شه. اگه انتقال انجام می‌دی، حتماً مطمئن شو که شبکه درست رو انتخاب کردی، وگرنه ممکنه ارزت بره هوا . وقتی واریز تکمیل شد، موجودی حسابت تو بخش (۳) نمایش داده می‌شه.

ناوبری در رابط معاملاتی کریپتوی Hyperliquid


حالا که حسابت رو شارژ کردی، می‌تونی معامله رو شروع کنی. همون‌طور که توی تصویر زیر می‌بینی، رابط کاربری خیلی شبیه به صرافی‌های متمرکزه (CEX):

  1. (۱) انواع مختلفی از بازارها و ارزها در دسترسه.
  2. (۲) می‌تونی سفارش‌هات رو دقیقاً مثل یه صرافی متمرکز ثبت کنی.

انواع مختلفی از سفارش‌ها رو می‌تونی انجام بدی:

  • سفارش‌های Limit یا Market
  • سفارش‌هایی با Stop Loss و Take Profit
  • سفارش‌های پیچیده‌تر: stop limit، stop market، TWAP، Scale، گزینه reduce-only
  • انتخاب حالت مارجین، اهرم برای بازارهای فیوچرز و چیزای دیگه

اینجا بحث درباره معاملات دستی رو متوقف می‌کنیم. هدف اصلی‌مون معامله الگوریتمیه. قراره یاد بدیم چطور این سفارش‌ها رو ثبت کنی، اطلاعات بازار و موقعیت‌هارو بگیری، همه اینا با پایتون!

دریافت کلیدهای API و احراز هویت در Hyperliquid با پایتون


ایجاد کلیدهای API Wallet در Hyperliquid

اولین قدم برای معامله با کدنویسی، ساختن کلیدهای API هست که به کدت اجازه می‌ده از طرف تو سفارش ثبت کنه. یکی از مزیت‌های بزرگ Hyperliquid اینه که کلیدهای API در واقع مثل "کیف پول‌های API" (یا "کیف پول‌های نماینده") عمل می‌کنن. یعنی هیچ‌وقت لازم نیست کدهای دسترسی کیف پول خارجیت رو ارائه بدی. علاوه بر این، این کلیدها فقط می‌تونن سفارش ثبت کنن و نمی‌تونن برداشت انجام بدن، که یه لایه امنیتی اضافه ایجاد می‌کنه.

برای ساخت این کلیدها در Hyperliquid:

  1. به بخش "More" برو (شماره ۱ در اسکرین‌شات).
  2. یه اسم برای کلیدت انتخاب کن، آدرسش رو بساز (شماره ۳)، و بعد با کلیک روی (شماره ۴) اون رو تأیید کن.

بعد از کلیک روی "Authorize"، یه پنجره باز می‌شه:

  1. تعداد روزهای انقضای کلید رو مشخص کن (شماره ۱)، که حداکثرش ۱۸۰ روزه.
  2. کلید خصوصی کیف پول (شماره ۲) رو کپی کن، چون برای کدت ضروریه.

احراز هویت در صرافی Hyperliquid با پایتون (ccxt)

یه خبر خوب دیگه: Hyperliquid توسط کتابخونه ccxt پشتیبانی می‌شه. ccxt یه رابط یکپارچه برای صدها صرافی ارائه می‌ده و جزئیات و امضاهای خاص هر صرافی رو مدیریت می‌کنه، پس لازم نیست خودت نگرانش باشی.

اول باید با استفاده از کلید API که تازه ساختی، احراز هویت کنی. این کار توی اولین سلول از Jupyter Notebook انجام می‌شه. با ccxt، اینجوری به نظر می‌رسه:

import ccxt

dex = ccxt.hyperliquid({
    "walletAddress": "", # آدرس عمومی حساب یا کیف پولت
    "privateKey": "",    # کلید خصوصی از کیف پول API
})

یه نکته خیلی مهم: توی بخش "walletAddress"، آدرس API Wallet که تازه ساختی رو وارد نکن. به جاش، آدرس عمومی حساب یا کیف پولت رو استفاده کن. این آدرس رو می‌تونی بالای سمت راست وب‌سایت، با کلیک روی حساب یا آدرست پیدا کنی و با دکمه کپی (شماره ۱) به راحتی کپی کنی.

برای "privateKey"، از کلید خصوصی کیف پول API که ساختی استفاده کن. بعد از وارد کردن اطلاعات، می‌تونی سلول رو اجرا کنی.

برای اطمینان از درست بودن تنظیمات، سلول بعدی رو با کد زیر اجرا کن:

dex.fetch_balance()

این کد موجودی حسابت رو نمایش می‌ده و تأیید می‌کنه که همه چیز درست راه‌اندازی شده.

این خروجی چیزی شبیه به این خواهد بود:

{
 'info': {
   'marginSummary': {
     'accountValue': '19.913163',
     'totalNtlPos': '0.0',
     'totalRawUsd': '19.913163',
     'totalMarginUsed': '0.0'
   },
   'crossMarginSummary': {
     'accountValue': '19.913163',
     'totalNtlPos': '0.0',
     'totalRawUsd': '19.913163',
     'totalMarginUsed': '0.0'
   },
   'crossMaintenanceMarginUsed': '0.0',
   'withdrawable': '19.913163',
   'assetPositions': [],
   'time': '1733403498591'
 },
 'USDC': {
   'total': 19.913163,
   'free': 19.913163,
   'used': 0.0
 },
 'timestamp': 1733403498591,
 'datetime': '2024-12-05T12:58:18.591Z',
 'free': {'USDC': 19.913163},
 'used': {'USDC': 0.0},
 'total': {'USDC': 19.913163}
}

برای این آموزش، ۲۰ USDC واریز کردیم و موجودی حساب (با کسر کارمزد انتقال) اینجا نمایش داده شده.

اجرای معاملات کریپتو در Hyperliquid با پایتون


ثبت سفارش‌های بازار (Market) تو Hyperliquid با پایتون

حالا آماده‌ایم که سفارش ثبت کنیم. بیایید با یه سفارش بازار (Market) شروع کنیم. با ccxt خیلی راحته: از create_order استفاده کن:

symbol = "ETH/USDC:USDC"  # نماد جفت‌ارز
market_type = "market"  # نوع سفارش
side = "buy"  # نوع معامله (خرید)
amount = 0.01  # مقدار معامله
price = dex.load_markets()["ETH/USDC:USDC"]["info"]["midPx"]  # قیمت متوسط بازار

dex.create_order(symbol, market_type, side, amount, price=price)

این چیزهایی هست که برای سفارش تعریف کردیم:

  • Symbol: جفت‌ارز ETH/USDC:USDC برای بازار فیوچرز ETH/USDC.
  • Type: market (سفارش بازار).
  • Side: buy (سفارش خرید).
  • Quantity: مقدار 0.01 ETH.
  • Price: از midPx گرفته شده (میانگین بین بهترین قیمت خرید و فروش).

ویژگی خاص Hyperliquid: حتی برای سفارش‌های بازار (Market Order)، باید قیمت مشخص کنی. وگرنه این خطا رو می‌گیری:

“ArgumentsRequired: hyperliquid market orders require price to calculate the max slippage price. Default slippage can be set in options (default is 5%).”

این مکانیزم امنیتی جلوی اجرای سفارش بازار با قیمتی خیلی دور از قیمت مدنظر تو رو می‌گیره.

ما برای ثبت سفارش، از قیمت تقریبی "mid price" که از Hyperliquid گرفته می‌شه استفاده می‌کنیم. این کار با فراخوانی load_markets انجام می‌شه که جزئیات بازار رو میاره. بعد از اجرای create_order، یه پاسخ JSON می‌گیری که اطلاعات سفارش توش هست:

{
 'info': {
   'filled': {
     'totalSz': '0.01',
     'avgPx': '3564.6',
     'oid': '52344575851'
   }
 },
 'id': '52344575851',
 'clientOrderId': None,
 'timestamp': None,
 'datetime': None,
 'lastTradeTimestamp': None,
 'lastUpdateTimestamp': None,
 'symbol': None,
 'type': None,
 'timeInForce': None,
 'postOnly': None,
 'reduceOnly': None,
 'side': None,
 'price': None,
 'triggerPrice': None,
 'amount': 0.01,
 'cost': None,
 'average': 3564.6,
 'filled': None,
 'remaining': None,
 'status': None,
 'fee': None,
 'trades': [],
 'fees': [],
 'stopPrice': None,
 'takeProfitPrice': None,
 'stopLossPrice': None
}

چون یه پوزیشن لانگ توی بازار فیوچرز باز کردیم، این پوزیشن توی رابط وب زیر نمودار نمایش داده می‌شه.

دریافت اطلاعات پوزیشن‌های باز با پایتون


وقتی یک یا چند پوزیشن باز داری، می‌تونی جزئیاتشون رو ببینی مثل: اندازه پوزیشن، جهتش (لانگ/شورت)، قیمت لیکوئید شدن، سود و زیان تحقق‌نیافته (PnL)، مارجین اولیه و موارد دیگه.

از متد fetch_positions در ccxt استفاده کن:

symbols = ["ETH/USDC:USDC"]
dex.fetch_positions(symbols)

برای مثال، ممکنه یه چیزی شبیه به این خروجی بگیری:

[
  {
    'info': {
      'type': 'oneWay',
      'position': {
        'coin': 'ETH',
        'szi': '0.01',
        'leverage': {
          'type': 'isolated',
          'value': '2',
          'rawUsd': '-19.675763'
        },
        'entryPx': '3932.4',
        'positionValue': '39.21',
        'unrealizedPnl': '-0.114',
        'returnOnEquity': '-0.00579799',
        'liquidationPx': '1987.45080808',
        'marginUsed': '19.534237',
        'maxLeverage': '50',
        'cumFunding': {
          'allTime': '0.0',
          'sinceOpen': '0.0',
          'sinceChange': '0.0'
        }
      }
    },
    'id': None,
    'symbol': 'ETH/USDC:USDC',
    'timestamp': None,
    'datetime': None,
    'isolated': True,
    'hedged': None,
    'side': 'long',
    'contracts': 0.01,
    'contractSize': 1.0,
    'entryPrice': 3932.4,
    'markPrice': None,
    'notional': 39.21,
    'leverage': 2.0,
    'collateral': 19.534237,
    'initialMargin': 19.534237,
    'maintenanceMargin': None,
    'initialMarginPercentage': None,
    'maintenanceMarginPercentage': None,
    'unrealizedPnl': -0.114,
    'liquidationPrice': 1987.45080808,
    'marginMode': 'isolated',
    'percentage': 0.5835907488989714
  }
]

این اطلاعات، جزئیات کامل پوزیشن باز مثل اندازه، اهرم، قیمت ورود، سود و زیان تحقق‌نیافته، و قیمت لیکوئید رو نشون می‌ده.

بستن پوزیشن در Hyperliquid با پایتون

اطلاعات پوزیشن برای بستن کامل اون هم به درد می‌خوره. برای مثال، برای بستن کامل یه پوزیشن لانگ، می‌تونی از اندازه کل پوزیشن که از fetch_positions می‌گیری استفاده کنی:

symbol = "ETH/USDC:USDC"  # نماد جفت‌ارز
market_type = "market"  # نوع سفارش
side = "sell"  # برای بستن پوزیشن لانگ
amount = dex.fetch_positions([symbol])[0]["contracts"]  # اندازه پوزیشن
price = dex.load_markets()["ETH/USDC:USDC"]["info"]["midPx"]  # قیمت میانگین بازار

dex.create_order(symbol, market_type, side, amount, price=price, params={"reduceOnly": True})

چون داریم یه پوزیشن لانگ رو می‌بندیم، باید یه سفارش فروش (sell) ثبت کنیم. خیلی مهمه که reduceOnly: True رو بذاریم تا نشون بدیم این سفارش برای بستن پوزیشن هست، نه باز کردن یه معامله جدید. مقدار هم مستقیم از fetch_positions (یعنی "contracts") گرفته می‌شه.

ثبت سفارش Limit در Hyperliquid با پایتون

حالا بیایید یه سفارش Limit ثبت کنیم:

symbol = "ETH/USDC:USDC"  # نماد جفت‌ارز
market_type = "limit"  # نوع سفارش
side = "buy"  # خرید
amount = 0.01  # مقدار
price = 3300  # قیمت مشخص برای خرید

order = dex.create_order(symbol, market_type, side, amount, price=price)
print(order)

ما سفارش رو توی متغیر order ذخیره می‌کنیم تا به id اون دسترسی داشته باشیم. اگه بازار به قیمت 3300 USDT نرسه، سفارش به حالت "باز" (open) می‌مونه. می‌تونی این سفارش رو توی قسمت "open orders" توی رابط کاربری ببینی.

لغو سفارش‌ها در Hyperliquid با پایتون

وقتی سفارش رو ذخیره کردی، می‌تونی با گرفتن id اون، مدیریت کنی. مثلاً برای لغو سفارش:

symbol = "ETH/USDC:USDC"  
order_id = order["id"]  

dex.cancel_order(order_id, symbol)  

تکنیک‌های پیشرفته معامله الگوریتمی در Hyperliquid با پایتون

تغییر اهرم و حالت مارجین در Hyperliquid با پایتون

قبل از باز کردن یه پوزیشن، ممکنه بخوای اهرم و حالت مارجین رو متناسب با مدیریت ریسک خودت تنظیم کنی. Hyperliquid این گزینه‌ها رو ارائه می‌ده:

  • مارجین ایزوله (Isolated margin): مارجین فقط به همین پوزیشن محدود می‌شه.
  • مارجین کراس (Cross margin): از کل سرمایه‌ت برای حمایت از پوزیشن‌های باز استفاده می‌کنه.

می‌تونی اهرم رو هم مشخص کنی. از set_margin_mode استفاده کن:

symbol = "ETH/USDC:USDC"  
margin_mode = "isolated"   # یا می‌تونه "cross" باشه
leverage = 2               # مثال: اهرم 2x

dex.set_margin_mode(margin_mode, symbol, params={"leverage": leverage})

این تنظیم برای پوزیشن‌هایی که بعداً روی اون نماد باز می‌کنی اعمال می‌شه.

ثبت سفارش‌های Take Profit و Stop Loss در Hyperliquid با پایتون

بعد از باز کردن یه پوزیشن، ممکنه بخوای برای مدیریت ریسک و حفظ سود، سفارش‌های Take Profit (TP) و Stop Loss (SL) ثبت کنی.

در اینجا از متد create_order استفاده می‌کنیم. اگه پوزیشن لانگ باشه، برای Take Profit باید یه سفارش خروج (exit) ثبت کنی، پس side="sell" می‌ذاریم. قیمت برای این نوع سفارش اهمیتی نداره، اما باید مشخص بشه، وگرنه خطا می‌گیری.

اندازه:

  • برای Take Profit جزئی، می‌تونی مقداری کمتر از اندازه کل پوزیشن وارد کنی.
  • برای Take Profit کامل، می‌تونی اندازه پوزیشن رو با متد fetch_positions مستقیماً بگیری.

قیمت:
قیمتی که Take Profit باید در اون فعال بشه، توی پارامتر خاص takeProfitPrice مشخص می‌شه. همچنین، حتماً reduceOnly: True رو تنظیم کن تا نشون بده این سفارش برای بستن پوزیشن هست.

به طور خلاصه، در پایتون به این شکل هست:

symbol = "ETH/USDC:USDC"
market_type = "market"
side = "sell"
price = dex.load_markets()["ETH/USDC:USDC"]["info"]["midPx"]

# amount = dex.fetch_positions([symbol])[0]["contracts"]
amount = 0.05
tp_price = 4500

dex.create_order(symbol, market_type, side, amount, price=price, params={"takeProfitPrice": tp_price, "reduceOnly": True})

این کد یه سفارش Take Profit ثبت می‌کنه که با رسیدن قیمت به 4500 فعال می‌شه و مقدار مشخص‌شده رو می‌فروشه.

برای Stop Loss هم به همین روش از stopLossPrice استفاده کن:

symbol = "ETH/USDC:USDC"
market_type = "market"
side = "sell"
price = dex.load_markets()["ETH/USDC:USDC"]["info"]["midPx"]

amount = dex.fetch_positions([symbol])[0]["contracts"]
sl_price = 3500

dex.create_order(symbol, market_type, side, amount, price=price, params={"stopLossPrice": sl_price, "reduceOnly": True})

ثبت سفارش‌های Stop Market در Hyperliquid با پایتون

سفارش Stop Market فقط برای تعیین Stop Loss یا Take Profit استفاده نمی‌شه؛ می‌تونی ازش برای ورود به یه پوزیشن هم استفاده کنی. مثلاً وقتی بخوای پوزیشن لانگ باز کنی، فقط در صورتی که قیمت به یه سطح بالاتر برسه، از این نوع سفارش استفاده می‌کنی تا Breakout‌ها رو بگیری.

برای ثبت چنین سفارشی، باید stopPrice رو در پارامترهای خاص create_order مشخص کنی، مثل این:

symbol = "ETH/USDC:USDC"
market_type = "market"
side = "buy"
price = dex.load_markets()["ETH/USDC:USDC"]["info"]["midPx"]
amount = 0.05
stop_price = 4200

dex.create_order(symbol, market_type, side, amount, price=price, params={"stopPrice": stop_price})