O suporte de dados de cotações de mercado é indispensável ao pesquisar, projetar e backtestar estratégias de negociação. Não é realista coletar todos os dados de cada mercado, afinal, a quantidade de dados é muito grande. Para o mercado de moeda digital, a plataforma FMZ suporta dados de backtest limitados para exchanges e pares de negociação. Se você quiser backtestar algumas exchanges e pares de negociação que temporariamente não eram suportados pela plataforma FMZ, você pode usar uma fonte de dados personalizada para backtest, mas essa premissa requer que você tenha dados. Portanto, há uma necessidade urgente de um programa de coleta de cotações de mercado, que pode ser persistente e melhor obtido em tempo real.
Desta forma, podemos resolver várias necessidades, tais como:
e muitos mais...
Nós planejamos usar o Python para conseguir isso, porquê?
Python's Pymongo biblioteca
Porque você precisa usar o banco de dados para armazenamento persistente.MongoDB
e a linguagem Python é usada para escrever o programa de coleção, então a biblioteca de drivers deste banco de dados é necessária.
Basta instalarpymongo
em Python.
Instale o MongoDB no dispositivo de hospedagem Por exemplo: MacOS instala MongoDB, também o mesmo que o sistema windows instala MongoDB. Há muitos tutoriais on-line.
Descarregar Link de download:https://www.mongodb.com/download-center?jmp=nav#community
Desligue
Depois de baixar, deszipe para o diretório:/usr/local
Configurar variáveis de ambiente
Entrada do terminal:open -e .bash_profile
, após abrir o ficheiro, escrever:exportPATH=${PATH}:/usr/local/MongoDB/bin
Após o armazenamento, no terminal, utilizasource .bash_profile
para que as alterações entrem em vigor.
Configure manualmente o diretório de arquivos do banco de dados e o diretório de log
Crie a pasta correspondente no diretório/usr/local/data/db
- Não.
Crie a pasta correspondente no diretório/usr/local/data/logs
.
Editar o arquivo de configuraçãomongo.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
Comando:
./mongod -f mongo.conf
use admin;
db.shutdownServer();
O coletor opera como uma estratégia de robô Python na plataforma FMZ.
Código do programa do coletor:
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)
Endereço completo da estratégia:https://www.fmz.com/strategy/199120
Criar um robô estratégico que use dados.
Nota: Você precisa verificar o
Aqui está o endereço: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)
Pode-se ver que o código do robô de estratégia que usa os dados não acessa nenhuma interface de troca. Os dados são obtidos acessando o banco de dados. O programa coletor de mercado não registra os dados atuais do BAR. Ele coleta o BAR da linha K no estado concluído. Se os dados atuais do BAR em tempo real forem necessários, ele pode ser modificado ligeiramente.
O código de exemplo atual é apenas para demonstração. Ao acessar os registros de dados na tabela no banco de dados, todos são obtidos. Desta forma, à medida que o tempo para coletar dados aumenta, mais e mais dados são coletados. Todas as consultas afetarão o desempenho em certa medida e podem ser projetadas. Apenas dados mais recentes do que os dados atuais são consultados e adicionados aos dados atuais.
executando o programa docker
No dispositivo onde o docker está localizado, execute o serviço de banco de dados MongoDB
O coletor corre para coletar os pares de negociação BTC_USDT da plataforma FMZ WexApp simulação de câmbio marekt cotações: Endereço do WexApp: https://wex.app/trade?currency=BTC_USDT
Robô A usando dados da base de dados:
Robô B usando dados da base de dados:
Página do WexApp:
Como podem ver na figura, robôs com IDs diferentes partilham dados da linha K usando uma fonte de dados.
Com base nas poderosas funções da plataforma FMZ, podemos facilmente coletar dados da linha K em qualquer ciclo. Por exemplo, eu quero coletar uma linha K de 3 minutos, e se a troca não tiver uma linha K de 3 minutos?
Modificamos a configuração do robô coletor, o período da linha K é definido em 3 minutos, e a plataforma FMZ irá sintetizar automaticamente uma linha K de 3 minutos para o programa coletor.
Usamos o parâmetro para excluirthe name of the table
, configuração: [
Começa acollector program
, e depois reinicie ostrategy robot using the data
.
Podem ver o gráfico de linhas K desenhado, o intervalo entre BARs é de 3 minutos, e cada BAR é uma barra 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 por ler!