-
Notifications
You must be signed in to change notification settings - Fork 1
/
exchange_data.py
230 lines (161 loc) · 8.55 KB
/
exchange_data.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
from binance.cm_futures import CMFutures
from datetime import date,datetime
import time
import datetime
import config as cf
import pandas as pd
import config as cf
def get_lista_cryptos()->pd.DataFrame:
"""crea una conexion a la api del exchange y extrae
los pares operables de futuros, los devuelve como
un dataframe"""
client = CMFutures(key=cf.FUTURES_API_KEY, secret=cf.FUTURES_SECRET_KEY)
info=client.account()
#extraemos la lista de cryptos disponibles del objeto cliente
serie_symbol=pd.DataFrame(info['positions'])["symbol"]
#convertimos la serie en un df
df_symbol=serie_symbol.to_frame(name="crypto")
# Renombrar índice, para que comience desde 1
id_columna = list(range(1, len(df_symbol)+1))
df_symbol['id'] = id_columna
#df_symbol = df_symbol.rename(index=lambda x: x+1)
df_symbol=df_symbol.set_index('id')
return df_symbol
def get_lista_timeframes()->pd.DataFrame:
"""crea un dataframe con los timeframe operables
en el exchange"""
#trabajamos en los periods indicados en config
periods=cf.PERIODS
#creamos un df a partir de la lista periods
df_periods=pd.DataFrame(periods)
#renombramos la unica columna
df_periods.columns=["period"]
#renombramos los indices para que empiece en 1
#df_periods = df_periods.rename(index=lambda x: x+1)
id_columna = list(range(1, len(df_periods)+1))
df_periods['id'] = id_columna
#df_symbol = df_symbol.rename(index=lambda x: x+1)
df_periods=df_periods.set_index('id')
return df_periods
def str_to_unix_time(strtime:str):
"""Devuelve fecha en formato unixtime a partir de
una fecha en str,
ej: "2020,12,24",
strtime:str
"""
try:
#separamos el string de entrada y casteamos cada elemento a int
anio,mes,dia=map(int,strtime.split(","))
#creamos la fecha a partir de los datos ingresados
date_time = date(anio, mes, dia)
#convertinos la fecha a unixtime
unix_time=time.mktime(date_time.timetuple())
#adecuamos a int y milisegundos
unix_time=int(unix_time)*1000
return unix_time
except Exception as e:
print("ingrese una fecha a partir de 1970 en fomrato 'anio,mes,dia', ej:2020,12,24", e)
def unix_time_to_datetime(unix_time:int):
unix_time=unix_time/1000#para convertir a segundos
return datetime.datetime.fromtimestamp(unix_time)
def get_the_last_200_days_info(crypto:str,period:str,n_days=int)->pd.DataFrame:
"""crea una conexion a la api del exchange y extrae datos
segun los parametros y devuelve un dataframe"""
#main setup
crypto=crypto
period=period
fecha_actual = datetime.datetime.now().date()
dias_a_restar = datetime.timedelta(n_days)
fecha_resultado = fecha_actual - dias_a_restar
start_time=str_to_unix_time(fecha_resultado.strftime('%Y,%m,%d'))
finish_time=str_to_unix_time(fecha_actual.strftime('%Y,%m,%d'))
client = CMFutures(key=cf.FUTURES_API_KEY, secret=cf.FUTURES_SECRET_KEY)
output_df=pd.DataFrame()
#traemos 500 velas, de las cuales usaremos la ULTIMA es la referencia, y la primera se utilizara para solicitar el resto
#debemos traer desde atras para adelante los valores, para poder armar todo el dataframe
binance_df=pd.DataFrame(client.klines(symbol=crypto,interval=period,startTime=start_time,endTime=finish_time))
binance_titles=["Open time","Open","High","Low","Close","Volume","Close time","Quote asset volume","Number of trades","Taker buy base asset volume","Taker buy quote asset volume","ignore"]
binance_df.columns=binance_titles
#debemos buscar los tiempos en los limites del dataframe
inicial_requested_unix_time=dict(binance_df.iloc[0])["Open time"]#contenido de la primera vela
final_requested_unix_time=dict(binance_df.iloc[499])["Open time"]#contenido de la ultima vela
output_df=binance_df
if inicial_requested_unix_time>=start_time:
repeat=True
while repeat==True:
try:
#es decir que todavia no se alcanzo el starttime, debemos volver a solicitar las barras
binance_df=pd.DataFrame(client.klines(symbol=crypto,interval=period,startTime=start_time,endTime=inicial_requested_unix_time))
binance_titles=["Open time","Open","High","Low","Close","Volume","Close time","Quote asset volume","Number of trades","Taker buy base asset volume","Taker buy quote asset volume","ignore"]
binance_df.columns=binance_titles
#agregamos los nuevos datos al dataframe existente
output_df = pd.concat([binance_df, output_df], ignore_index=True)#, keys=['nuevo', 'viejo'])
#debemos buscar los tiempos en los limites del dataframe
inicial_requested_unix_time=dict(binance_df.iloc[0])["Open time"]
final_requested_unix_time=dict(binance_df.iloc[499])["Open time"]
if inicial_requested_unix_time<=start_time:
repeat=False
except Exception as e:
repeat=False
output_df.drop_duplicates()
return output_df
def dataframe_trans_to_ORM(dataframe:pd.DataFrame)->pd.DataFrame:
"""adecual el dataframe para crear una columna id, para el mapeo del ORM"""
#En caso de existir indices duplicados , los eliminamos
dataframe.drop_duplicates()
# Selecciona todas las filas y las 6 primeras columnas, y nos queda asi
#["Open time","Open","High","Low","Close","Volume"]
dataframe = dataframe.iloc[:, :6]
#convertimos la primera fila que esta en formato unix time ms a datetime
dataframe["Open time"] = pd.to_datetime(dataframe["Open time"], unit='ms')
#establecemosla columna "Open time como indice del dataaframe"
id_columna = list(range(1, len(dataframe)+1))
dataframe['id'] = id_columna
#dataframe=dataframe.set_index("Open time")
dataframe["Open"] = dataframe["Open"].astype(float)
dataframe["High"] = dataframe["High"].astype(float)
dataframe["Low"] = dataframe["Low"].astype(float)
dataframe["Close"] = dataframe["Close"].astype(float)
dataframe["Volume"] = dataframe["Volume"].astype(float)
dataframe = dataframe.rename(columns={'Open time': 'Time'})
dataframe=dataframe.set_index('id')
return dataframe
def dataframe_trans_to_testing(dataframe:pd.DataFrame)->pd.DataFrame:
"""Convierte directo de binance a un formato aplicable al testing"""
#En caso de existir indices duplicados , los eliminamos
dataframe.drop_duplicates()
# Selecciona todas las filas y las 6 primeras columnas, y nos queda asi
#["Open time","Open","High","Low","Close","Volume"]
dataframe = dataframe.iloc[:, :6]
#convertimos la primera fila que esta en formato unix time ms a datetime
dataframe["Open time"] = pd.to_datetime(dataframe["Open time"], unit='ms')
#establecemosla columna "Open time como indice del dataaframe"
dataframe["Open"] = dataframe["Open"].astype(float)
dataframe["High"] = dataframe["High"].astype(float)
dataframe["Low"] = dataframe["Low"].astype(float)
dataframe["Close"] = dataframe["Close"].astype(float)
dataframe["Volume"] = dataframe["Volume"].astype(float)
dataframe.rename(columns={'Open time': 'Time'},inplace=True)
print(dataframe)
return dataframe
def dataframe_trans_2(dataframe:pd.DataFrame)->pd.DataFrame:
"""Convierte directo de binance a un formato aplicable al testing"""
#En caso de existir indices duplicados , los eliminamos
dataframe.drop_duplicates()
# Selecciona todas las filas y las 6 primeras columnas, y nos queda asi
#["Open time","Open","High","Low","Close","Volume"]
dataframe = dataframe.iloc[:, :6]
#convertimos la primera fila que esta en formato unix time ms a datetime
dataframe["Open time"] = pd.to_datetime(dataframe["Open time"], unit='ms')
dataframe["Open"] = dataframe["Open"].astype(float)
dataframe["High"] = dataframe["High"].astype(float)
dataframe["Low"] = dataframe["Low"].astype(float)
dataframe["Close"] = dataframe["Close"].astype(float)
dataframe["Volume"] = dataframe["Volume"].astype(float)
dataframe.rename(columns={'Open time': 'Time'},inplace=True)
return dataframe
if __name__=="__main__":
print(get_lista_cryptos())
print(get_lista_timeframes())
print(get_the_last_200_days_info("BTCUSD_PERP","5m",30))
print(dataframe_trans_2(get_the_last_200_days_info("BTCUSD_PERP","5m",30)))