初学者仲裁系统,第1部分

大约7年前,我曾为莫斯科交易所编写终端。 团队的一部分都喜欢算法交易,包括我自己。 但是,他从未将这项业务视为真正的收入来源,尽管在这方面几乎没有成功。 显然,要与银行和各种基金以及他们的数学家和程序员组成的团队竞争,在其他领域实施起来既困难又容易。

现在听到了加密货币,出现了许多交易所。 基于可以通过不同交易所的汇率差异赚钱的假设,我决定研究创建仲裁机器人的可能性。 但基本上,要开始用一个真实的例子学习python。 因此,让我们开始吧。

首先,需要检测可以进行套利交易的货币对。 我们需要一对近似地,活跃地交易的货币对,并且不同交易所的价格会发生分歧和收敛。

临时,工作计划应如下所示:

  • 创建一个将存储货币对价格的数据库。
  • 将数据保存到数据库的服务器。
  • 初步分析。

来源可从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) #isHas = exchange.hasFetchTickers #if isHas: exchanges[id] = exchange({ 'enableRateLimit': True, # or .enableRateLimit = True later }) cnx = db_helper.CreateConnection() cursor = cnx.cursor() loop = asyncio.get_event_loop() while True: start_time = time.time() input_coroutines = [fetch_ticker(exchanges, name) for name in exchanges] exch_tickers = loop.run_until_complete(asyncio.gather(*input_coroutines, return_exceptions=True)) count_exchange = 0 delta = time.time() - start_time for tickers in exch_tickers: if tickers is not None: count_exchange+=1 inserted_start = time.time() db_helper.insert_tick(markets,exch_tickers,cnx,cursor) inserted_time = time.time() print(count_exchange," ", delta, ' ', inserted_start - inserted_time) 

使用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查询,您可以找到各种模式并过滤掉数据,但是,为了进行详细的分析,您需要创建一个测试机器人,该机器人可以处理从各种交换所累积的数据。

下一篇文章将专门介绍该机器人的创建。 还有测试服务器-模拟真实交换的工作,我想在测试服务器中说明以下几点:

  • 延误。
  • 滑点。
  • 佣金。

Source: https://habr.com/ru/post/zh-CN436062/


All Articles