
En el trading programático y cuantitativo, la investigación de estrategias, el diseño de estrategias y el análisis retrospectivo son inseparables del respaldo de los datos del mercado. No es realista recopilar todos los datos del mercado, después de todo, la cantidad de datos es demasiado grande. Para el mercado de divisas digitales, la plataforma de comercio cuantitativo Inventor admite datos de backtesting para intercambios y pares comerciales limitados. Si desea realizar pruebas retrospectivas de algunos intercambios y pares comerciales que actualmente no admiten datos. Puede utilizar fuentes de datos personalizadas para realizar pruebas retrospectivas, pero esto requiere que tenga sus propios datos. Por lo tanto, existe una necesidad urgente de un programa de recopilación de información de mercado que pueda almacenarse de forma persistente y, preferiblemente, obtenerse en tiempo real.
Esto resuelve varios requisitos, tales como:
¿Por qué estás pensando en usar Python para implementarlo? Porque es conveniente :) Si tienes una necesidad, ¡toma acción!
Porque se necesita una base de datos para el almacenamiento persistente. Uso de selección de datosMongoDB, utilice el lenguaje Python para escribir el programa de recopilación, por lo que se necesita la biblioteca de controladores de esta base de datos.
Instalación en PythonpymongoEso es todo.
Por ejemplo: instalar MongoDB en MAC. Por supuesto, instalar MongoDB en WIN es similar. Hay muchos tutoriales en línea. Tomemos como ejemplo la instalación en Apple MAC:
descargar Enlace de descarga: https://www.mongodb.com/download-center?jmp=nav#community
Abrir la cremallera
Después de descargarlo, descomprímalo en el directorio:/usr/local。
Configuración de variables de entorno
Entrada de terminal:open -e .bash_profile, luego de abrir el archivo, escribe:export PATH=${PATH}:/usr/local/MongoDB/bin
Después de guardar, utiliza la terminalsource .bash_profileHacer que los cambios surtan efecto.
Configurar manualmente el directorio de archivos de base de datos y el directorio de registro
Crear un directorio/usr/local/data/dbLa carpeta correspondiente en .
Crear un directorio/usr/local/data/logsLa carpeta correspondiente en .
Edición del archivo de configuraciónmongo.conf:
#bind_ip_all = true # 任何机器可以连接
bind_ip = 127.0.0.1 # 本机可以访问
port = 27017 # 实例运行在27017端口(默认)
dbpath = /usr/local/data/db # 数据文件夹存放地址(db要预先创建)
logpath = /usr/local/data/logs/mongodb.log # 日志文件地址
logappend = false # 启动时 添加还是重写日志文件
fork = false # 是否后台运行
auth = false # 开启校验用户
Orden:
./mongod -f mongo.conf
use admin;
db.shutdownServer();
El recopilador se ejecuta como una estrategia de robot Python en la plataforma de comercio cuantitativo Inventor. Debido a mi limitado conocimiento de Python, solo implementé un ejemplo simple para demostrar las ideas de este artículo.
Código de estrategia del coleccionista:
import pymongo
import json
def main():
Log("测试数据收集")
# 连接数据库服务
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# 创建数据库
huobi_DB = myDBClient["huobi"]
# 打印目前数据库表
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# 检测是否删除表
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, "删除:", dropName)
ret = tab.drop()
collist = huobi_DB.list_collection_names()
if dropName in collist:
Log(dropName, "删除失败")
else :
Log(dropName, "删除成功")
# 创建records表
huobi_DB_Records = huobi_DB["records"]
# 请求数据
preBarTime = 0
index = 1
while True:
r = _C(exchange.GetRecords)
if len(r) < 2:
Sleep(1000)
continue
if preBarTime == 0:
# 首次写入所有BAR数据
for i in range(len(r) - 1):
# 逐根写入
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 póliza:Enlace
Crea bots estratégicos que utilicen datos.
Nota: Es necesario comprobarBiblioteca de dibujos linealesSi no lo tienes, puedes copiar uno a tu propia biblioteca de estrategias.

import pymongo
import json
def main():
Log("测试使用数据库数据")
# 连接数据库服务
myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # mongodb://127.0.0.1:27017
# 创建数据库
huobi_DB = myDBClient["huobi"]
# 打印目前数据库表
collist = huobi_DB.list_collection_names()
Log("collist:", collist)
# 查询数据打印
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)
# 使用画线类库,把取到的K线数据画出来
ext.PlotRecords(arrRecords, "K")
LogStatus(_D(), "records length:", len(arrRecords))
Sleep(10000)
Se puede observar que el código del robot de estrategia que utiliza datos no accede a ninguna interfaz de intercambio. Obtiene datos accediendo a la base de datos. El programa recopilador de mercado no registra los datos del BAR actual. Recopila el BAR de la línea K en el Estado completado. Si es necesario actualizar la BAR actual en tiempo real, los datos se pueden modificar ligeramente. El código de ejemplo actual es solo para demostración. Al acceder a los registros de datos de la tabla de la base de datos, se obtienen todos los registros de datos. A medida que aumenta el tiempo de recopilación de datos, se recopilan cada vez más datos. Consultar todos los datos afectará el rendimiento Hasta cierto punto. Puede diseñar solo datos de consulta que sean más nuevos que los datos actuales y agregarlos a los datos actuales.
Ejecutar el programa host

En el dispositivo del host, ejecuteMongoDBServicios de base de datos
./mongod -f mongo.conf

El coleccionista corre a recoger los discos simulados de la plataforma de comercio cuantitativo del inventor.wexAppdeBTC_USDTPares comerciales:
DIRECCIÓN:wexApp

Robot A usando datos de la base de datos:

Robot B usando datos de la base de datos:

wexApppágina:

Como se puede ver en la figura, los robots con diferentes ID comparten los datos de la línea K de la misma fuente de datos.
Confiando en las potentes funciones de la Plataforma de Comercio Cuantitativo de Inventor, podemos recopilar fácilmente datos de la línea K de cualquier período. Por ejemplo, quiero cobrar una línea K de 3 minutos, ¿qué debo hacer si el exchange no tiene una línea K de 3 minutos? Está bien, se puede lograr fácilmente.
Modificamos la configuración del robot recolector y establecemos el período de la línea K en 3 minutos. La plataforma de negociación cuantitativa Inventor sintetizará automáticamente una línea K de 3 minutos para el programa recolector.

Usamos el parámetro删除表的名称,configuración:["records"]Eliminar la tabla de datos de la línea K de 1 minuto recopilada anteriormente. Prepárese para recopilar datos de la línea K de 3 minutos.
puesta en marcha收集器程序, Reanudar使用数据的策略机器人。


En el gráfico de línea K dibujado, puede ver que el intervalo entre BARRAS es de 3 minutos y cada BARRA es una columna de línea K con un período de 3 minutos.
En el próximo número intentaremos implementar los requisitos de las fuentes de datos personalizadas. Gracias por leer