σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft Academyالمسارات
Ctrl K
AO
+1.2k متعلّم
تسجيل الدخولانضم ↗
المسارات
AO
+1.2k متعلّم
تسجيل الدخول
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
مسار Python›الوحدة 9 · بيانات السوق وبنيته الدقيقة›الموضوع 9.5·~1 سمتقدم

بروتوكول FIX

الموضع في المسارالوحدة 9 من 11 · الموضوع 5 من 5
9.5 بروتوكول FIX
—درجة المختبر— / 100إجمالي XP—التتابع—

اللغة التي يتحدث بها الوسطاء والبورصات

حين يرسل نظام تداول أمرًا إلى وسيط أو بورصة يفعل ذلك غالبًا بـ FIX، بروتوكول Financial Information eXchange المستعمل منذ أوائل التسعينيات. ورسالة FIX نص عادي: قائمة حقول tag=value ينتهي كل منها بحرف فاصل غير مرئي هو chr(1) (SOH). وكل tag رقم له معنى متفق عليه: 35 نوع الرسالة و55 الرمز و54 الجهة و38 الكمية و44 السعر. الصيغة قديمة غير لامعة، وتفهمها الصناعة كلها.

# A FIX message is tag=value fields each ended by a separator (shown here as |)
message = "8=FIX.4.2|9=60|35=D|11=ord-1|55=AAPL|54=1|38=100|40=2|44=184.50|10=123|"

fields = {}
for part in message.split("|"):
    if part:                                       # the last separator leaves an empty piece
        tag, value = part.split("=", 1)            # split at the FIRST = only
        fields[int(tag)] = value

print(fields[35], fields[55], fields[38], fields[44])    # D AAPL 100 184.50
print(sorted(fields))                                    # [8, 9, 10, 11, 35, 38, 40, 44, 54, 55]

شكل الرسالة

للرسالة ثلاثة أجزاء. الترويسة تبدأ بـ 8=FIX.4.2 (الإصدار) ثم 9= طول الجسم ثم نوع الرسالة 35=. والجسم يحمل المحتوى: في New Order Single (35=D) معرّف أمر العميل والرمز والجهة (1 شراء و2 بيع) والكمية ونوع الأمر (40=2 محدد) والسعر. والذيل هو 10= أي المجموع الاختباري: اجمع رموز الحروف في كل ما سبقه واحتفظ ببقية القسمة على 256 مكتوبة بثلاثة أرقام. يعيد المستقبل حسابه لكشف التلف ويتحقق أيضًا من طول الجسم. وتضيف الجلسات المزيد: الدخول (35=A) والنبضات (35=0) وأرقام التسلسل كالتي تتبعتها في الموضوع السابق.

# The checksum: add up the character codes, keep the remainder modulo 256, three digits
def checksum(text):
    return f"{sum(ord(c) for c in text) % 256:03d}"

print(checksum("A"))                      # 065  the code of "A" is 65
print(checksum("aaa"))                    # 035  3 * 97 = 291 and 291 - 256 = 35
print(checksum("8=FIX.4.2|35=0|"))        # a heartbeat header
# Writing fields: tag=value and a separator after each one
def build_fix(fields, sep="|"):
    return "".join(f"{tag}={value}{sep}" for tag, value in fields)

body = build_fix([(35, "D"), (11, "ord-1"), (55, "AAPL"), (54, 1), (38, 100)])
print(body)                               # 35=D|11=ord-1|55=AAPL|54=1|38=100|
print(len(body))                          # 34  tag 9 holds this length
# A complete order: header with the body length, the body, then the checksum trailer
def checksum(text):
    return f"{sum(ord(c) for c in text) % 256:03d}"

def build_fix(fields, sep="|"):
    return "".join(f"{tag}={value}{sep}" for tag, value in fields)

def new_order_message(cl_ord_id, symbol, side, quantity, price, sep="|"):
    code = "1" if side == "buy" else "2"
    body = build_fix([(35, "D"), (11, cl_ord_id), (55, symbol), (54, code), (38, quantity), (40, 2), (44, f"{price:.2f}")], sep)
    head = build_fix([(8, "FIX.4.2"), (9, len(body))], sep) + body
    return head + build_fix([(10, checksum(head))], sep)

message = new_order_message("ord-1", "AAPL", "buy", 100, 184.5)
print(message)                            # 8=FIX.4.2|9=...|35=D|11=ord-1|...|44=184.50|10=...|
print(message.split("|")[-2])             # the checksum field
لا تبنِ محرك إنتاج بيدكتحليل الرسائل وبناؤها طريقة جيدة لفهم FIX، لكن الاتصال الحقيقي يحتاج منطق جلسة: تسجيل الدخول والنبضات وإعادة ضبط التسلسل وطلبات إعادة الإرسال ولهجات خاصة بكل منصة. وفي الإنتاج استخدم محركًا مجرّبًا مثل QuickFIX واجعل شيفرتك لمنطق الأوامر. فالأمر المشوّه أو المكرر قد يكلف مالًا حقيقيًا، فسجّل كل رسالة ترسلها وتستقبلها.
  • رسالة FIX حقول tag=value ينتهي كل منها بفاصل (chr(1) على الخط)؛ اقسم كل حقل عند أول =.
  • الترويسة 8 (الإصدار) و9 (طول الجسم) والجسم من 35 (النوع) فصاعدًا والذيل 10 (المجموع الاختباري).
  • المجموع الاختباري هو مجموع رموز الحروف modulo 256 بثلاثة أرقام؛ استخدم محركًا مجرّبًا في الإنتاج وسجّل كل رسالة.

التالي: الشيفرة النظيفة، التسمية والدوال الصغيرة والعادات التي تُبقي قاعدة شيفرة التداول مقروءة.

المختبر: ما الذي يُقيَّم

  • اقرأ رسالة باستخدام parse_fix25 نقطة
  • اختم رسالة باستخدام checksum25 نقطة
  • اكتب الحقول باستخدام build_fix25 نقطة
  • أرسل أمرًا باستخدام new_order_message25 نقطة
المستكشف · lab-116-1
▾ lab-116-1
…
bash · داخل المتصفح
learner@quantcraft:~/lab-116-1$
لم يتم تحميل Python بعدPythonLn 1, Col 1Spaces: 4UTF-8

هل تريد إعادة ضبط هذا الموضوع؟

سيعود كل ما في lab-116-1 إلى الملفات الابتدائية وستُمسح الطرفية. ستفقد حلّك الحالي ولا يمكن التراجع عن ذلك.

سيُعاد ضبطه
  • main.py ← الشيفرة الابتدائية
  • سجل الطرفية ومخرجات الاختبارات
  • التغييرات غير المُرسلة
سيُحتفظ به
  • أفضل درجة في المختبر
  • نقاط XP والتتابع
  • تقدّم المحاضرة والملاحظات

سجّل الدخول لتشغيل الكود الخاص بك.

قراءة كل المحاضرات مجانية. أنشئ حسابًا أو سجّل الدخول لتشغيل الكود وتنفيذ الاختبارات وتسليم هذا المختبر.

  • بيئة تطوير داخل المتصفح مع طرفية bash — لا حاجة لتثبيت أي شيء
  • تصحيح فوري ونقاط خبرة ومكانك في المسار
إنشاء حسابتسجيل الدخول
أو
المتابعة عبر GitHub