Bitcoin Forum
May 09, 2024, 04:48:46 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: « 1 2 [3]  All
  Print  
Author Topic: Sistemas y automatización  (Read 3756 times)
xcbtrader
Hero Member
*****
Offline Offline

Activity: 865
Merit: 1006


View Profile
July 05, 2016, 04:20:48 PM
 #41

Quote
¿Compartirás el código?

No me ha salido gratis, el que lo ha hecho cobra por su tiempo como es lógico. No tengo problema en compartirlo a cambio de una modesta colaboración.
Mándame un privado si quieres.

Je je je...

No sabia que habías pagado por el.
Yo también estoy trabajando en un código para, por una parte capturar valores de POLONIEX, y una vez tenemos los valores, empezar a buscar indicadores/estrategias para analizarlos.

Pongo de momento la captura y enseñar por pantalla los valores.
Ahora estoy con el cálculo del RSI y otros...

CODIGO:

Code:
__author__ = 'xcbtrader'
# -*- coding: utf-8 -*-
# PROGRAMA PARA AUTOTRADER EN BITCOINS UTILIZANDO LAS APIs DE POLONIEX

import urllib
import requests
import json
import time

class Clase_btc:
BTC_fecha = time.strftime('%d %b %y')
BTC_hora = time.strftime('%H:%M:%S')
BTC_last = 0.0
BTC_high24hr = 0.0
BTC_percentChange = 0.0
BTC_low24hr = 0.0
BTC_highestBid = 0.0
BTC_lowestAsk = 0.0
BTC_baseVolume = 0.0

def actualizar_valores(self):
err = True
while err:
try:
request = 'https://poloniex.com/public?command=returnTicker'
response = requests.get(request)
content = response.json()
err = False

self.BTC_fecha = time.strftime('%d %b %y')
self.BTC_hora = time.strftime('%H:%M:%S')
self.BTC_last = content ['USDT_BTC'] ['last']
self.BTC_high24hr = content ['USDT_BTC'] ['high24hr']
self.BTC_percentChange = content ['USDT_BTC'] ['percentChange']
self.BTC_low24hr = content ['USDT_BTC'] ['low24hr']
self.BTC_highestBid = content ['USDT_BTC'] ['highestBid']
self.BTC_lowestAsk = content ['USDT_BTC'] ['lowestAsk']
self.BTC_baseVolume = content ['USDT_BTC'] ['baseVolume']
except KeyboardInterrupt:
exit()
except:
print ('### ERROR DE CONEXION - ESPERANDO 10 SEGUNDOS ###')
err = True
time.sleep(10)

datosBTC = []
btcAct = Clase_btc()
n = 0
lapso = 60

while True:
btcAct.actualizar_valores()
datosBTC.append(btcAct)
print ('######################################################')
print ('  FECHA:      ' + datosBTC[n].BTC_fecha + ' -- ' + datosBTC[n].BTC_hora)
print ('  LAST:       ' + datosBTC[n].BTC_last)
print ('  HIGH24HR:   ' + datosBTC[n].BTC_high24hr)
print ('  MOVIMIENTO: ' + datosBTC[n].BTC_percentChange)
print ('  LOW24HR:    ' + datosBTC[n].BTC_low24hr)
print ('  HIGHESTBID: ' + datosBTC[n].BTC_highestBid)
print ('  LOWESTASK:  ' + datosBTC[n].BTC_lowestAsk)
print ('  BASEVOLUME: ' + datosBTC[n].BTC_baseVolume)
print ('######################################################')
print ('ESPERANDO ' + str(lapso) + ' SEGUNDOS')
n +=1
time.sleep(lapso)

1715230126
Hero Member
*
Offline Offline

Posts: 1715230126

View Profile Personal Message (Offline)

Ignore
1715230126
Reply with quote  #2

1715230126
Report to moderator
1715230126
Hero Member
*
Offline Offline

Posts: 1715230126

View Profile Personal Message (Offline)

Ignore
1715230126
Reply with quote  #2

1715230126
Report to moderator
1715230126
Hero Member
*
Offline Offline

Posts: 1715230126

View Profile Personal Message (Offline)

Ignore
1715230126
Reply with quote  #2

1715230126
Report to moderator
"There should not be any signed int. If you've found a signed int somewhere, please tell me (within the next 25 years please) and I'll change it to unsigned int." -- Satoshi
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1715230126
Hero Member
*
Offline Offline

Posts: 1715230126

View Profile Personal Message (Offline)

Ignore
1715230126
Reply with quote  #2

1715230126
Report to moderator
1715230126
Hero Member
*
Offline Offline

Posts: 1715230126

View Profile Personal Message (Offline)

Ignore
1715230126
Reply with quote  #2

1715230126
Report to moderator
Krako
Sr. Member
****
Offline Offline

Activity: 407
Merit: 250



View Profile
July 05, 2016, 07:28:24 PM
 #42


Yo también estoy trabajando en un código para, por una parte capturar valores de POLONIEX, y una vez tenemos los valores, empezar a buscar indicadores/estrategias para analizarlos.

Pongo de momento la captura y enseñar por pantalla los valores.
Ahora estoy con el cálculo del RSI y otros...

CODIGO:

Code:
__author__ = 'xcbtrader'
# -*- coding: utf-8 -*-
# PROGRAMA PARA AUTOTRADER EN BITCOINS UTILIZANDO LAS APIs DE POLONIEX

import urllib
import requests
import json
import time

class Clase_btc:
BTC_fecha = time.strftime('%d %b %y')
BTC_hora = time.strftime('%H:%M:%S')
BTC_last = 0.0
BTC_high24hr = 0.0
BTC_percentChange = 0.0
BTC_low24hr = 0.0
BTC_highestBid = 0.0
BTC_lowestAsk = 0.0
BTC_baseVolume = 0.0

def actualizar_valores(self):
err = True
while err:
try:
request = 'https://poloniex.com/public?command=returnTicker'
response = requests.get(request)
content = response.json()
err = False

self.BTC_fecha = time.strftime('%d %b %y')
self.BTC_hora = time.strftime('%H:%M:%S')
self.BTC_last = content ['USDT_BTC'] ['last']
self.BTC_high24hr = content ['USDT_BTC'] ['high24hr']
self.BTC_percentChange = content ['USDT_BTC'] ['percentChange']
self.BTC_low24hr = content ['USDT_BTC'] ['low24hr']
self.BTC_highestBid = content ['USDT_BTC'] ['highestBid']
self.BTC_lowestAsk = content ['USDT_BTC'] ['lowestAsk']
self.BTC_baseVolume = content ['USDT_BTC'] ['baseVolume']
except KeyboardInterrupt:
exit()
except:
print ('### ERROR DE CONEXION - ESPERANDO 10 SEGUNDOS ###')
err = True
time.sleep(10)

datosBTC = []
btcAct = Clase_btc()
n = 0
lapso = 60

while True:
btcAct.actualizar_valores()
datosBTC.append(btcAct)
print ('######################################################')
print ('  FECHA:      ' + datosBTC[n].BTC_fecha + ' -- ' + datosBTC[n].BTC_hora)
print ('  LAST:       ' + datosBTC[n].BTC_last)
print ('  HIGH24HR:   ' + datosBTC[n].BTC_high24hr)
print ('  MOVIMIENTO: ' + datosBTC[n].BTC_percentChange)
print ('  LOW24HR:    ' + datosBTC[n].BTC_low24hr)
print ('  HIGHESTBID: ' + datosBTC[n].BTC_highestBid)
print ('  LOWESTASK:  ' + datosBTC[n].BTC_lowestAsk)
print ('  BASEVOLUME: ' + datosBTC[n].BTC_baseVolume)
print ('######################################################')
print ('ESPERANDO ' + str(lapso) + ' SEGUNDOS')
n +=1
time.sleep(lapso)

Que guay, que envidia me dais los que sabéis programar cosas, yo lo único que se es "toquitear" y enredar  Cheesy
Suerte con tu proyecto!
xcbtrader
Hero Member
*****
Offline Offline

Activity: 865
Merit: 1006


View Profile
July 06, 2016, 03:58:09 PM
 #43

Las mejoras de hoy...

Ya calcula el RSI i el máximo/minimo de un periodo.

El periodo depende del número de capturas que haga y del tiempo entre capturas.
En el ejemplo puesto:

lapso = 30  Esto indica 30 segundos entre lecturas.
perRSI = 120 Esto indica 120 lecturas para estudiar el RSI. Aprox. 1 Hora

El programa guarda un fichero con los valores capturados, una vez empieza a contar el RSI.
Tened en cuanta que el RSI no empieza a marcar hasta que no se ha llegado al número mínimo de lecturas.

Yo no soy programador, por lo tanto, este programa hay que utilizarlo con cuidado...

Code:
__author__ = 'xcbtrader'
# -*- coding: utf-8 -*-
# PROGRAMA PARA AUTOTRADER EN BITCOINS UTILIZANDO LAS APIs DE POLONIEX

import urllib
import requests
import json
import time

class Clase_btc:
BTC_fecha = time.strftime('%d %b %y')
BTC_hora = time.strftime('%H:%M:%S')
BTC_last = 0.0
BTC_high24hr = 0.0
BTC_percentChange = 0.0
BTC_low24hr = 0.0
BTC_highestBid = 0.0
BTC_lowestAsk = 0.0
BTC_baseVolume = 0.0

def actualizar_valores(self):
err = True
while err:
try:
request = 'https://poloniex.com/public?command=returnTicker'
response = requests.get(request)
content = response.json()
err = False

self.BTC_fecha = time.strftime('%d %b %y')
self.BTC_hora = time.strftime('%H:%M:%S')
self.BTC_last = content ['USDT_BTC'] ['last']
self.BTC_high24hr = content ['USDT_BTC'] ['high24hr']
self.BTC_percentChange = content ['USDT_BTC'] ['percentChange']
self.BTC_low24hr = content ['USDT_BTC'] ['low24hr']
self.BTC_highestBid = content ['USDT_BTC'] ['highestBid']
self.BTC_lowestAsk = content ['USDT_BTC'] ['lowestAsk']
self.BTC_baseVolume = content ['USDT_BTC'] ['baseVolume']
except KeyboardInterrupt:
exit()
except:
print ('### ERROR DE CONEXION - ESPERANDO 10 SEGUNDOS ###')
err = True
time.sleep(10)
def imprimir_valores(self):
print ('######################################################')
print ('  FECHA:      ' + self.BTC_fecha + ' -- ' + self.BTC_hora)
print ('  LAST:       ' + self.BTC_last)
print ('  HIGH24HR:   ' + self.BTC_high24hr)
print ('  MOVIMIENTO: ' + self.BTC_percentChange)
print ('  LOW24HR:    ' + self.BTC_low24hr)
print ('  HIGHESTBID: ' + self.BTC_highestBid)
print ('  LOWESTASK:  ' + self.BTC_lowestAsk)
print ('  BASEVOLUME: ' + self.BTC_baseVolume)

def RSI(periodo):
global datosBTC

final = len(datosBTC)
if periodo > final:
print('### ERROR PERIODO RSI INCORRECTO ###')
return 0

inicio = final - periodo
incMed = 0.0
decMed = 0.0
for d in range (inicio, final):
incRSI = round((float(datosBTC[d].BTC_last) - float(datosBTC[d-1].BTC_last))/float(datosBTC[d-1].BTC_last),10)
if incRSI != 0:
if incRSI > 0:
incMed = incMed + incRSI
else:
decMed = decMed + abs(incRSI)
incMed = round(incMed/periodo,10)
decMed = round(decMed/periodo,10)
if decMed > 0:
return float(100-(100/(1+(incMed/decMed))))
else:
return float(100-(100/(1+incMed)))

def calcular_MinMax(periodo):
global datosBTC, vMinBTC, vMaxBTC
# CALCULA VALOR MAX Y VALOR MIN DE UN PERIODO. SI PONEMOS 0 COGE TODOS LOS DATOS
if periodo == 0:
vMinBTC = round(float(datosBTC[0].BTC_last),10)
vMaxBTC = round(float(datosBTC[0].BTC_last),10)
for d in range (1,len(datosBTC)):
if datosBTC[d].BTC_last > vMaxBTC:
vMaxBTC = datosBTC[d].BTC_last
if datosBTC[d].BTC_last < vMinBTC:
vMinBTC = datosBTC[d].BTC_last
else:
final = len(datosBTC)
inicio = final - periodo
if inicio < 0:
print ('### ERROR - PERIODO INCORRECTO ###')
return
vMinBTC = round(float(datosBTC[inicio].BTC_last),10)
vMaxBTC = round(float(datosBTC[inicio].BTC_last),10)
for d in range (inicio,final):
if datosBTC[d].BTC_last > vMaxBTC:
vMaxBTC = datosBTC[d].BTC_last
if datosBTC[d].BTC_last < vMinBTC:
vMinBTC = datosBTC[d].BTC_last
#PROGRAMA PRINCIPAL #################################################
global datosBTC, vMinBTC, vMaxBTC

datosBTC = []

n = 0
lapso = 30
perRSI = 120
vMinBTC = 0.0
vMaxBTC = 0.0

fEstadist = open('./EstPoloniexAPI.txt', 'a')

while True:
btcAct = Clase_btc()
btcAct.actualizar_valores()
datosBTC.append(btcAct)
btcAct.imprimir_valores()
if n > perRSI:
Vrsi = RSI(perRSI)
fEstadist.write(str(btcAct.BTC_fecha) + ';' + str(btcAct.BTC_hora) + ';' + str(btcAct.BTC_last) + ';' + str(Vrsi) + ';' + str(vMinBTC) + ';' + str(vMaxBTC) + '\n')
print ('  >>RSI' + str(perRSI) + ':     ' + str(Vrsi))
else:
print ('  >>RSI:    ####' )
if n > perRSI:
calcular_MinMax(perRSI)
print ('  >>ValMin:   ' + str(vMinBTC))
print ('  >>ValMax:   ' + str(vMaxBTC))
else:
print ('  >>ValMin: ####')
print ('  >>ValMax: ####')
print ('######################################################')
print ('ESPERANDO ' + str(lapso) + ' SEGUNDOS')
n +=1
time.sleep(lapso)

fEstadist.close()

xcbtrader
Hero Member
*****
Offline Offline

Activity: 865
Merit: 1006


View Profile
July 07, 2016, 02:44:45 PM
 #44

He añadido este programa y otro que ya tenía a Github:

https://github.com/xcbtrader

Saludos

Krako
Sr. Member
****
Offline Offline

Activity: 407
Merit: 250



View Profile
July 09, 2016, 10:12:54 AM
Last edit: July 09, 2016, 11:01:25 AM by Krako
 #45

Os dejo unas capturas de como se hubiera comportado el bot desde el 1 de junio hasta ayer.
He hecho algunas modificaciones en el código original, para que por ejemplo no compre aunque haya habido sobreventa y el WMA se haya dado la vuelta si cuando toca comprar RSI esta marcando sobrecompra (o lo contrario para cortos), también para que cuando salte el stoposs no lo ejecute hasta que precio no esté sobrecomprado/sobrevendido. Lo he afinado para el marco de 15' con este setup:

Quote
INTERVAL = 900
WMA_PERIOD = 14
WMA_SLOPE_DEPTH = 5
WMA_SLOPE_MAX = 0.2
WMA_SLOPE_MIN = -0.2
RSI_TYPE = 'wilder' #['wilder', 'cutler, 'modern']
RSI_PERIOD = 16
OVERBOUGHT = 75
OVERSOLD = 27
SAFE_LONG = 1.25 #[1.00, Not safe = 1]
SAFE_SHORT = 0.75 #[0.xx, Not safe = 1]
RSI_DEPTH = 60
HIGH_DEPTH = 16
LOW_DEPTH = 16
STOPLOSS_CURRENCY = 0.970
STOPLOSS_ASSETS = 1.030





dserrano5
Legendary
*
Offline Offline

Activity: 1974
Merit: 1029



View Profile
July 09, 2016, 10:50:33 AM
 #46

Ahora necesitas estadísticas monas, que no todo en un sistema es la pasta que saca Wink Por ejemplo, este es uno de los míos contra Antena 3, en la bolsa de verdad:

Code:
+----------------------------------------------------+
|                       Trades                       |
+-------+--------------+--------------+--------------+
|       |long          |short         |total         |  
+-------+--------------+--------------+--------------+
|winning|   8 ( 34.78%)|  12 ( 54.55%)|  20 ( 44.44%)|
|losing |  15 ( 65.22%)|  10 ( 45.45%)|  25 ( 55.56%)|
|total  |  23 (100.00%)|  22 (100.00%)|  45 (100.00%)|
+-------+--------------+--------------+--------------+

+----------------------------------------+
|             Total profits              |
+-------+----------+----------+----------+
|       |long      |short     |total     |
+-------+----------+----------+----------+
|winning|  328.53% |  178.98% | 1095.49% |
|losing |  -60.88% |  -53.17% |  -81.68% |
|net    |   67.66% |   30.64% |  119.02% | (6.67% annual, 1.76% per trade)
|ratio  |          |          |   13.41  |
+-------+----------+----------+----------+
Maximum drawdown: 50.17%
B/H pct gain/loss: 285.17% (11.74% annual)

+-----------------------------------+
|     Statistics about profits      |
+-----+---------+---------+---------+
|     |largest  |average  |median   |
+-----+---------+---------+---------+
|win  |  83.27% |  14.23% |  10.24% |
|loss | -22.06% |  -6.44% |  -5.13% |
|ratio|   3.78  |   2.21  |   2.00  |
+-----+---------+---------+---------+
Largest pct loss / Annual pct gain/loss: 3.31 years to recover largest loss

+-------------------------------------------------+
|                     Durations                   |
+-----+----------------+------+---------+---------+
|     |total           |max   |average  |median   |
+-----+----------------+------+---------+---------+
|win  |  883 ( 28.67%) |  101 |   44.15 |   47.50 |
|loss |  432 ( 14.03%) |   59 |   17.28 |   14.00 |
|out  | 1765 ( 57.31%) |  217 |   38.37 |   29.50 |
|total| 3080           |      |         |         |
+-----+----------------+------+---------+---------+
Most consecutive wins/losses: 3/8
Current position after 4435 days: Out
Expectancy: 2.74
Krako
Sr. Member
****
Offline Offline

Activity: 407
Merit: 250



View Profile
July 09, 2016, 03:28:52 PM
 #47

Ahora necesitas estadísticas monas, que no todo en un sistema es la pasta que saca Wink Por ejemplo, este es uno de los míos contra Antena 3, en la bolsa de verdad:

Pues si estaría bien, ¿no hay por ahí nada que se  usar que este ya hecho?
aTg (OP)
Legendary
*
Offline Offline

Activity: 1358
Merit: 1000



View Profile
July 10, 2016, 07:09:40 AM
 #48

Por ejemplo, este es uno de los míos contra Antena 3

Justamente estoy haciendo esto mismo en qtbtct, que el bot lance por el log las estadísticas en tiempo real y le estoy dando la misma estética que cgminer Cheesy Pero en mi programa se reinician y no se almacenan.

Veo que vamos cada uno por un lado distinto.

dserrano5
Legendary
*
Offline Offline

Activity: 1974
Merit: 1029



View Profile
July 25, 2016, 06:22:36 PM
Last edit: July 25, 2016, 06:36:35 PM by dserrano5
 #49

Esto es lo que estuve haciendo este viernes y sábado pasados:



La gráfica es de bitcoin, semanal. Las líneas azules que siguen al precio son, como puede suponerse, medias móviles. Tanto el precio como estas medias se corresponden con la escala de la izquierda.

Aparte, usando otra escala diferente (que no está pintada porque realmente no hace falta) hay 3 lineas horizontales de color añil, en +x, 0 y -x. La línea roja es el resultado de dividir las medias móviles entre sí; por tanto cuando las medias se cruzan, la roja atraviesa el nivel 0 (las típicas señales por cruce de medias de toda la vida). Cuando la línea roja sube, el escenario es positivo para estar largo (la media móvil de corto plazo está por debajo de la otra y se acerca, o está por encima de la otra y la deja atrás). Inversamente, cuando la línea roja baja, lo suyo es estar corto. La línea púrpura es una media móvil sobre la roja. El cruce de la roja con la púrpura nos da las señales para operar. La línea verde es otra representación de este cruce, de la misma forma que la línea roja representa al cruce de las medias sobre el precio. Cuando la verde está por encima de 0, largos; cuando está por debajo; cortos. Está exagerada verticalmente para que los cruces con el nivel 0 se vean claramente.

Ahora bien, puede ocurrir que la señal a veces llegue demasiado pronto. Por ejemplo al principio de la gráfica, el 8 de marzo, tenemos una señal para abrir largo, pero puede verse que las medias móviles están bajando con bastante alegría y, aunque en este caso particular no hay graves daños, lo normal es que sí los haya, que el precio mantenga la tendencia a la baja y las líneas roja y púrpura se vuelvan a separar (o sea, que la verde vuelva a bajar de 0). Esta es la razón por la que están las otras dos líneas añil. Realmente no abrimos largo hasta que la roja supera el nivel -x, es decir, el 3 de mayo. Y cogemos hasta un precio mejor y todo Smiley. Cerramos largo cuando la verde baja de 0, el 28 de junio. Aquí abriríamos corto, y lo hacemos realmente porque la roja está por debajo de +x. El precio se da la vuelta y en la siguiente vela volvemos a largo. […] Hay un par de señales más hasta que el 24 de enero la verde cruza hacia abajo, pero la roja está muy arriba (las medias sobre el precio están subiendo mucho), así que solo cerramos largo y nos salimos. El corto se abre el 6 de marzo.

Estas señales son patéticas, pero es que los períodos de las tres medias y el valor de x no son los óptimos para bitcoin semanal.

Este sistema da beneficios con bitcoin, Antena 3, Abertis, Abengoa, ACS, Acerinox, Amadeus, Acciona, BBVA… pero con Bankia me lo ha perdido todo en una sola operación (ejem, sube de 1€ a 6€ en una sola vela, para que luego hablen de la volatilidad de bitcoin xD). Ahora estoy analizando Bankinter Tongue
Krako
Sr. Member
****
Offline Offline

Activity: 407
Merit: 250



View Profile
August 09, 2016, 08:41:34 AM
Last edit: August 09, 2016, 09:25:25 AM by Krako
 #50

Me ha costado lo mío digerir tu explicación, pero creo que lo he pillado.
Gracias por compartirllo !! Lo que a mi el marco semanal para BTC se me hace eteeeeerno

Por mi lado ha transcurrido un mes desde que tengo automatizada mi estrategia el marco de 15' y así es como se ha comportado en el último mes.



No está mal... ¿que opinais?
franckuestein
Legendary
*
Offline Offline

Activity: 1960
Merit: 1130


Truth will out!


View Profile WWW
August 22, 2016, 06:36:44 PM
 #51

Para los que seáis de Javascript también tenéis alguna que otra cosilla por Github con la que empezar, se trata de Gekko. Un bot de trading en node.
https://github.com/askmike/gekko

Antes de ir a la batalla y arriesgar tenéis la opción de realizar backtests basados en los históricos de las cotizaciones. También incluye estrategias básicas basadas en:
DEMA
MACD
PPO
RSI
StochRSI
CCI
talib-macd
https://github.com/askmike/gekko/blob/stable/docs/Trading_methods.md

y aquí explican como podéis realizar vuestra propia operativa Wink
Soporta bastantes exchanges: https://github.com/askmike/gekko#supported-exchanges

Hilo en bitcointalk: https://bitcointalk.org/index.php?topic=209149.0

[ AVAILABLE SIGNATURE SPACE ]
Pages: « 1 2 [3]  All
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!