اللغة التي يتحدث بها الوسطاء والبورصات
حين يرسل نظام تداول أمرًا إلى وسيط أو بورصة يفعل ذلك غالبًا بـ 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 حقول
tag=valueينتهي كل منها بفاصل (chr(1)على الخط)؛ اقسم كل حقل عند أول=. - الترويسة
8(الإصدار) و9(طول الجسم) والجسم من35(النوع) فصاعدًا والذيل10(المجموع الاختباري). - المجموع الاختباري هو مجموع رموز الحروف modulo 256 بثلاثة أرقام؛ استخدم محركًا مجرّبًا في الإنتاج وسجّل كل رسالة.
التالي: الشيفرة النظيفة، التسمية والدوال الصغيرة والعادات التي تُبقي قاعدة شيفرة التداول مقروءة.
المختبر: ما الذي يُقيَّم
- اقرأ رسالة باستخدام
parse_fix25 نقطة - اختم رسالة باستخدام
checksum25 نقطة - اكتب الحقول باستخدام
build_fix25 نقطة - أرسل أمرًا باستخدام
new_order_message25 نقطة