рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рдордзреНрдпрд╕реНрдерддрд╛ рдкреНрд░рдгрд╛рд▓реА, рднрд╛рдЧ 1

рд▓рдЧрднрдЧ 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) #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/hi436062/


All Articles