El soporte de datos de cotizaciones de mercado es indispensable al investigar, diseñar y backtestar estrategias comerciales. No es realista recopilar todos los datos de cada mercado, después de todo, la cantidad de datos es demasiado grande. Para el mercado de divisas digitales, la plataforma FMZ admite datos de backtest limitados para intercambios y pares comerciales. Si desea backtestar algunos intercambios y pares comerciales que temporalmente no estaban soportados por la plataforma FMZ, puede usar una fuente de datos personalizada para backtest, pero esta premisa requiere que tenga datos. Por lo tanto, existe una necesidad urgente de un programa de recopilación de cotizaciones de mercado, que puede persistir y obtenerse mejor en tiempo real.
De esta manera, podemos resolver varias necesidades, tales como:
y muchos más...
Tenemos la intención de usar Python para lograr esto, ¿por qué?
La biblioteca de Python de Python
Debido a que usted necesita utilizar la base de datos para el almacenamiento persistente.MongoDB
y el lenguaje Python se utiliza para escribir el programa de colección, por lo que la biblioteca de controladores de esta base de datos es necesaria.
Sólo instalepymongo
en Python.
Instale MongoDB en el dispositivo de alojamiento Por ejemplo: MacOS instala MongoDB, también lo mismo que el sistema Windows instala MongoDB. Hay muchos tutoriales en línea. Tome la instalación del sistema MacOS como ejemplo:
Descargar Enlace para descargar:https://www.mongodb.com/download-center?jmp=nav#community
Descifrado
Después de descargar, descifrar al directorio:/usr/local
Configuración de las variables de entorno
Entrada del terminal:open -e .bash_profile
, después de abrir el expediente, escribir:exportPATH=${PATH}:/usr/local/MongoDB/bin
Después de guardar, en el terminal, utilizasource .bash_profile
para que los cambios entren en vigor.
Configurar manualmente el directorio de archivos de la base de datos y el directorio de registro
Crear la carpeta correspondiente en el directorio/usr/local/data/db
¿ Qué pasa?
Crear la carpeta correspondiente en el directorio/usr/local/data/logs
.
Editar el archivo de configuraciónmongo.conf
:
#bind_ip_all = true # Any computer can connect
bind_ip = 127.0.0.1 # Local computer can access
port = 27017 # The instance runs on port 27017 (default)
dbpath = /usr/local/data/db # data folder storage address (db need to be created in advance)
logpath = /usr/local/data/logs/mongodb.log # log file address
logappend = false # whether to add or rewrite the log file at startup
fork = false # Whether to run in the background
auth = false # Enable user verification
el comando:
./mongod -f mongo.conf
use admin;
db.shutdownServer();
El recolector opera como una estrategia de robot Python en la plataforma FMZ. Acabo de implementar un ejemplo simple para mostrar las ideas de este artículo.
Código del programa del colector:
import pymongo
import json
def main():
Log("Test data collection")
# Connect to the database service
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# Create a database
huobi_DB = myDBClient["huobi"]
# Print the current database table
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# Check if the table is deleted
arrDropNames = json.loads(dropNames)
if isinstance(arrDropNames, list):
for i in range(len(arrDropNames)):
dropName = arrDropNames[i]
if isinstance(dropName, str):
if not dropName in collist:
continue
tab = huobi_DB[dropName]
Log("dropName:", dropName, "delete:", dropName)
ret = tab.drop()
collist = huobi_DB.list_collection_names()
if dropName in collist:
Log(dropName, "failed to delete")
else :
Log(dropName, "successfully deleted")
# Create the records table
huobi_DB_Records = huobi_DB["records"]
# Request data
preBarTime = 0
index = 1
while True:
r = _C(exchange.GetRecords)
if len(r) < 2:
Sleep(1000)
continue
if preBarTime == 0:
# Write all BAR data for the first time
for i in range(len(r) - 1):
# Write one by one
bar = r[i]
huobi_DB_Records.insert_one({"index": index, "High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]})
index += 1
preBarTime = r[-1]["Time"]
elif preBarTime != r[-1]["Time"]:
bar = r[-2]
huobi_DB_Records.insert_one({"index": index, "High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]})
index += 1
preBarTime = r[-1]["Time"]
LogStatus(_D(), "preBarTime:", preBarTime, "_D(preBarTime):", _D(preBarTime/1000), "index:", index)
Sleep(10000)
Dirección completa de la estrategia:https://www.fmz.com/strategy/199120
Crear un robot estratégico que use los datos.
Nota: Usted necesita comprobar el
Aquí está la dirección:https://www.fmz.com/strategy/39066
import pymongo
import json
def main():
Log("Test using database data")
# Connect to the database service
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# Create a database
huobi_DB = myDBClient["huobi"]
# Print the current database table
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# Query data printing
huobi_DB_Records = huobi_DB["records"]
while True:
arrRecords = []
for x in huobi_DB_Records.find():
bar = {
"High": x["High"],
"Low": x["Low"],
"Close": x["Close"],
"Open": x["Open"],
"Time": x["Time"],
"Volume": x["Volume"]
}
arrRecords.append(bar)
# Use the line drawing library to draw the obtained K-line data
ext.PlotRecords(arrRecords, "K")
LogStatus(_D(), "records length:", len(arrRecords))
Sleep(10000)
Se puede ver que el código del robot de estrategia que utiliza los datos no accede a ninguna interfaz de intercambio. Los datos se obtienen accediendo a la base de datos. El programa de recolección de mercado no registra los datos actuales de BAR. Recoge el BAR de la línea K en el estado completado. Si se necesitan los datos actuales de BAR en tiempo real, se puede modificar ligeramente.
El código de ejemplo actual es solo para demostración. Al acceder a los registros de datos en la tabla en la base de datos, todos se obtienen. De esta manera, a medida que aumenta el tiempo para recopilar datos, se recopilan más y más datos. Todas las consultas afectarán el rendimiento hasta cierto punto y se pueden diseñar. Solo se consultan y se agregan a los datos actuales datos más recientes que los actuales.
ejecutando el programa docker
En el dispositivo donde se encuentra el docker, ejecute el servicio de base de datos MongoDB
El coleccionista corre para recoger los pares comerciales BTC_USDT de la plataforma FMZ WexApp simulación de intercambio de cotizaciones marekt: Dirección de WexApp: https://wex.app/trade?currency=BTC_USDT
Robot A utilizando datos de la base de datos:
El robot B utiliza datos de la base de datos:
Página de WexApp:
Como pueden ver en la figura, los robots con diferentes ID comparten datos de línea K usando una fuente de datos.
Confiando en las potentes funciones de la plataforma FMZ, podemos recopilar fácilmente datos de la línea K en cualquier ciclo. Por ejemplo, quiero recoger una línea K de 3 minutos, ¿y si el intercambio no tiene una línea K de 3 minutos?
Modificamos la configuración del robot colector, el período de línea K se establece en 3 minutos, y la plataforma FMZ sintetizará automáticamente una línea K de 3 minutos al programa colector.
Usamos el parámetro para borrarthe name of the table
, configuración: [
Empieza elcollector program
, y luego reinicie elstrategy robot using the data
.
Se puede ver el gráfico de la línea K dibujado, el intervalo entre las BAR es de 3 minutos, y cada BAR es una barra de la línea K con un período de 3 minutos.
En el próximo número, trataremos de implementar los requisitos de las fuentes de datos personalizadas.
¡Gracias por leer!