Na negociação programática e na negociação quantitativa, a pesquisa de estratégias, a criação de estratégias e a análise de backtesting são inseparáveis do suporte de dados de mercado. Não é realista coletar todos os dados do mercado, afinal, a quantidade de dados é muito grande. Para o mercado de moeda digital, a plataforma de negociação quantitativa Inventor oferece suporte a dados de backtesting para bolsas e pares de negociação limitados. Se você quiser fazer backtest em algumas bolsas e pares de negociação que atualmente não suportam dados. Você pode usar fontes de dados personalizadas para backtesting, mas isso requer que você tenha seus próprios dados. Portanto, há uma necessidade urgente de um programa de coleta de informações de mercado que possa ser armazenado de forma persistente e, de preferência, obtido em tempo real.
Isso resolve vários requisitos, como:
Planejando usar Python para implementá-lo, por quê? Porque é conveniente :) Se você tem uma necessidade, tome uma atitude!
Porque um banco de dados é necessário para armazenamento persistente. Uso de seleção de dadosMongoDB
, use a linguagem Python para escrever o programa de coleta, então a biblioteca de driver deste banco de dados é necessária.
Instalação em Pythonpymongo
É isso.
Por exemplo: Instale o MongoDB no MAC. Claro, instalar o MongoDB no WIN é similar. Há muitos tutoriais online. Tome a instalação no Apple MAC como exemplo:
download Link para download: https://www.mongodb.com/download-center?jmp=nav#community
Descompactar
Após o download, descompacte-o no diretório:/usr/local
。
Configurando variáveis de ambiente
Entrada do terminal:open -e .bash_profile
, após abrir o arquivo, escreva:export PATH=${PATH}:/usr/local/MongoDB/bin
Após salvar, use o terminalsource .bash_profile
Faça com que as alterações entrem em vigor.
Configurar manualmente o diretório do arquivo de banco de dados e o diretório de log
Criar um diretório/usr/local/data/db
A pasta correspondente em .
Criar um diretório/usr/local/data/logs
A pasta correspondente em .
Editando o arquivo de configuraçãomongo.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 # 开启校验用户
Ordem:
./mongod -f mongo.conf
use admin;
db.shutdownServer();
O coletor é executado como uma estratégia de robô Python na plataforma de negociação quantitativa Inventor. Devido à minha proficiência limitada em Python, implementei apenas um exemplo simples para demonstrar as ideias deste artigo.
Código de estratégia do coletor:
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)
Endereço completo da política:Link
Crie bots estratégicos que utilizem dados.
Nota: Você precisa verificarBiblioteca de desenho de linhasSe você não tiver, você pode copiar um para sua própria biblioteca de estratégias.
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)
Pode-se observar que o código do robô de estratégia que usa dados não acessa nenhuma interface de troca. Ele obtém dados acessando o banco de dados. O programa coletor de mercado não registra os dados do BAR atual. Ele coleta o BAR da linha K no estado concluído. Se o BAR atual precisar ser atualizado em tempo real, os dados podem ser ligeiramente modificados. O código de exemplo atual é apenas para demonstração. Ao acessar os registros de dados na tabela no banco de dados, todos os registros de dados são obtidos. Conforme o tempo de coleta de dados aumenta, mais e mais dados são coletados. Consultar todos os dados afetará o desempenho até certo ponto. Você pode projetar Somente dados de consulta que sejam mais novos que os dados atuais e adicioná-los aos dados atuais.
Execute o programa host
No dispositivo do host, executeMongoDB
Serviços de banco de dados
./mongod -f mongo.conf
O coletor corre para coletar os discos simulados da plataforma de negociação quantitativa do inventorwexApp
deBTC_USDT
Pares de negociação:
endereço:wexApp
Robô A usando dados de banco de dados:
Robô B usando dados de banco de dados:
wexApp
página:
Como pode ser visto na figura, robôs com IDs diferentes compartilham os dados da linha K da mesma fonte de dados.
Contando com as funções poderosas da Plataforma de Negociação Quantitativa do Inventor, podemos facilmente coletar dados de K-line de qualquer período. Por exemplo, quero coletar K-line de 3 minutos. O que devo fazer se a bolsa não tiver K-line de 3 minutos? Tudo bem, isso pode ser facilmente alcançado.
Modificamos a configuração do robô coletor e definimos o período da linha K para 3 minutos. A Inventor Quantitative Trading Platform sintetizará automaticamente uma linha K de 3 minutos para o programa coletor.
Usamos o parâmetro删除表的名称
,configurar:["records"]
Exclua a tabela de dados da linha K de 1 minuto coletada anteriormente. Prepare-se para coletar dados da linha K de 3 minutos.
comece收集器程序
, reiniciar使用数据的策略机器人
。
No gráfico de linhas K desenhado, você pode ver que o intervalo entre as BARs é de 3 minutos, e cada BAR é uma coluna de linhas K com um período de 3 minutos.
Na próxima edição, tentaremos implementar os requisitos de fontes de dados personalizadas. Obrigado pela leitura