· 5 years ago · Sep 08, 2020, 10:04 PM
1import hmac
2import hashlib
3import json
4import requests
5import pandas as pd
6import os
7import time
8from datetime import datetime, timedelta
9
10# You can only request 24-hour periods (this script requests 23 hour periods because ... rounding)
11periods = 90
12
13base_url = "https://api.crypto.com/v2/"
14
15## Add authentication details
16API_KEY = os.environ['CRYPTO_COM_API_KEY']
17SECRET_KEY = os.environ['CRYPTO_COM_API_SEC']
18
19try: # check to see if trades object already exists
20 trades
21except NameError:
22 print("No trades to delete")
23else:
24 del(trades)
25
26for j in range (0, periods):
27
28 print("Period", j)
29
30 if j == 0:
31 end_ts_dt = datetime.now() - timedelta(seconds = 15)
32 start_ts_dt = end_ts_dt - timedelta(hours = 23)
33 start_ts = round(start_ts_dt.timestamp() * 1000)
34 end_ts = round(end_ts_dt.timestamp() * 1000)
35 else:
36 end_ts_dt = start_ts_dt
37 start_ts_dt = end_ts_dt - timedelta(hours = 23)
38 start_ts = round(start_ts_dt.timestamp() * 1000)
39 end_ts = round(end_ts_dt.timestamp() * 1000)
40
41 for i in range(0,101):
42 print("Page ", i)
43 nonce = int(round(time.time() * 1000 - 15000))
44
45 req = {
46 "id": i+1,
47 "method": "private/get-trades",
48 "api_key": API_KEY,
49 "params": {
50 "end_ts": end_ts,
51 "page": i,
52 "page_size": 100,
53 "start_ts": start_ts
54 },
55 "nonce": nonce
56 }
57
58 paramString = ""
59
60 if "params" in req:
61 for key in req['params']:
62 paramString += key
63 paramString += str(req['params'][key])
64
65 sigPayload = req['method'] + str(req['id']) + req['api_key'] + paramString + str(req['nonce'])
66
67 req['sig'] = hmac.new(
68 bytes(str(SECRET_KEY), 'utf-8'),
69 msg=bytes(sigPayload, 'utf-8'),
70 digestmod=hashlib.sha256
71 ).hexdigest()
72
73 response = requests.post(base_url + "private/get-trades", json=req)
74
75 if response.json()['result']['trade_list'] == []:
76 time.sleep(1)
77 break
78
79 try: # check to see if fees already exists
80 trades
81 except NameError:
82 trades = pd.DataFrame.from_dict(response.json()['result']['trade_list'])
83 else:
84 trades = trades.append(pd.DataFrame.from_dict(response.json()['result']['trade_list']))
85
86 time.sleep(2)
87
88
89# Group trades that are made at the same time with the same details
90trades2 = trades.groupby(['side', 'create_time', 'instrument_name', 'order_id', 'fee_currency']).agg({'fee': 'sum', 'traded_price': 'mean', "traded_quantity": 'sum'}).reset_index()
91
92# Add total column
93trades2["Total"] = trades2.traded_price * trades2.traded_quantity
94
95# Rename columns
96trades2 = trades2.rename(columns={'create_time': 'Koinly Date', 'instrument_name': 'Pair', 'side': 'Side', "fee_currency": "Fee Currency", "fee": "Fee Amount", "traded_quantity": "Amount", "order_id": "Order ID"})
97
98# Reorder columns
99trades2 = trades2[['Koinly Date', 'Pair', 'Side', 'Amount', 'Total', 'Fee Amount', 'Fee Currency', 'Order ID']]
100
101# Fix time column
102trades2['Koinly Date'] = pd.to_datetime(trades2['Koinly Date'], unit='ms')
103# e.g. 2020-06-23T14:42:44+00
104trades2['Koinly Date'] = trades2['Koinly Date'].dt.strftime('%Y-%m-%dT%H:%M:%S+00')
105
106# Replace underscores in pairs with hyphen
107trades2.Pair = trades2.Pair.apply(lambda x: x.replace("_", "-"))
108
109# Write to CSV
110trades2.to_csv("crypto_com.csv")