تجربة VonmoTrade. الجزء 3: كتاب أوامر. معالجة وتخزين المعلومات التجارية


في المادة الأخيرة من الدورة ، تعرفنا على أنواع أوامر التبادل. سنقوم اليوم بتحليل دفتر الطلبات ومعالجة الطلبات والقضايا المتعلقة بتنظيم تخزين المعلومات التجارية.


العرض والطلب


من المؤكد أنك تتذكر قانون العرض والطلب من مسار الاقتصاد ، والذي يوضح آليات السوق لتكوين السعر:



نفس الميكانيكا تعمل على التبادلات.


دفتر الطلبات هو قائمة يتم فيها إدخال أوامر الحد للبائعين والمشترين ، مما يُظهر الاهتمام الحالي بأداة مالية معينة.


إذا قمت بتحويل المخطط السابق فيما يتعلق بسجل الطلبات ، فستحصل على شيء مثل هذا:



نرى هنا أنه يتم الحصول على سعر السوق عندما يكون الحد الأقصى لسعر الطلب والحد الأدنى لسعر العرض متساويين. السبريد هو الفرق في هذه الأسعار. هذا مؤشر مهم ، لأنه مرتبط بسيولة الأداة. أصغر انتشار ، وأكثر سيولة الصك. لضمان السيولة في إطار تداول التبادل ، فغالبًا ما تفرض قيودًا على الحد الأقصى للفروق ، وفوق ذلك يمكن إيقاف التداول.


إنشاء التطبيقات


النظر في دورة حياة الطلب من القبول في البورصة إلى الوفاء أو الإلغاء. للبساطة ، سننظر في حالة سوق الصرف الأجنبي. عملية خاصة هي المسؤولة عن منطق أوامر المعالجة ، دعنا نسميها مراقب السوق.


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


للتنفيذ الفوري لهذا التطبيق ، يجب أن يوجد تطبيق مقترن مضاد في السوق.


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


نظرًا لأن الطلبات المعلقة تندرج فقط في دفتر الطلبات ، فيجب عليك تحديد قوائمك بالنسبة لأنواع الأنواع الأخرى.


في جميع قوائم الطلبات ، ينبغي فرز جانب الشراء بترتيب تنازلي ، ويجب فرز جانب البيع بترتيب تصاعدي للسعر. يمثل العنصر الأول في قائمة أوامر الحد لكل جانب أفضل سعر للعرض والطلب ، على التوالي.


نقطة أخرى مهمة هي ترتيب التنفيذ. يجب أن تطبق وحدة التحكم FIFO. لذلك ، إذا تزامنت أسعار العرضين ، فيجب أن يكون السعر الذي تم إنشاؤه مسبقًا أعلى.


في واجهة المستخدم ، يبدو الكتاب وكأنه جدول يتكون من مجموعة من مستويات الأسعار ، والتي تقدم أوامر الحد للشراء والبيع.



للتمييز المرئي الإضافي ، فإن طلبات البيع والشراء لها ألوان مختلفة.


تجميع المستوى


Book Depth - عدد مستويات الأسعار. بالنسبة للأسواق النشطة التي بها عدد كبير من الطلبات المعلقة ، مفصولة بمسافة دنيا ، يمكن أن يكون العمق كبيرًا جدًا للعرض في محطة المتداول. لتقييم الكتاب بأكمله ، فأنت بحاجة إلى أداة تجميع مستوى.


بقطع الرقم العشري وتجميع المستويات ، يمكننا تقليل عددهم مع كل خطوة.


تنفيذ وإلغاء الطلبات


بعد تنفيذ أو إلغاء الطلب الموجود في الكتاب ، يجب على وحدة التحكم تحديث الكتاب عن طريق حذف هذا الطلب وإخطار جميع المهتمين بالتغييرات في الكتاب.


معالج العمارة والتحجيم


نظرًا للأداء والموثوقية اللازمين ، من الضروري تحديد الأساليب لتوسيع نطاق التطبيقات وأنظمة التخزين.


عادةً ما تستخدم التبادلات القياس الرأسي. يتم تنفيذ رمز معالجة التطبيقات وحسابات المستخدمين على جهاز واحد داخل متراصة واحدة. يُظهر مثل هذا النهج أداءً جيدًا ، لكن له قيود كبيرة - على أي حال ، فإن القياس الرأسي له حد ، سواء من حيث طاقة المعالج وسعة التخزين.


كجزء من التجربة ، قررت أن تتم معالجة السوق بشكل أفقي. تتم معالجة كل أداة فردية من خلال عملية خاصة بها. يتم توزيع العمليات بين عقد الكتلة تلقائيًا. في حالة الفشل ، يتم نقل السوق إلى عقدة أخرى دون فقدان الوضع.



صيغة النظام بسيطة للغاية: يتم توزيع معالجات M على العقد K من الكتلة واستخدام مخازن البيانات L.
يسمح لك مخطط مماثل بتوسيع نطاق النظام إلى حوالي 150 عقدة. ويمكن لكل وحدة تحكم السوق التعامل مع حوالي 30k RPS.


نظرًا لاختلاف تدفق التطبيقات في جميع الأسواق ويعتمد على نشاط المستخدم ، يمكن تقسيم الأسواق إلى عدة مجموعات: صغيرة ومتوسطة وكبيرة. تحتوي كل عقدة على إعدادات تتيح لك تحديد حدود لعدد الأسواق التي يمكنها معالجتها. يوزع المعالج تلقائيًا وبشكل متساو الأسواق من نفس النوع بين عقد نظام المجموعة. في حالة حدوث تغيير في تكوين المجموعة ، يتم إعادة توزيع الأسواق. وبالتالي ، يتم تحقيق توزيع موحد أكثر أو أقل من الحمل على النظام.


عرض مثال للعقد في واجهة إدارة التبادل:



تخزين البيانات


دفتر الطلبات يتغير باستمرار ويجب حفظه في الذاكرة. بالنسبة إلى MVP ، اخترت Tarantool مع WAL كتخزين في الذاكرة. سيتم تسجيل جميع البيانات التاريخية في PostgreSQL.


يجب أن يتوافق مخطط تخزين البيانات الحالية والتاريخية مع المخطط المحدد لتوسيع نطاق رمز المعالجات. يمكن لكل سوق استخدام postgres الخاصة به و tarantool. للقيام بذلك ، ادمج زوج postgresql و tarantool في كيان واحد - مستودع بيانات السوق.


عند إعداد السوق ، يكون لدى المسؤول القدرة على إدارة المستودعات. للحفاظ على المرونة ، بدلاً من الوصول إلى مثيلات postgresql و tarantool ، سنحدد معرف تجمع اتصال فريدًا. يتم دعم واجهة هذه التجمعات بواسطة النظام الأساسي. وبالتالي ، يبدو المستودع في واجهة المشرف كما يلي:



عند إعداد السوق ، يجب على المسؤول تحديد متجر واحد على الأقل لكل سوق. إذا قمت بتحديد عدد قليل ، فستحصل على سوق به نسخ متماثل للبيانات المنطقية. تتيح لك هذه الميزة تكوين موثوقية وأداء نظام التخزين.


طلب بيانات الكتاب


يستخدم Tarantool مساحة لتنظيم البيانات المخزنة. بيان الفراغات المطلوبة لدفتر الطلب كما يلي:


book = { state = { name = 'book_state', id = 1, }, orders = { limit = { buy_orders = { name = 'limit_buy_orders', id = 10, }, sell_orders = { name = 'limit_sell_orders', id = 20, }, }, market = { buy_orders = { name = 'market_buy_orders', id = 30, }, sell_orders = { name = 'market_sell_orders', id = 40, }, }, ... }, orders_mapping = { name = 'orders_mapping', id = 50, }, } 

نظرًا لأن العديد من الأسواق يمكنها تخزين بياناتها في نسخة واحدة من أداة tarantool ، فسنضيف معرّف سوق لجميع الكيانات. يعتمد التطبيق الحالي للكتاب على مبدأ العد مرة واحدة ، عدة مرات. أثناء عمليات تحديث الكتاب ، يتم إعادة فرز المجموعات تلقائيًا. على سبيل المثال ، نضيف طلبًا إلى السوق ، ودقة الأسعار 6 ، وهناك 6 مجموعات أسعار ممكنة + شريحة واحدة مع بيانات الطلب الأصلية التي تحتاج إلى تحديث.


هناك الكثير من أوامر تعيين الطلبات لإصدار قوائم أوامر العملاء النشطة.


بفضل نموذج بيانات tarantool ، باستخدام مجموعة من المؤشرات ومكررات أخذ العينات المختلفة ، فإن كود lua الذي ينفذ تخزين دفتر الطلبات لا يستغرق سوى 600 سطر (إلى جانب التهيئة).


البيانات التاريخية


يتم تخزين بيانات السوق في جداول منفصلة لكل سوق. النظر في مجموعة من الجداول الأساسية.


تاريخ الطلبات المكتملة


لحفظ نتائج معالجة التطبيقات ، استخدم جدول المحفوظات. ويشمل الطلبات المكتملة بالكامل ، وكذلك ألغيت ، ولكنها مكتملة جزئيا.


 CREATE TABLE public.history ( id uuid NOT NULL, ts timestamp without time zone NOT NULL DEFAULT now(), owner character varying(75) COLLATE pg_catalog."default" NOT NULL, order_type integer NOT NULL, order_side integer NOT NULL, price numeric(64,32) NOT NULL, qty numeric(64,32) NOT NULL, commission numeric(64,32) NOT NULL, opts jsonb NOT NULL, CONSTRAINT history_pkey PRIMARY KEY (id, ts) ) 

على أساسها ، يعتمد إصدار المستخدمين النهائيين على تاريخ مناقصاتهم.


تغذية البيانات التاريخية


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


 CREATE TABLE public.ticks ( ts timestamp without time zone NOT NULL, bid numeric(64,32) NOT NULL, ask numeric(64,32) NOT NULL, last numeric(64,32) NOT NULL, bid_vol numeric(64,32), ask_vol numeric(64,32), last_vol numeric(64,32), opts jsonb DEFAULT '{}'::jsonb, CONSTRAINT ticks_pk PRIMARY KEY (ts) ) 

يقوم بتخزين الأسعار وأحجام السوق بعد المعاملة ، ويحتوي حقل opts على معلومات الخدمة ، مثل وصف الطلبات المتضمنة في المعاملة.


تغذية بيانات المخطط


لإنشاء مخططات تداول ، يكون جدول التجزئة كافياً. أنه يحتوي على ما يسمى تيار الخام ، ولكن postgresql لديه وظائف تحليلية قوية ويسمح لك بتجميع البيانات عند الطلب.


تبدأ المشاكل عندما يكون هناك الكثير من البيانات وليس هناك بالفعل طاقة كافية. لحل المشكلة ، قم بإنشاء جدول به بيانات محسوبة مسبقًا:


 CREATE TABLE public.df ( t timestamp without time zone NOT NULL, r df_resolution NOT NULL DEFAULT '1m'::df_resolution, o numeric(64,32), h numeric(64,32), l numeric(64,32), c numeric(64,32), v numeric(64,32), CONSTRAINT df_pk PRIMARY KEY (t, r) ) 

سنتحدث عن كيفية التعامل مع السلاسل الزمنية في Postgresql ، وإعداد البيانات لجدول df وكيفية بناء الرسوم البيانية في المقالة التالية.


يؤدي


اكتشفنا النقاط الرئيسية لتنظيم دفتر الأوامر وآلية معالجة الطلبات ، بالإضافة إلى القليل من منغمسين في ممارسة العمل مع بيانات السوق.


يسمح لك نظام التخزين المحدد بالبدء من متجر واحد لجميع الأسواق ، ومع نمو المشروع ، قم بتوزيع الأسواق في متاجر مختلفة ، مما يجعلها أقرب ما تكون إلى معالجات السوق.

Source: https://habr.com/ru/post/ar482254/


All Articles