Novato, verifique Leve-o para o Comércio Quantitativo de Criptomoedas (2)

Autora:Ninabadass, Criado: 2022-04-19 16:46:53, Atualizado: 2022-04-20 16:56:43

Novato, verifique Leve-o para o Comércio Quantitativo de Criptomoedas (2)

No último artigo, falamos sobre scripts de negociação programados. Na verdade, a estratégia de negociação é um programa de script de negociação. O artigo fala principalmente sobre a necessidade de um portador de hardware para o programa de script de negociação (onde o programa é executado), e o programa de negociação de script pode ser escrito nessa linguagem de programação de computador (listando as três linguagens de programação usadas na FMZ Quant Trading Platform; é claro, você pode usar qualquer linguagem de programação para implementar estratégias na negociação programada).

Programação do script de negociação

  • Tipo de estratégia de negociação Os novatos que são novos na negociação programada e na negociação quantitativa podem ser confundidos por vários termos, como estratégia de tendência, estratégia de arbitragem, estratégia de alta frequência, estratégia de rede, etc. Na verdade, os tipos comuns de estratégias na negociação programada e na negociação quantitativa são simplesmente em várias direções.

    • Estratégia de arbitragem Simplificando, uma estratégia que basicamente mantém posições longas enquanto mantém posições curtas pode ser classificada como uma estratégia de arbitragem.

    • Estratégia de tendência Simplificando, é a estratégia de acompanhamento da tendência e colocação de uma única posição, como a média móvel dupla, MACD e outras estratégias.

    • Estratégia de retorno Por exemplo, a estratégia de rede, ganhando o retorno das flutuações de preços em mercados voláteis.

    • Estratégia de alta frequência Para ser simples, é uma estratégia para conduzir a negociação de alta frequência através de alguns algoritmos para descobrir a microestrutura do mercado, regras, oportunidades, etc.

    Os tipos acima são classificados do ponto de vista da estratégia de negociação; do ponto de vista do projeto de estratégia no FMZ Quant, as estratégias também podem ser divididas em:

    • Estratégia de símbolo único Ou seja, a estratégia só pode operar um símbolo, como fazer uma negociação BTC ou ETH.

    • Estratégia multi-símbolo Simplificando, é operar vários símbolos por uma lógica estratégica.

    • Estratégia multi-contas Simplificando, é para configurar vários objetos de troca em um bot (o conceito de plataforma foi introduzido no artigo anterior, e um objeto de troca configurado com uma API KEY representa uma conta de plataforma).

    • Estratégia multi-lógica Por exemplo, a estratégia MACD, a estratégia de média móvel, a estratégia de grade, etc. são projetadas ao mesmo tempo em um bot (é claro, é para operar diferentes objetos de troca, e os objetos de troca com a mesma operação dependem se a estratégia específica é logicamente conflitante)

  • Interface API da plataforma Como o script de negociação programado opera a conta da plataforma? Então, que tipos de interfaces estão abertas para plataformas? No último artigo, falamos sobre que as plataformas geralmente têm interfaces REST e Websocket na seção Platform. Aqui adicionamos alguns conceitos do aspecto de procedimentos de estratégia. As interfaces de plataforma são divididas de acordo com se é verificada (tanto REST quanto Websocket), ou seja, verificada e não verificada.

    • Interfaces que não necessitam de verificação Em geral, são referidas como interfaces públicas; este tipo de interfaces não requer verificação deAPI KEYEste tipo de interface é geralmente uma interface de mercado, como consulta de cotações de mercado de profundidade, dados de linha K, taxas de financiamento, informações sobre símbolos de negociação, carimbos de tempo do servidor da plataforma, etc. Simplificando, a interface que não está basicamente relacionada à sua conta pode ser determinada grosseiramente como uma interface pública (sem necessidade de verificação). Na plataforma de negociação FMZ Quant, ao chamar uma função API não verificada (encapsulação da interface não verificada da plataforma; interface pública), mesmo que a configuração da API KEY seja incorreta, os dados retornados pela interface podem ser obtidos normalmente (não é necessária verificação).

    • Interfaces que necessitam de verificação Simplificando, são as interfaces que precisam ser verificadas (por API KEY). Este tipo de interface é chamado de interface privada. Este tipo de interface é geralmente relacionado a algumas operações ou informações da sua conta, como consulta de ativos da conta, posições da conta, ordens pendentes, transferências, conversão de moeda, ajuste de alavancagem e configuração do modo de posição, etc. Estas operações devem ser verificadas.

      No FMZ Quant, ao chamar as funções da API que precisam de verificação (as interfaces privadas, que são encapsuladas e precisam da verificação da plataforma). Se a configuração da API KEY estiver errada, chamar esse tipo de função irá relatar um erro e retornar nulo.

    Então, como usar essas interfaces na FMZ Quant Trading Platform?

    FMZ Quant Trading Platform encapsula interfaces de plataforma com ações e definições unificadas (como interfaces de linha K, interfaces de mercado de profundidade, interfaces de consulta de ativos atuais, interfaces de ordens, interfaces de cancelamento de ordens, etc.).https://www.fmz.com/api).

    Então, como usar algumas interfaces de plataforma sem ações e definições unificadas no FMZ Quant?

    Essas interfaces de plataforma incluem: transferência de ativos, ordem condicional, ordem por lote, cancelamento de ordem por lote, modificação de ordem, etc. Algumas plataformas têm essas interfaces, outras não e as funções e detalhes de uso podem ser bastante diferentes, de modo que essas interfaces podem ser acessadas através doexchange.IOFunção no FMZ Quant (para mais detalhes, ver a documentação da API da plataforma de negociação FMZ Quant:https://www.fmz.com/api#exchange.io..Há também algumas estratégias práticas de exemplo de IO no Quadrado do FMZ Quant.

Todas as funções de API na documentação da API FMZ podem fazer uma solicitação de rede?

Precisamos dizer que as APIs da plataforma têm um limite para a frequência de acesso (por exemplo, 5 vezes em 1 segundo). O acesso não pode ser muito frequente, ou o erro de http 429 será relatado e o acesso será rejeitado (a maioria das plataformas relatam 429).
Nem todas as funções de API no FMZ Quant podem fazer solicitações de rede; algumas funções de API no FMZ só modificam algumas configurações locais, como definir o par de negociação atual, código de contrato e função de cálculo de indicadores, bem como adquirir o nome do objeto de troca, etc. Basicamente, a partir do uso da função a, você pode determinar se uma solicitação de rede será feita; desde que seja para adquirir os dados da plataforma, ou operar uma conta de plataforma, uma solicitação de rede será feita; todas essas interfaces precisam prestar atenção à frequência de invocação.

  • Vamos falar sobre vários problemas comuns e experiência de uso de funções de API no FMZ Quant.

    • Tolerância a falhas Este é o erro mais comum, que tem incomodado inúmeros iniciantes. Muitas vezes, o backtest de estratégia é bom e tudo é normal. Por que o bot funciona anormalmente depois que o bot é executado por um tempo (o que pode ser desencadeado a qualquer momento)?

      img

      Ao escrever uma estratégia, para os dados retornados pela interface precisa ser verificado. Por exemplo, o código de obter ticker em FMZ Quant (o que é o mesmo que escrever seu próprio programa para acessar diretamente a interface da plataforma):var ticker = exchange.GetTicker()■ se precisarmos de utilizar os dados deLast(último preço) na variávelticker(podemos consultar a estrutura de retorno da função GetTicker), precisamos obter os dados (o que é newPrice? new: o mais recente; Price: price; thats right, combine-os!)

      Agora, está tudo bem se a funçãoGetTicker()retorna os dados normais; se houver uma solicitação de timeout, erro de rede, plataforma puxando o cabo, cabos quebrados por escavação, ou crianças desligando o interruptor de eletricidade, a funçãoGetTicker()VoltaránullNo momento, o valor detickerénull- quando acedo aoLastdo mesmo, o programa estratégico será interrompido por exceção de programa. A partir disso, parece que a falha da chamada de interface (a invocação do GetTicker falha e retorna nulo) não é a causa direta da parada do bot estratégia (a causa direta é que um atributo de umnullA situação em que a falha da chamada de interface relata um erro não fará com que o bot pare (enfatização adicionada aqui).

      Então, o que devemos fazer para evitar a parada anormal do bot?
      A resposta é fazer o processo de tolerância a falhas para os dados retornados por interfaces; é muito simples, e você só precisa julgar se os dados retornados énull(aqui tomar JavaScript como exemplo, para as outras línguas são semelhantes). Escreva um pequeno segmento de código (que é apenas para instrução, e não pode ser executado diretamente!)

      var ticker = exchange.GetTicker()
      if (ticker) {
          var newPrice = ticker.Last
          Log("Print the latest price:", newPrice)
      } else {
          // data is null, so no operation will make no problem 
      }
      

      Não só oGetTickerinterface precisa fazer processamento tolerante a falhas, mas a interface com solicitações de rede precisa ser fazer o processamento tolerante a falhas para o valor de retorno (se você usar o valor de retorno da função) Existem muitos métodos de tolerância a falhas._C()função (consulte a documentação da API FMZ) para escrever sua própria função tolerante a falhas e projetar seu próprio mecanismo e lógica tolerantes a falhas.

      No que diz respeito à utilização do_C()A função, muitos novos alunos também são muito propensos a usá-lo incorretamente._C()Função é uma referência de função, não uma chamada de função._C(funcName, param1, param2); a chamada é correta; funcName não tem parênteses, e param1 e param2 são os parâmetros a importar para a função funcName._C(funcName(param1, param2)); a chamada está errada; geralmente, se um novato não ler a documentação da API FMZ cuidadosamente, ela será escrita assim.

    • Valor da ordem de compra no mercado spot

      Como mencionado no artigo anterior, o valor da ordem da ordem de compra do mercado à vista é geralmente o valor do dinheiro (apenas algumas plataformas podem ter outras configurações, e geralmente essas configurações especiais da plataforma serão explicadas na documentação da API FMZ).

      Definir o par de negociação como:LTC_USDT

      function main() {
          exchange.IO("simulate", true)   // switch to OKEX simulated bot 
          exchange.Buy(-1, 1)             // the price is -1, representing the placed order is market order; the amount of 1 means the order amount of 1 USDT
      }
      

      Uma vez que as plataformas geralmente têm um limite no valor da ordem, as ordens com um valor menor que o limite não serão colocadas (por exemplo, o Binance Spot requer que apenas ordens com um valor superior a 5USDT possam ser colocadas com sucesso).

      error	Buy(-1, 1): map[code:1 data:[map[clOrdId: ordId: sCode:51020 sMsg:Order amount should be greater than the min available amount. tag:]] msg:]
      
    • Direcção da ordem de futuros

      Ao fazer estratégias de futuros, os iniciantes costumam cometer erros na direção da ordem.https://www.fmz.com/api#exchange.setdirection...

      img

      Porque a função de colocação de ordens só temBuyeSellNo entanto, futuros (é claro, não há problema para o local, para o local só tem comprar e vender) tem as direções de abertura longa, fechamento longo, abertura curto, e fechamento curto, por isso obviamente Buy e Sell não pode expressar operações em tantas direções, então é necessário introduzir a funçãoexchange.SetDirection()de definir as direcções de negociação de futuros. Na FMZ,exchange.SetDirection("buy")(que define primeiro a direcção) é utilizado em conjunto comexchange.Buy, o que significa que a ordem colocada é uma ordem para abrir posições longas. E assim por diante:

      Utilizaçãoexchange.SetDirection("sell")eexchange.SellA ordem colocada é uma ordem para abrir posições curtas. Utilizaçãoexchange.SetDirection("closebuy")eexchange.SellA ordem colocada é uma ordem para fechar posições longas. Utilizaçãoexchange.SetDirection("closesell")eexchange.BuyA ordem colocada é uma ordem para fechar posições curtas. Os iniciantes, geralmente usamexchange.SetDirection("sell")eexchange.BuyEntão, um erro será relatado (um erro não pode ser relatado no backtest, mas isso é obviamente um erro lógico, que não pode ser ignorado por pessoas obsessivo-compulsivas como eu). Aqui está outro erro geralmente cometido por iniciantes.

      function main() {
          exchange.SetContractType("quarter")   // set the current contract to a quarterly contract 
          exchange.SetDirection("sell")
          var id = exchange.Sell(-1, 1)    
          Log("placed market order, executed, get positions", exchange.GetPosition())    
          exchange.SetDirection("closebuy")   // use closebuy and Sell together, yes, no problem 
          exchange.Sell(-1, 1)
      }
      

      img
      Quando se trata de aqui, você pode perguntar:" Eu tenho posições, e usar closebuy e vender juntos, então por que um erro é relatado e eu não posso fechar posições? "Eu diria:" direção errada para fechar posições! Além disso, o erro pode estar em outra situação: a configuração da direção de posição próxima é correta, o uso da função de colocação de ordem também é correta e você também mantém as posições na direção, mas o erro ainda é relatado. A razão pode ser: seu programa colocou muitas ordens, as ordens no início não são executadas, e as ordens de posições fechadas estão agora no mercado e aguardando execução.

    • Display de informações de exportação e comércio Projetar e escrever estratégias de negociação programadas e quantitativas é inseparável do design de interações homem-computador, como exibição de dados e exportação de registros de operações. Por exemplo: Python utilizaprint- Não. Utilizações de JavaScriptconsole.log- Não. Utilizações do Golangfmt.Println()- Não. Utilizações em C++cout.

      Vamos falar sobre a exibição de informações no FMZ. No FMZ Quant, há principalmente dois lugares para exibir informações.

      • Barra de estado Depois que o bot é iniciado, a página do bot é mostrada da seguinte forma:

        img

        A parte de exibição é a informação da barra de status. A barra de status é usada principalmente para exibir alguns dados de mudança em tempo real (porque as mudanças em tempo real precisam ser observadas em tempo real, e não podem ser impressas como um log toda vez, então esse tipo de dados pode ser exibido na barra de status. Se imprimir log de cada um, haverá muitos dados repetidos sem sentido, afetando a consulta). Os dados exibidos na barra de estado utilizam oLogStatusPara mais detalhes, consulte a documentação da API FMZ.

      • Barra de registro Também está na página do bot, como mostrado na seguinte imagem:

        img

        A parte de exibição é a barra de registro. A barra de registro é usada principalmente para registrar permanentemente certos dados em um determinado momento, ou registrar uma operação de uma determinada estratégia em um determinado momento. Os troncos são divididos em vários tipos:

        1. log comum; a estratégia FMZ utiliza a função Log para a extrair e imprimi-la no log da estratégia.

        img

        1. Registo de encomendas; utilizandoexchange.Sell/exchange.Buyem uma estratégia FMZ irá automaticamente a saída do registo no diário.

        img

        1. Registo de anulações;exchange.CancelOrderé utilizado numa estratégia de FMZ, e o registo de cancelamento será automaticamente emitido no registo.

        img

        1. Registro de erros; quando a estratégia FMZ está sendo executada, e a interface para solicitação de rede tem um erro de chamada, e uma exceção é lançada (como uma declaração throw), o registro de erros será automaticamente exibido no registro.

        img

      Entre as funções da API FMZ, as funções que podem gerar saída de log, como Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), etc., podem ser seguidas por alguns parâmetros de saída adicionais após os parâmetros necessários, como: exchange. CancelOrder ((ordens[j].Id, ordens[j]); é para extrair adicionalmente as informações de pedido quando a ordem de pedidos[j] é cancelada.

      function main() {
          Log("data1", "data2", "data3", "...")
          var data2 = 200
          var id = exchange.Sell(100000, 0.1, "additional data1", data2, "...")
          exchange.CancelOrder(id, "additional data1", data2, "...")
          LogProfit(100, "additional data1", data2, "...")
      }
      
    • Utilização de funções de indicador Antes de falar sobre a função do indicador, vamos primeiro entender o que é um indicador.

      P: Como são gerados esses indicadores? R: Certamente são gerados por cálculos.

      P: Em que se baseiam? A: dados da linha K.

      P: Pode dar um exemplo? R: Tomando o indicador de média móvel mais simples como exemplo. Se usarmos os dados da linha K diária (ou seja, uma linha yang ou linha yin representa um dia) como fonte de dados para o cálculo do indicador. O parâmetro do indicador de média móvel é 10, então o indicador de média móvel calculado é a média móvel de 10 dias.

      P: se o número de BAR da linha K for inferior a 10, pode o indicador da média móvel ser calculado? R: Não só o indicador da média móvel não pode ser calculado, mas qualquer indicador não pode calcular o valor do indicador efetivo quando o número de dados BAR da linha K não atender ao parâmetro do período do indicador e a posição correspondente da matriz calculada for preenchida com valores vazios, comonullDisponível quando oJavaScriptA estratégia imprime os dados do indicador calculados.

      Há um exemplo de ensino na Praça:https://www.fmz.com/strategy/125770Faça o teste de volta desta estratégia de exemplo de ensino, e você pode ver o gráfico gerado pelo sistema de backtest e a média móvel de 10 períodos:

      img

      Por estratégia desenho personalizado, desenhada K-line e gráfico da média móvel:

      img

      P: E se eu quiser usar uma média móvel de 10 horas? A: utilizar os dados da linha K de um período horário.

      Simplificando, a linha K que vemos é uma matriz depois de digitalizá-la (se você não entende o conceito de matriz, você pode pesquisar no Baidu), e cada elemento da matriz é uma barra de linha K, que é organizada em ordem. Normalmente, a última barra dos dados da linha K é a barra do período atual, que muda em tempo real e não é concluída (você pode observar as mudanças entrando em uma página da plataforma e observando sua linha K). Os indicadores calculados também estão em correspondência um-a-um com as barras da linha K. No exemplo acima, você pode ver que um valor de indicador corresponde a uma barra da linha K. Observe que a última barra da linha K muda em tempo real e o indicador calculado também mudará com a mudança da barra da linha K.

      Na plataforma de negociação de quantidade FMZ, você pode usar a biblioteca TA (a biblioteca implementada pela FMZ, integrada no docker e pode ser usada diretamente em vários idiomas) ou talib (a antiga famosa biblioteca de indicadores talib, integrada em JS, C ++; Python precisa ser instalada adicionalmente). Por exemplo, o cálculo da média no exemplo acima: Utilize a biblioteca FMZ TA:

      function main() {
          var records = exchange.GetRecords()
          var ma = TA.MA(records, 10)
          Log(ma)       // print average
      }
      

      Use o talib:

      function main() {
          var records = exchange.GetRecords()
          var ma = talib.MA(records, 10)
          Log(ma)       // print average 
      }      
      

      O índice calculado de dados ma é uma matriz, e cada elemento corresponde à matriz de linhas K (registros) um por um, ou seja,ma[ma.length -1]corresponde arecords[records.length - 1], e assim por diante.

      É o mesmo para outros indicadores mais complicados, e você precisa prestar atenção a indicadores como o MACD.

      var macd = TA.MACD(records)   // In this way, only the K-line data is passed in, and no indicator parameters are passed in. The indicator parameters use the default values, and that is the same for other indicator functions
      

      Neste momento, a variável macd é uma matriz bidimensional (você pode usar o Baidu, se você não entende o conceito).

      P: Por que os dados do indicador MACD são uma matriz bidimensional? R: Porque o indicador macd é composto por duas linhas (linha dif e linha dea) e um conjunto de barras de volume (os dados da barra de volume macd, de fato, também podem ser considerados uma linha).

      var dif = macd[0]
      var dea = macd[1]
      var macdbar = macd[2]
      

      Aqui está também um exemplo de ensino pronto; se estiver interessado, pode estudá-lo:https://www.fmz.com/strategy/151972

      img


Mais.