منذ حوالي 7 سنوات ، كانت لدي خبرة في كتابة محطة لتبادل بورصة موسكو. كان جزء من الفريق مولعا بالتداول الخوارزمي ، بما في ذلك نفسي. ومع ذلك ، لم يكن ينظر إلى هذا النشاط التجاري أبدًا كمصدر حقيقي للدخل ، على الرغم من عدم تحقيق نجاح كبير في هذا المجال. من الواضح أن التنافس مع البنوك والصناديق المختلفة ، مع فرقهم من علماء الرياضيات والمبرمجين ، من الصعب والأسهل تنفيذه في مجالات أخرى.
الآن سمعت العملات المشفرة ، وقد ظهر عدد كبير من التبادلات. بناءً على افتراض أنه من الممكن كسب المال على أساس الفرق في أسعار الصرف في البورصات المختلفة ، قررت أن أدرس إمكانية إنشاء روبوت تحكيم. ولكن في الأساس ، لبدء تعلم الثعبان مع مثال حقيقي. لذلك دعونا نبدأ.
بادئ ذي بدء ، لا بد من الكشف عن أزواج العملات التي التداول المراجحة هو ممكن. نحتاج إلى أزواج ، في التقريب الأول ، يتم تداولها بنشاط ، وتباعد الأسعار في أسواق مختلفة وتتقارب.
مرتجلاً ، يجب أن تكون خطة العمل هكذا:
- إنشاء قاعدة بيانات حيث سيتم تخزين أسعار أزواج العملات.
- خادم يقوم بحفظ البيانات في قاعدة البيانات.
- التحليل الأساسي.
المصادر متاحة في
arb_analysis .
إنشاء قاعدة البيانات
لتخزين البيانات ، تحتاج إلى 3 جداول.
هذا الجدول سوف يخزن قائمة التبادلات.
CREATE TABLE `exchange` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM;
قائمة أزواج العملات المشفرة.
CREATE TABLE `market` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(50) NOT NULL, `id_exchange` int(11) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM; CREATE INDEX id_exchange ON market (id_exchange);
جدول معاملات ، سيتم أيضًا تخزين المعلومات هنا ، وفقًا للبيانات من زجاج البورصة.
CREATE TABLE `ticker` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_market` int(5) NOT NULL, `local_time` int(9) NOT NULL, `timestamp` int(9) NOT NULL, `last` DECIMAL (11,11) NOT NULL, `low` DECIMAL (11,11), `high` DECIMAL (11,11), `bid` DECIMAL (11,11), `ask` DECIMAL (11,11), PRIMARY KEY (id) ) ENGINE=MyISAM; CREATE INDEX id_market ON ticker (id_market);
الحصول على البيانات من التبادلات
لسهولة الوصول إلى التبادلات ، هناك مشروع مفتوح المصدر ccxt. مع مساعدة والتي من الممكن في نمط واحد للوصول إلى مختلف التبادلات. ومع ذلك ، اتضح أنه ليس كل شيء وردية للغاية ، بالنسبة لعدد من التبادلات ، لا يمكن الحصول على المعلومات ، ولم تنجح بعض الطرق.
في ملف create_markets.py ، تتم التهيئة ، نحصل على قائمة بأزواج العملات المشفرة ، عن طريق التبادل. في هذه الحالة ، يتم استخدام الأسلوب load_markets () ، والذي يعرض قائمة من أزواج التبادل.
name_exchange = ["acx", "binance", "bitfinex", "bitfinex2", "wex"] def create_exchange_and_market_in_db(): exchanges = {} for id in name_exchange: exchange = getattr(ccxt, id) exchanges[id] = exchange() id_exchage = db_helper.insert_exchage_to_db(exchanges[id],cnx,cursor) markets = exchanges[id].load_markets() for mark in markets: id_market = db_helper.insert_market_to_db( id_exchage, mark, cnx,cursor)
بعد ذلك ، في ملف ex_data_saver.py ، نبدأ في حفظ التغير في أسعار الأزواج:
def save(): markets = db_helper.get_data_exch() exchanges = {} for id in name_exchange: exchange = getattr(ccxt, id)
يحدث الاستلام غير المتزامن للقراد لزوج معين باستخدام طريقة ccxt fetchTickers ().
async def fetch_ticker(exchanges, name): item = exchanges[name] try: ticker = await item.fetchTickers() return {name:ticker}
تحليل البيانات الأولية
بادئ ذي بدء ، من المثير للاهتمام في أي بورصات وأي أزواج يتم تداولها الأكثر نشاطًا ، نحن مهتمون بالأزواج السائلة. للقيام بذلك ، تحتاج إلى حساب عدد المعاملات التي تم تجميعها بواسطة البورصات وأزواج محددة. نتيجة لذلك ، حصلنا على أزواج تتداول بنشاط.
SELECT ex.name as exchange_name, m.name as market_name, count(*) as count_deals FROM exchange ex LEFT JOIN market m ON m.id_exchange = ex.id LEFT JOIN ticker t ON t.id_market =m.id GROUP BY ex.id, t.id_market ORDER BY m.name HAVING count_deals > 10000;
باستخدام استعلامات SQL ، يمكنك العثور على أنماط متعددة وتصفية البيانات ، ومع ذلك ، لتحليل مفصل ، تحتاج إلى إنشاء روبوت اختبار يعمل على البيانات المتراكمة من التبادلات المختلفة.
سيتم تخصيص المقال التالي لإنشاء هذا الروبوت. وخادم الاختبار - محاكاة عمل التبادل الحقيقي ، أريد أن أضع النقاط التالية في خادم الاختبار: