Ensinar-lhe a implementar um coletor de cotações de mercado

Autora:Bem-estar, Criado: 2020-05-30 10:03:39, Atualizado: 2023-11-02 19:52:02

img

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:

  • Vários robôs podem ser dotados de fontes de dados, o que pode facilitar a frequência de acesso de cada robô à interface de troca.
  • Podemos obter dados de linha K com um número suficiente de BARs de linha K quando o robô arranca, e não temos mais de nos preocupar com o número insuficiente de BARs de linha K quando o robô arranca.
  • Ele pode coletar dados de mercado de moedas raras e fornecer uma fonte de dados personalizada para o sistema de backtest da plataforma FMZ.

e muitos mais...

Nós planejamos usar o Python para conseguir isso, porquê?

Pronto.

  • Python's Pymongo biblioteca Porque você precisa usar o banco de dados para armazenamento persistente.MongoDBe a linguagem Python é usada para escrever o programa de coleção, então a biblioteca de drivers deste banco de dados é necessária. Basta instalarpymongoem 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/binApós o armazenamento, no terminal, utilizasource .bash_profilepara 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
  • Executar o serviço MongoDB

Comando:

./mongod -f mongo.conf
  • Parar o serviço MongoDB
use admin;
db.shutdownServer();

Implementar o programa de recolha

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

Dados de utilização

Criar um robô estratégico que use dados. Nota: Você precisa verificar o python PlotLine Template, se você não tiver, você pode copiar um do quadrado de estratégia para sua biblioteca de estratégia.

img

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.

Corram!

executando o programa docker

img

No dispositivo onde o docker está localizado, execute o serviço de banco de dados MongoDB

img

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

img

Robô A usando dados da base de dados:

img

Robô B usando dados da base de dados:

img

Página do WexApp:

img

Como podem ver na figura, robôs com IDs diferentes partilham dados da linha K usando uma fonte de dados.

Recolher dados da linha K de qualquer período

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.

img

Usamos o parâmetro para excluirthe name of the table, configuração: [records] excluir a tabela de dados de linha K de 1 minuto recolhida anteriormente. Preparar-se para recolher dados de linha K de 3 minutos.

Começa acollector program, e depois reinicie ostrategy robot using the data.

img

img

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!


Relacionados

Mais.