إرسال واستقبال الرسائل¶
المقدمة ¶
تعمل هذه المقالة كمقدمة لاستخدام واجهة برمجة التطبيقات FIX لأي شخص مهتم بالتفاعل مع Spotware cServer باستخدام FIX.
في هذه المقالة، سنستخدم مثالاً بلغة C# لوصف مبادئ كيفية إنشاء رسالة FIX وإرسالها إلى الخادم واستقبال الرد بالتفصيل. هذا المثال ليس تطبيقًا محكمًا بأي حال من الأحوال وتم الاحتفاظ به بسيطًا قدر الإمكان للسماح للمبرمجين بفهم مفهوم استخدام رسائل واجهة برمجة التطبيقات FIX بسهولة.
من أجل إنشاء والحفاظ على التواصل المناسب مع الخادم والتعامل المناسب مع الردود، هناك حاجة إلى وظائف إضافية، تم تخطيها من أجل البساطة والوضوح. سنتعامل مع هذه المواضيع في مقالات مستقبلية.
نموذج الكود ¶
يمكنك العثور على نموذج الكود الذي تمت مناقشته في هذه المقالة على مستودع GitHub الخاص بنا
نظرة عامة على اتصال FIX ¶
رسالة FIX هي مجرد سلسلة مكونة من مجموعات من العلامات الرقمية والقيم مفصولة بشريط عمودي (|). تمثل كل علامة حقلاً مختلفًا يُسمح فيه بمجموعة معينة من القيم. يمكنك أدناه رؤية نموذج لرسالة FIX تطلب المصادقة من الخادم.
8=FIX.4.4|9=126|35=A|49=theBroker.12345|56=CSERVER|34=1|52=20170117- 08:03:04|57=TRADE|50=any_string|98=0|108=30|141=Y|553=12345|554=passw0rd!|10=131|
كما ترى، النمط القابل للتكرار الموجود في كل رسالة FIX هو:
Tag=Value|Tag=Value|Tag=Value|...
اعتمادًا على الغرض من كل رسالة، تكون هناك حاجة إلى مجموعة مختلفة من العلامات والقيم في كل مرة. يتم وصف العلامات والقيم المطلوبة لكل رسالة بالتفصيل في قواعد المشاركة لمحرك cTrader FIX (تحقق دائمًا من أحدث قواعد المشاركة).
بطريقة مماثلة، يتم إرسال الردود مرة أخرى من الخادم. يمكنك أدناه رؤية رد الخادم على الرسالة أعلاه.
8=FIX.4.4|9=106|35=A|34=1|49=CSERVER|50=TRADE|52=20170117- 08:03:04.509|56=theBroker.12345|57=any_string|98=0|108=30|141=Y|10=066|
الخطوات المتضمنة في عملية التواصل مع خادم FIX هي كما يلي:
-
إنشاء رسالة FIX
-
إرسال رسالة FIX
-
استقبال رسالة FIX
-
تحليل رسالة FIX
رسالة FIX الخام ليست تنسيقًا قابلاً للقراءة بسهولة لأنها صُممت مع مراعاة الكفاءة بدلاً من قابلية الفهم. لذلك، بالنسبة لكل تطبيق برمجي، ستكون هناك دائمًا عملية ترجمة المعلومات المقدمة إلى رسالة FIX المناسبة.
في تطبيق C# النموذجي الخاص بنا، قمنا بإنشاء فئة للتعامل مع إنشاء الرسائل بالإضافة إلى وظائف لإنشاء رسائل FIX بناءً على المعلومات ذات الصلة.
بعد إنشاء الرسائل، يتم إرسالها بين الخادم والعميل عبر الإنترنت من خلال مآخذ الشبكة. عند استلام الرسائل، يجب تحليلها لتقديمها بتنسيق قابل للقراءة.
في هذه المقالة سنغطي عملية الإنشاء والإرسال واستلام الرد. سنتعامل مع التحليل في مقالة مستقبلية.
إنشاء رسالة FIX ¶
هيكل الرسالة ¶
في تطبيقنا النموذجي، قمنا بإنشاء فئة مسؤولة عن إنشاء رسائل FIX. تسمى الفئة MessageConstructor ويمكن العثور عليها في مشروع مكتبة واجهة برمجة التطبيقات FIX.
يتم تهيئة MessageConstructor بالمعلمات التالية:
-
Host(*)– العنوان الذي يوجد فيه cServer الخاص بنا. -
Username(*)– رقم الحساب -
Password(*)– كلمة المرور -
SenderCompID(*)– يتم توفيره في نموذج واجهة برمجة التطبيقات FIX الخاص بـ cTrader. إنه بالتنسيق -
SenderSubID*– إنه الجزء الثاني من SenderCompID -
TargetCompID(*)– يتم توفيره في نموذج واجهة برمجة التطبيقات FIX الخاص بـ cTrader (عادةً ما يكون cServer)
يمكنك العثور على هذه المعلومات في نموذج واجهة برمجة التطبيقات FIX الخاص بـ cTrader.
بعد أن قمنا بتهيئة MessageConstructor، نكون جاهزين لإنشاء رسائل واجهة برمجة التطبيقات FIX.
يتم إنشاء جميع الرسائل بطريقة مماثلة. فيما يلي نموذج كود لإنشاء رسالة تسجيل الدخول.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | |
يمكنك أن ترى أننا نقوم أولاً بإنشاء جزء الجسم، ثم نمرره إلى وظيفة الرأس وأخيرًا نمرر كلا الجزأين إلى وظيفة التذييل. يتم تفصيل هذه الأجزاء الثلاثة أدناه.
عملية إنشاء الرسالة هي مجرد إضافة العلامات والقيم والفواصل المطلوبة إلى سلسلة.
الجسم ¶
سنبدأ أولاً بوصف إنشاء الجسم، حيث يجب إنشاء جسم الرسالة أولاً. يمكننا رؤية مثال أعلاه (إنشاء رسالة تسجيل الدخول).
نبدأ بتهيئة فئة StringBuilder ونضيف العلامات واحدة تلو الأخرى بناءً على مدخلات الوظيفة. استنادًا إلى نوع الرسالة، يجب أن يتكون الجسم من مجموعات مختلفة من العلامات، بعضها إلزامي والبعض الآخر اختياري.
يمكنك العثور على هيكل كل رسالة في قواعد المشاركة الخاصة بنا (/FIX).
ثم نقوم بإنشاء رأس لرسالة تسجيل الدخول ونضيف إليه جسم الرسالة. أخيرًا، باستخدام سلسلة headerAndBody نقوم بإنشاء التذييل. فيما يلي، سنرى كيف نقوم بإنشاء رأس وتذييل.
الرأس ¶
الرأس هو الجزء الأول من رسالة FIX ويتكون من الحقول التالية (نفسها لجميع الرسائل):
BeginString– تحدد سلسلة البداية إصدار بروتوكول FIX وفي حالتنا ثابتة على FIX4.4.BodyLength– يحدد طول الجسم طول الرسالة بالأحرف، باستثناء حقولBeginStringوBodyLengthوالتذييل.MsgType– في هذا الحقل نحدد نوع الرسالة، حتى يعرف المستقبل كيفية تحليل الجسم.SenderCompID– هنا نقوم بتعيينSenderCompID.TargetCompID– هذا هو هدف رسالتنا. في حالتنا، سيكون دائمًا cServer.SenderSubID– تسجيل دخول المتداول.MsgSeqNum– هذا هو الرقم التسلسلي للرسالة. يجب زيادته لكل رسالة يتم إرسالها في نفس الجلسة.Sending Time– وقت إرسال الرسالة.
يمكنك أدناه رؤية وظيفة ConstructHeader، المسؤولة عن إنشاء الرؤوس.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | |
التذييل ¶
التذييل هو مجرد علامة تحتوي على المجموع الاختباري لباقي الرسالة.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
رسائل النظام ¶
يحتوي النموذج الخاص بنا على وظائف تعيد رسائل النظام التالية:
- نبض القلب:
MessageConstructor.HeartbeatMessage() - طلب الاختبار:
MessageConstructor.TestRequestMessage() - تسجيل الدخول:
MessageConstructor.LogonMessage() - تسجيل الخروج:
MessageConstructor.LogoutMessage() - طلب إعادة الإرسال:
MessageConstructor.ResendMessage() - الرفض:
MessageConstructor.RejectMessage() - إعادة تعيين التسلسل:
MessageConstructor.SequenceResetMessage()
رسائل التطبيق ¶
يحتوي النموذج الخاص بنا على وظائف تعيد رسائل النظام التالية:
- طلب بيانات السوق:
MessageConstructor.HeartbeatMessage() - لقطة بيانات السوق/تحديث كامل:
MessageConstructor.MarketDataSnapshotMessage() - تحديث تدريجي لبيانات السوق:
MessageConstructor.MarketDataIncrementalRefreshMessage() - أمر جديد فردي:
MessageConstructor.NewOrderSingleMessage() - طلب حالة الأمر:
MessageConstructor.OrderStatusRequest() - تقرير التنفيذ:
MessageConstructor.ExecutionReport() - رفض رسالة العمل:
MessageConstructor.BusinessMessageReject() - طلب المراكز:
MessageConstructor.RequestForPositions() - تقرير المركز:
MessageConstructor.PositionReport()
إرسال رسالة واستقبال رد ¶
لإرسال رسالة FIX إلى cServer، تحتاج أولاً إلى إنشاء اتصال مع الخادم. يمكنك القيام بذلك عن طريق إنشاء TcpClient. في حالتنا نقوم بإنشاء عميلين، حيث يتم التعامل مع رسائل عروض الأسعار ورسائل التداول من خلال منافذ مختلفة على الخادم.
ثم، نحتاج إلى الحصول على التدفقين اللذين سيتم إرسال الرسائل عليهما. تتم هذه العملية في منشئ النموذج كما هو موضح أدناه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
في المنشئ، نقوم أيضًا بتهيئة فئة MessageConstructor التي سيتم استخدامها لإنشاء الرسائل.
بعد ذلك، لإرسال الرسائل، قمنا بإنشاء وظيفتين مختلفتين، SendPriceMessage() وSendTradeMessage(). تأخذ كل منهما رسالة FIX كمدخل ثم تستدعي وظيفة SendMessage() مع الرسالة والتدفق المعني كمدخل.
تعمل وظيفة SendMessage() على النحو التالي:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
- ترميز الرسالة إلى مصفوفة بايت.
- كتابة مصفوفة البايت على التدفق.
- قراءة الرد من التدفق.
- زيادة رقم تسلسل الرسالة.
- ترميز الرسالة إلى سلسلة نصية.
يجب أن تعيد الوظيفة رسالة FIX المرسلة من قبل الخادم.
كما قد تفترض، لا يمكنك عرض رسالة FIX خام للمستخدم، لذا يجب تطوير خطوة إضافية لتحليل الرسالة الواردة.
الخاتمة¶
هذا التطبيق هو عرض موجز لكيفية التواصل مع cServer باستخدام رسائل FIX. إنه مجرد مثال يوضح مفاهيم بروتوكول FIX وليس بأي حال من الأحوال محرك FIX كامل. إذا كنت ترغب في تجنب بناء محرك FIX الخاص بك، فقد تفكر في استخدام أحد محركات FIX المتوفرة من جهات خارجية.
ملاحظة
هذه المقالة محدثة اعتبارًا من 03/02/2017 وتم تطويرها مع مراعاة محرك cTrader FIX وقواعد الاشتباك الإصدار 2.9.1.