In [52]:
exchange = "btc_eth"
starttime = "2016-12-18 05:10:30"
use_now = True
MySQL_dbname = 'poloniex'
MySQL_user = 'polo'
MySQL_passwd = 'polo'
import time
import datetime
def now():
return int(time.mktime(datetime.datetime.utcnow().timetuple()))
if use_now:
print ("starting from now")
print (datetime.datetime.utcnow())
start_timestamp = now()
else:
print ("starting from %s"%(starttime))
start_timestamp = int(time.mktime(datetime.datetime.strptime(starttime, "%Y-%m-%d %H:%M:%S").timetuple()))
print (start_timestamp)
In [ ]:
import datetime
import requests
#currency_pair: currency pair expression which is supported in poloniex, to: unixtime value
def get_url(currency_pair, end_unix):
poloniex_url_template = "https://poloniex.com/public?command=returnTradeHistory¤cyPair=%s&start=%s&end=%s"
SIXMONTHS = 60*60*24*30*6
ONEDAY = 60*60*24
ONWWEEK = 7*ONEDAY
date_range = ONEDAY
start_unix = end_unix - date_range
url = poloniex_url_template%(currency_pair, start_unix, end_unix)
print (url)
return url
def get_gmttime(lastdate):
#print(datetime.datetime.strptime(lastdate, "%Y-%m-%d %H:%M:%S"))
endtime = int(datetime.datetime.strptime(lastdate, "%Y-%m-%d %H:%M:%S").timestamp())+(9*60*60)
#print(endtime)
return endtime
def get_batch_list(total_size, batch_size=100):
total = [a for a in range(0, total_size)]
#print (total)
res = list()
while len(total) > 0:
bs = min(batch_size, len(total))
#print (bs)
a = total[:bs]
res.append(a)
if bs < len(total):
b = total[bs:]
total = b
else:
total = []
break
return res
def get_exchange_data(lasttime):
url = get_url(exchange.upper(), lasttime)
r = requests.get(url)
js = r.json()
if len(js) > 0:
lastdate = js[-1]['date']
endtime = get_gmttime(lastdate)
print ("downloaded %d items, by %s"%(len(js), lastdate))
return (js, endtime)
else:
print ("No data found")
return (js, "no date")
#print(js[:2])
#print(js[-2:])
In [ ]:
import MySQLdb
conn = MySQLdb.connect(db=MySQL_dbname, user=MySQL_user, passwd=MySQL_passwd)
curr = conn.cursor()
def execute_query(query):
try:
curr.execute(query)
except (MySQLdb.Error, MySQLdb.Warning) as e:
print ("MySQL Error [%d]: %s" % (e.args[0], e.args[1]))
except IndexError:
print ("MySQL Error: [%s]" % str(e))
def create_table_if_not_exists(tablename):
if not tablename:
return None
CREATE_TABLE_STATEMENT_TEMPLATE = """
CREATE TABLE IF NOT EXISTS `%s` (
`gTradeID` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`tradeID` INT(11) UNSIGNED NULL DEFAULT NULL,
`total` FLOAT UNSIGNED NULL DEFAULT NULL,
`rate` FLOAT UNSIGNED NULL DEFAULT NULL,
`amount` FLOAT UNSIGNED NULL DEFAULT NULL,
`type` CHAR(4) NOT NULL DEFAULT 'buy',
`date` DATETIME NOT NULL,
PRIMARY KEY (`gTradeID`),
INDEX `date` (`date`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
"""
query = CREATE_TABLE_STATEMENT_TEMPLATE%(tablename)
execute_query(query)
def get_db_size():
curr.execute("SELECT COUNT(*) FROM %s"%(exchange))
(number_of_rows,)=curr.fetchone()
return number_of_rows
In [ ]:
#make insert statement
def add_data(trade_json):
batch_size = 1000
batch = get_batch_list(len(trade_json), batch_size)
for bs in batch:
query = "insert into %s values "%(exchange)
first = True
for b in bs:
item = trade_json[b]
#print (item)
value = "(%d,%d,%s,%s,%s,'%s','%s')"%(item['globalTradeID'], item['tradeID'], item['total'], item['rate'], item['amount'], item['type'], item['date'])
if first:
first = False
else:
query += ','
query += value
#print ("processing %d"%(len(bs)))
#print (query)
execute_query(query)
#print ("done@@")
#print ("begin commit")
if len(batch) > 0:
conn.commit()
#print ("end commit")
print ("trade data count = %d"%(get_db_size()))
In [ ]:
create_table_if_not_exists(exchange)
lasttime = start_timestamp
prev_lasttime = 0
while prev_lasttime != lasttime:
prev_lasttime = lasttime
print (lasttime)
(js_result, lasttime) = get_exchange_data(lasttime)
#print js_result
#continue
if len(js_result) == 0:
break
#add trade data to db
add_data(js_result)