كيف يمكنني تداول المشتقات المالية باستخدام المُفكّرة التفاعلية Jupyter Notebook؟

تم النشر في ‏28 سبتمبر 2023تم التحديث في ‏25 أكتوبر 20245 دقيقة قراءة‏‎80‏

تعرّف على كيفية التداول بالمشتقات المالية بكل بساطة باستخدام نفس الأدوات. لنستخدم الميزات الشاملة المتاحة في مكتبة python-okx (للتداول عبر واجهة برمجة التطبيقات API باستخدام لغة البرمجة Python) بمستوى أعلى!

أنواع المشتقات المالية

هناك ثلاثة أنواع من المشتقات المالية المتاحة للتداول لدى OKX:

  • العقود ذات تواريخ انتهاء صلاحية

  • العقود الدائمة

  • عقود الخيارات

يمكنك الاطلاع على مقال شرح مشتقات البيتكوين المالية: العقود ذات تاريخ انتهاء الصلاحية والعقود الدائمة وعقود الخيارات لفهم خصائص أنواع المشتقات المالية المختلفة لدى OKX. سنستخدم العقود الدائمة كمثال ضمن دليلنا التعليمي هذا.

الأسئلة الشائعة

1. كيف يمكنني الحصول على بيانات السوق باستخدام دالة واجهة برمجة التطبيقات API المسمّاة الحصول على بيانات السوق (Get market data)؟

يمكنك أيضًا تعديل قيمة مُعامِل نوع الأداة instType لتصبح EXPIRY (في حال استخدام العقود ذات تاريخ انتهاء الصلاحية) أو OPTION (في حال استخدام عقود الخيارات) لتلقي المعلومات الخاصة بهذه الأنواع ضمن نتيجة الاستدعاء (Response).

Python
     import okx.MarketData as MarketData

   flag = "1"  # live trading: 0, demo trading: 1

   marketDataAPI = MarketData.MarketAPI(flag = flag)

   result = marketDataAPI.get_tickers(instType = "SWAP")
   print(result)

2. كيف يمكنني معرفة أزواج التداول المتاحة باستخدام دالة واجهة برمجة التطبيقات API المسمّاة الحصول على الأدوات (Get instruments)؟

بنفس الطريقة السابقة، اختر قيمة لمُعامل نوع الأداة instType وفق الأداة التي تودّ الحصول على معلومات عنها ضمن نتيجة الاستدعاء (Response).

Python
import okx.PublicData as PublicData

if __name__ == '__main__':

    flag = "1"  # live trading: 0, demo trading: 1

    publicDataAPI = PublicData.PublicAPI(flag = flag)

    result = publicDataAPI.get_instruments(instType = "SWAP")
    print(result)

2.1 كيفية احتساب القيمة الافتراضية لعقد مشتقات مالية باستخدام مُعامليّ قيمة العقد ctVal ومُضاعِف العقد ctMult المُعادين (ضمن نتيجة الاستدعاء Response) للأداة

لاحتساب القيمة الافتراضية لعقد مشتقات مالية (منقبيل العقود الآجلة والعقود الدائمة وعقود الخيارات)، ستحتاج لاستخدام قيم مُعامليّ قيمة العقد ctVal ومُضاعف العقد ctMult من المعامِلات المُعادة (ضمن نتيجة الاستدعاء Response) للأداة المُختارة.

يتم احتساب القيمة الافتراضية لعقد مشتقات مالية وفق الصيغة التالية: ctVal × ctMult (بالوحدة المُحددة في مُعامِل عملة قيمة العقد: ctValCcy).

على سبيل المثال، استنادًا إلى مُعامِلات الأداة المُعادة ضمن نتيجة الاستدعاء المعروضة أدناه، يمكننا حساب القيمة الافتراضية لعقد LTC-USD الدائم كما يلي: ctVal * ctMult (الوحدة: ctValccy) = 10 * 1 USD = 10 USD

JSON
        "instType":"SWAP",
        "instId":"LTC-USD-SWAP",
        "instFamily":"LTC-USD",
        "uly":"LTC-USD",
        "settleCcy":"LTC",
        "ctVal":"10",
        "ctMult":"1",
        "ctValCcy":"USD"

3. كيف يمكنني التحقق من رصيدي باستخدام دالة واجهة برمجة التطبيقات API المسمّاة الحصول على الرصيد (Get balance)؟

Python
import okx.Account as Account
flag = "1"  # live trading:0, demo trading: 1

accountAPI = Account.AccountAPI(api_key, secret_key, passphrase, False, flag)

result = accountAPI.get_account_balance()
print(result)

4. ما هو وضع الحساب ووضع الهامش/وضع صفقة التداول المؤهل لتداول المشتقات المالية؟

وفقًا لما ذكرنا في دليلنا التعليمي السابق، ينطوي الحساب الموحّد على أربعة (4) أوضاع للحسابات:

  • وضع التداول الفوري،

  • وضع التداول الفوري وتداول العقود الآجلة،

  • وضع التداول بالهامش مُتعدّد العملات،

  • وضع هامش المحفظة.

وهنا تجدر الملاحظة لكون الأوضاع الثلاث (3) الأخيرة، أي وضع التداول الفوري وتداول العقود الآجلة، ووضع التداول بالهامش مُتعدّد العملات، ووضع هامش المحفظة، هي الأوضاع المؤهلة لتداول المشتقات المالية. يُرجى الاطّلاع على مقال كيفية تعيين وضع الحساب لفهم الفروق بين الأوضاع الأربعة وكيفية التبديل بينها من خلال واجهة إصدار الويب لدينا.

4.1 يمكنك الحصول على الضبط الحالي لوضع الحساب من خلال مُعامِل مستوى الحساب acctLv المُعاد ضمن نتيجة الاستدعاء (Response) لدى استخدام دالة واجهة برمجة التطبيقات API المسمّاةالحصول على ضبط الحساب (Get account configuration)

تأكّد من كونك في وضع الحساب الصحيح الذي يتيح لك تداول المشتقات المالية.

Python
import okx.Account as Account

flag = "1"  # live trading: 0, demo trading: 1

accountAPI = Account.AccountAPI(api_key, secret_key, passphrase, False, flag)
result = accountAPI.get_account_config()
print(result)

if result['code'] == "0":
    acctLv = result["data"][0]["acctLv"]
    if acctLv == "1":
        print("Simple mode")
    elif acctLv == "2":
        print("Single-currency margin mode")
    elif acctLv == "3":
        print("Multi-currency margin mode")
    elif acctLv == "4":
        print("Portfolio margin mode")

5. كيف يمكنني تعيين الرافعة المالية باستخدام دالة واجهة برمجة التطبيقات API المسمّاة تعيين الرافعة المالية للحساب (Set account leverage)؟

تعدّ الرافعة المالية من المُعامِلات المهمة التي يجب ضبطها لدى تداول المشتقات المالية.

إذ تتيح الرافعة المالية للمتداولين إمكانية الدخول بمركز ذو قيمة أعلى بكثير مقابل الالتزام بمبلغ صغير من المال. وبالتالي يتم تضخيم الأرباح أو الخسائر على نحوٍ كبير.

يمكن للمتداولين الحصول على رافعة مالية تصل إلى 125 ضعف (×125) لدى تداول المشتقات المالية في OKX. يمكنك الاطلاع على المراجع الخاصة بضبط الرافعة المالية لمعرفة مستويات الرافعة المختلفة المسموح بها وفق فئات المراكز المختلفة.

CT-web-derivativestrading-howtoapi-6

إليك معاني المصطلحات الواردة أعلاه:

  • الحد الأقصى للرافعة المالية: أقصى مُضاعِف لرأس المال المُقترض لزيادة العائد المحتمل للاستثمار.

  • مُعدّل الهامش الابتدائي (IMR): الهامش المطلوب لحيازة المراكز الحالية.

  • مُعدّل هامش الوقاية (MMR): الحد الأدنى للهامش المطلوب للحفاظ على المراكز الحالية (قبل حدوث التصفية). إذ ستحدث التصفية إذا انخفض رصيد الحساب إلى ما دون هامش الوقاية.

على سبيل المثال، عندما ترغب في تداول 3000 عقد ETHUSDT دائم، يمكنك استخدام رافعة مالية تصل إلى 75 ضعف (×75) من رأس مالك. فيكون مُعدّل الهامش الابتدائي: IMR = 1 / 75 = 1.3%،وبالتالي يجب عليك الحفاظ على مُعدّل هامش وقاية (MMR)يبلغ 0.8% فأكثر لتجنّب حدوث التصفية.

يوجد تسع (9) سيناريوهات مختلفة لضبط الرافعة المالية عبر واجهات برمجة التطبيقات APIs مفتوحة المصدر لدى OKX. يُرجى الرجوع إلى توثيق سيناريوهات دالة واجهة برمجة التطبيقات المسمّاة ضبط الرافعة المالية (Set leverage) للاطّلاع على مختلف الحالات.

بالنسبة لعقود المبادلة الدائمة، فهناك ثلاثة (3) سيناريوهات مختلفة لضبط الرافعة المالية:

  • تعيين الرافعة المالية (المُعامِل lever) للأداة من نوع عقد مبادلة SWAP ضمن وضع التداول بالهامش المتقاطع cross-margin في خيارات مستوى العقد.

  • تعيين الرافعة المالية (المُعامِل lever) للأداة من نوع عقد مبادلة SWAP ضمن وضع الهامش المعزول isolated-margin ووضع المراكز بطلبات الشراء/البيع أحادية الاتجاهbuy/sell في خيارات مستوى العقد.

  • تعيين الرافعة المالية (المُعامِل lever) للأداة من نوع عقد مبادلة SWAP ضمن وضع الهامش المعزول isolated-margin ووضع المراكز بطلبات الشراء/البيع مستقلّة الاتجاه long/short في خيارات مستوى العقد.

يُبيّن المثال التالي كيفية تعيين مُعامِلات الرافعة المالية lever واتجاه المركز posSide لعقد SWAP (عقد مبادلة) واحد فقط، مقارنةً بتعيين الرافعة المالية لجميع العقود من نوع SWAP لأصل أساسي معيّن.

Bash
# Set leverage to be 5x for all cross-margin BTC-USDT SWAP positions,
# by providing the SWAP instId
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    mgnMode = "cross"
)
print(result)

# In buy/sell position mode, set leverage to be 5x 
# for all isolated-margin BTC-USDT SWAP positions
# by providing the SWAP instId
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    mgnMode = "isolated"
)
print(result)

# In long/short position mode, set leverage to be 5x
# for an isolated-margin BTC-USDT-SWAP long position;
# This does NOT affect the leverage of the BTC-USDT-SWAP
# short positions
result = accountAPI.set_leverage(
    instId = "BTC-USDT-SWAP",
    lever = "5",
    posSide = "long",
    mgnMode = "isolated"
)
print(result)

تجدر الملاحظة لكون مُعامِل اتجاه المركز posSide المُمرّر في الطلب (Request) مطلوب فقط لدى استخدام وضع الهامش المعزول isolated ضمن وضع المراكز بطلبات الشراء/البيع مستقلة الاتجاه long/short وذلك لأداتي العقود ذات تاريخ انتهاء الصلاحية والعقود الدائمة EXPIRY/PERPETUAL(اطّلع على السيناريوهين 6 و9 من حالات استخدام دالة واجهة برمجة التطبيقات API المسمّاة تعيين الرافعة المالية Set leverage).

6. كيف يمكنني تعيين طلبات بأوضاع المراكز (أوضاع تعيين الطلبات) المختلفة: وضع مراكز طلبات الشراء/البيع مستقلّة الاتجاه long/short ووضع مراكز طلبات الشراء/البيع أحادية الاتجاه (الوضع الصافي) buy/sell؟

يوجد وضعين للمراكز (لتعيين الطلبات) لدى تداول العقود ذات تاريخ انتهاء الصلاحية EXPIRY والعقود الدائمة PERPETUAL، وهما: وضع مراكز طلبات الشراء/البيع مستقلّة الاتجاه long/short ووضع مراكز طلبات الشراء/البيع أحادية الاتجاه (الوضع الصافي) buy/sell.

يمكنك تغيير وضع تعيين الطلبات (وضع المركز) بين وضعيّ مراكز الشراء/البيع مستقلّة الاتجاه long/short ومراكز الشراء/البيع أحادية الاتجاه (الوضع الصافي) buy/sell، من خلال دالة واجهة برمجة التطبيقات API المُسمّاة تعيين وضع المراكز (Set position mode):

SQL
result = accountAPI.set_position_mode(
    posMode = "long_short_mode"
)
print(result)

كما يمكنك القيام بذلك عبر الإعدادات باستخدام إصدار الويب كما يلي:

CT-web-derivativestrading-howtoapi-9

في وضع مراكز الشراء/البيع أحادية الاتجاه (الوضع الصافي) buy/sell، تكون قيمة المركز الواحد من عقد معيّن هي الكمية الصافية لصفقات تداول الشراء والبيع لديك. وفي هذه الحالة، ولدى تعيين طلب من خلال دالة واجهة برمجة التطبيقات API المسمّاة تعيين طلب (Place order)، ليس من الضروري تمرير قيمة لمُعامِل اتجاه المركز posSide ضمن الطلب (Request). وإذا مررته، فإن القيمة الصالحة الوحيدة هي الوضع الصافي net.

أمّا في وضع مراكز الشراء/البيع مستقلّة الاتجاه long/short، تكون مراكز الشراء (Long) ومراكز البيع (Short) لعقد معيّن مستقلّة عن بعضها البعض وينبغي إغلاق كل منها على نحوٍ مستقل. وفي هذه الحالة، ولدى تعيين طلب من خلال دالة واجهة برمجة التطبيقات API المسمّاة تعيين طلب (Place order)، يغدو تمرير قيمة لمُعامِل اتجاه المركز posSide ضمن الطلب (Request) إلزاميًا. والقيم المتاحة لهذا المُعامِل هي إمّا شراء long أو بيع short. ونُبيّن فيما يلي كيفية تعيين المُعامِل side (جهة صفقة التداول) والمُعامِل posSide (جهة المركز) لدى تعيين طلب في سيناريوهات مختلفة:

  • تعيين طلب شراء (buy) وفتح/زيادة مركز باتجاه الشراء (Long): side = buy،posSide = long

  • تعيين طلب بيع (sell) وفتح/زيادة مركز باتجاه البيع (short):side = sell، posSide = short

  • تعيين طلب بيع (sell) وإغلاق/تقليل مركز باتجاه الشراء (long): side = sell، posSide = long

  • تعيين طلب شراء (buy) وإغلاق/تقليص مركز باتجاه البيع (short): side = buy، posSide = short وبذلك تكون جاهزًا لتعيين طلبات المشتقات المالية!

6.1 تعيين طلب حدّي من خلال دالة واجهة برمجة التطبيقات API المسمّاة تعيين طلب (Place order)

شراء 100 عقد مبادلة BTC-USDT بسعر 19000 USDT.

SQL
# limit order
result = tradeAPI.place_order(
    instId = "BTC-USDT-SWAP",
    tdMode = "isolated",
    side = "buy",
    posSide = "net",
    ordType = "limit",
    px = "19000",
    sz = "100"
)
print(result)

if result["code"] == "0":
    print("Successful order request,order_id = ",result["data"][0]["ordId"])
else:
    print("Unsuccessful order request,error_code = ",result["data"][0]["sCode"], ", Error_message = ", result["data"][0]["sMsg"])

6.2 تعيين طلب سوق من خلال دالة واجهة برمجة التطبيقات API المسمّاة تعيين طلب (Place order)

شراء 100 عقد مبادلة BTC-USDT بسعر السوق.

SQL
# market order
result = tradeAPI.place_order(
    instId = "BTC-USDT-SWAP",
    tdMode = "isolated",
    side = "buy",
    posSide = "net",
    ordType = "market",
    sz = "100"
)
print(result)

if result["code"] == "0":
    print("Successful order request,order_id = ",result["data"][0]["ordId"])
else:
    print("Unsuccessful order request,error_code = ",result["data"][0]["sCode"], ", Error_message = ", result["data"][0]["sMsg"])

7. كيف يمكنني الحصول على تفاصيل/حالة طلب معيّن (راجع توثيق دالة واجهة برمجة التطبيقات API المسمّاة الحصول على تفاصيل الطلب (Get order details)

بالإضافة إلى مُعامِل مُعرّف الطلب ordId، يمكنك أيضًا تحديد مُعامِل مُعرّف طلب العميل clOrdId للحصول على تفاصيل الطلب.

SQL
result = tradeAPI.get_order(instId="BTC-USDT-SWAP", ordId="505073046126960640")
print(result)

8. كيف يمكنني إلغاء طلب من خلال دالة واجهة برمجة التطبيقات API المسمّاة إلغاء الطلب (Cancel order)؟

Perl
You also use __clOrdId__ in place of __ordId__
result = tradeAPI.cancel_order(instId="BTC-USDT-SWAP", ordId="505073046126960640")
print(result)

9. كيف يمكنني تعديل طلب من خلال دالة واجهة برمجة التطبيقات API المسمّاة تعديل الطلب (Amend order)؟

يمكنك استخدام مُعامِل مُعرّف طلب العميل clOrdId بدلاً من مُعامِل مُعرّف الطلب ordId. يُبيّن هذا المثال آلية التعديل إلى حجم جديد.

SQL
result = tradeAPI.amend_order(
    instId = "BTC-USDT-SWAP", 
    ordId = "505073046126960640",
    newSz = "80"
)
print(result)

10. كيف يمكنني الحصول على قائمة الطلبات المفتوحة من خلال دالة واجهة برمجة التطبيقات API المسمّاة الحصول على قائمة الطلبات (Get order List)؟

SQL
result = tradeAPI.get_order_list()
print(result)

11. كيف يمكنني الحصول على سجل الطلبات من خلال دالة واجهة برمجة التطبيقات API المسمّاة الحصول على سجل الطلبات لآخر 7 أيام (Get order history (last 7 days)) ودالة واجهة برمجة التطبيقات المسمّاة الحصول على سجل الطلبات لآخر 3 أشهر (Get order history (last 3 months))؟

SQL
# Get order history (last 7 days)
result = tradeAPI.get_orders_history(
    instType = "SWAP"
)
print(result)

# Get order history (last 3 months)
result = tradeAPI.get_orders_history_archive(
    instType = "SWAP"
)
print(result)

12. كيف يمكنني الحصول على تفاصيل المعاملات من خلال دالة واجهة برمجة التطبيقات API المسمّاة الحصول على تفاصيل المعاملات لآخر 3 أيام (Get transaction details (last 3 days)) ودالة واجهة برمجة التطبيقات الحصول على تفاصيل المعاملات لآخر 3 أشهر (Get transaction details (last 3 months))؟

SQL
# Get transaction details (last 3 days)
result = tradeAPI.get_fills()
print(result)

# Get transaction details (last 3 months)
result = tradeAPI.get_fills_history(
    instType = "SWAP"
)
print(result)

13. كيف يمكنني الحصول على المراكز من خلال دالة واجهة برمجة التطبيقات API المسمّاة الحصول على المراكز (Get positions)؟

عندما يكون حسابك في الوضع الصافي net (أي وضع Buy/Sell)، فسيتم عرض المركز الصافي لكل عقد؛ أمّا عندما يكون حسابك في وضع مراكز الشراء/البيع مستقلة الاتجاه long/short، فسيتم عرض مركز الشراء (Long) ومركز البيع (Short) لكل عقد على نحوٍ مستقل.

SQL
result = accountAPI.get_positions()
print(result)

على سبيل المثال، يمكنك تتبّع أرباحك وخسائرك غير المحققّة من خلال مُعامِل الأرباح والخسائر غير المُحققّة upl المُعاد ضمن نتيجة الاستدعاء (Response).

المزيد من الأمثلة

لمزيدٍ من الأمثلة، يرجى تحميل المُفكّرة التفاعلية Jupyter Notebook بالكامل من هنا.

إذا كانت لديك أي أسئلة حول واجهات برمجة التطبيقات APIs الخاصّة بنا، يمكنك الانضمام إلى مجتمعنا الخاص بواجهات برمجة التطبيقات API وطرحها فيه.