Negociação Quantitativa de Criptomoedas para iniciantes - Levá-lo mais perto de Criptomoeda Quantitativa (2)

Autora:Lydia., Criado: 2022-07-27 16:34:41, Atualizado: 2023-09-24 19:31:16

img

Negociação Quantitativa de Criptomoedas para iniciantes - Levá-lo mais perto de Criptomoeda Quantitativa (2)

No último artigo, falamos sobre scripts de negociação programática. 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 em que tipo de linguagem de programação de computador (três linguagens de programação usadas na plataforma de negociação FMZ Quant estão listadas. Claro, você pode usar qualquer linguagem de programação para implementar estratégias para negociação programática). Neste artigo, continuamos a discutir a quantificação da criptomoeda e aprender sobre isso.

Programa de negociação

  • Tipos de estratégia de negociação Novos iniciantes em negociação programada e negociação quantitativa podem ser confundidos por termos, como várias estratégias de tendência, estratégias de arbitragem, estratégias de alta frequência, estratégias de grade, etc. Na verdade, os tipos comuns de estratégias em negociação programada e negociação quantitativa são simplesmente várias direções.

    • Estratégia de cobertura de arbitragem Simplificando, uma estratégia que mantém uma posição longa enquanto mantém uma posição curta pode ser basicamente classificada como uma estratégia de arbitragem.
    • Estratégia de tendência Em termos simples, é a estratégia de acompanhamento da tendência para realizar ordens e manter posições, como a média móvel dupla, o MACD e outras estratégias.
    • Estratégia de regressão Por exemplo, a estratégia da rede, a fazer lucros com flutuações de preços em mercados voláteis.
    • Estratégia de alta frequência Simplificando, é uma estratégia de negociação de alta frequência através de alguns algoritmos para descobrir microestruturas de mercado, padrões, oportunidades, etc.

    O que precede é dividido a partir da perspectiva das estratégias de negociação.

    • Estratégia de variedade única Isto é, esta estratégia opera apenas uma espécie, como a negociação de BTC ou a negociação de ETH.
    • Estratégia multi-espécies Simplificando, é operar várias espécies de acordo com uma lógica estratégica.
    • Estratégia de múltiplas contas Simplificando, vários objetos de troca são configurados em um bot real (o conceito de troca foi introduzido no artigo anterior, e um objeto de troca com uma API KEY configurada representa uma conta de troca).
    • Estratégia de lógica múltipla 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 real (é claro, é para operar objetos de troca diferentes, e a operação do mesmo objeto de troca depende de se a estratégia específica é conflitante logicamente)
  • Interface da API do Exchange Como o script de negociação programática opera a conta de câmbio? É através da interface API aberta pela câmbio. Então, que tipo de interfaces estão abertas para trocas? No artigo anterior, falamos sobre o intercâmbio tem interfaces REST e Websocket geralmente na seção Exchange. Aqui adicionamos alguns conceitos do nível de procedimentos de estratégia. As interfaces de intercâmbio são divididas por se são validadas ou não (tanto REST quanto Websocket), há verificação e não-verificação.

    • Interfaces que não requerem verificação Geralmente conhecido como interface pública, este tipo de interface não requer verificação deAPI KEYEste tipo de interface é uma interface de mercado em geral, como consultar preços de mercado em profundidade, consultar dados de linha K, consultar taxas de financiamento, consultar informações sobre variedades de negociação, consultar carimbos de tempo do servidor de câmbio, etc. Simplificando, a interface que não está 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 exchange, interface pública), mesmo que a configuração da API KEY seja incorreta, os dados retornados pela interface podem ser obtidos normalmente (por causa da não verificação).

    • Interfaces que requerem verificação Simplificando, é a interface que precisa ser verificada (através da API KEY), este tipo de interface é chamada de interface privada. Geralmente está relacionada a algumas operações ou informações da sua conta, como consultar os ativos da conta, consultar as posições da conta, consultar ordens pendentes, consultar transferências, transferir moeda, ajustar alavancagem, definir o modo de posição, etc. Todas estas operações devem ser verificadas. Na plataforma de negociação FMZ Quant, ao chamar a função API que precisa ser verificada (a interface que precisa ser verificada para a troca encapsulada, interface privada), se a chave API for configurada incorretamente, um erro será relatado quando a interface for chamada e um valor nulo será devolvido.

    Então, como estas interfaces são usadas na FMZ Quant Trading Platform?

    A Plataforma de Negociação Quant FMZ encapsula o comportamento de troca e as interfaces com definições consistentes (como a interface de linha K, a interface de mercado em profundidade, a interface de consulta de ativos atuais, a interface de ordens, a interface de cancelamento de ordens, etc.), essas interfaces são chamadas funções da API da Plataforma de Negociação Quant FMZ na Plataforma de Negociação Quant FMZ, e pode ser acessada a partir da documentação da API (https://www.fmz.com/api).

    Então, como são algumas das interfaces de troca com diferentes comportamentos e definições usadas na plataforma de negociação quântica FMZ?

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

    Todas as funções de API no documento API da plataforma de negociação FMZ Quant geram solicitações de rede?

    Em primeiro lugar, a interface API da exchange tem restrições de frequência de acesso (como 5 vezes por segundo), e o acesso não pode ser muito frequente, caso contrário, ele irá relatar um erro http 429, e o acesso será recusado (a maioria das exchanges relatam 429). Nem todas as funções da API da plataforma de negociação FMZ Quant gerarão solicitações de rede. Algumas delas apenas modificam algumas configurações locais, como definir o par de negociação atual, definir o código do contrato, a função de cálculo do indicador e obter o nome do objeto de troca, etc. Em geral, pode ser julgado se uma solicitação de rede ocorre a partir do propósito da função.

    • Vamos falar sobre alguns problemas e experiências comuns ao usar funções API na plataforma de negociação FMZ Quant

      • Tolerância a erros Este é o erro mais comum, que tem incomodado inúmeros iniciantes. Tudo da estratégia backtesting é muitas vezes normal, por que o bot real executa por um tempo (pode ser acionado a qualquer momento) e depois falha?

        img

        Ao escrever uma estratégia, todos nós precisamos julgar e verificar os dados retornados pela interface. Por exemplo, a linha de código de preço de mercado para obter na plataforma de negociação FMZ Quant (o mesmo que escrever um programa para acessar a interface de troca diretamente por si mesmo):var ticker = exchange. GetTicker(), se precisarmos de usar oLast(preço final)tickervariável (ver a estrutura devolvida pela função GetTicker), precisamos usarvar newPrice = ticker.LastPara obter dados como este (o que é newPrice? new: latest, Price: price, yes!GetTicker()Função retorna aos dados normais, está tudo bem, mas se há um timeout de solicitação, erro de rede, o intercâmbio puxa o cabo de rede, o cabo é cortado, o garoto puxa o interruptor elétrico, etc...GetTicker()função para retornar paranullNeste momento, o valor detickerénull, e se eu vou acessar o seuLast, uma exceção de programa ocorrerá e o programa de estratégia será interrompido. Parece que a falha da chamada de interface (a chamada GetTicker falha e retorna null) não é a razão direta da parada da estratégias real bot (a razão direta é que um atributo de umnullO relatório de erro de falha de chamada de interface não causará a parada real do bot (enfatização). Então, o que podemos fazer para evitar a parada anormal do robô real? A resposta é executar processamento tolerante a falhas nos dados retornados pela interface.null(um exemplo da linguagem JavaScript, outras línguas são geralmente o mesmo) Escreva um pequeno segmento de código para descrição (isso é apenas uma descrição, você não pode executá-lo diretamente!)

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

        Não só oGetTickerA interface precisa ser tolerante a falhas, mas a interface com solicitações de rede precisa ser tolerante a falhas para o valor de retorno (se você usar o valor de retorno da função) Existem muitos métodos tolerantes a falhas, você pode usar o_C()função (consulte a documentação FMZ API) para escrever função tolerante a falhas e projetar o mecanismo e a lógica tolerantes a falhas por si mesmo. Quanto à utilização do_C()A função é uma função que muitos iniciantes usam 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 é sem parênteses, e param1 e param2 são os parâmetros a serem passados para a função funcName._C(funcName(param1, param2)), a chamada é incorreta, geralmente escrita por iniciantes que não lêem a documentação da API FMZ seriamente.

      • A quantidade de ordem da ordem de compra do mercado à vista A quantidade de ordem da ordem de compra do mercado à vista também é fácil de cometer erros por iniciantes, como mencionado no artigo anterior, a quantidade de ordem da ordem de compra do mercado à vista é geralmente o montante (muito poucas bolsas podem ser outras configurações, geralmente, essas configurações especiais de troca no FMZ serão explicadas no documento FMZ API), por exemplo, eu uso o OKEX V5 demo para testar: O par de negociação é definido:LTC_USDT

        function main() {
            exchange.IO("simulate", true)   // Switch to the demo of OKEX exchange
            exchange.Buy(-1, 1)             // The price is -1, indicating that the order placed is a market order, and the quantity is 1, indicating that the order amount is 1USDT
        }
        

        Uma vez que as bolsas geralmente têm um limite no valor da ordem, ordens menores do que o limite não serão colocadas (por exemplo, o Binance Spot requer que cada ordem seja superior a 5USDT antes de poder ser colocada com sucesso).Por isso, ele irá relatar um erro se você colocar uma ordem como esta:

        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:]
        
      • Orientação para a colocação de pedidos futuros Ao fazer estratégias de futuros, a direção de colocação de ordens é muitas vezes cometida por erros por iniciantes, o que leva a problemas. Vejamos a descrição na documentação da API primeiro:https://www.fmz.com/api#exchange.setdirection...

        img

        Como a função de ordem é apenasBuy, SellNo entanto, os futuros (obviamente, não há problema com o local, o local é apenas comprado e vendido) têm as direções de abertura longa, fechamento longo, abertura curta e fechamento curto, por isso é óbvio que Buy/Sell não pode expressar operações em tantas direções.exchange.SetDirection(), que define a direcção da negociação de futuros. Na FMZ,exchange.SetDirection("buy")(definir a direcção primeiro) é utilizado em conjunto comexchange.Buy, significa que a ordem colocada é uma ordem para abrir uma posição longa. E assim por diante:exchange.SetDirection("sell")é utilizado em associação comexchange.Sell, significa que a ordem colocada é uma ordem para abrir uma posição curta.exchange.SetDirection("closebuy")é utilizado em associação comexchange.Sell, significa que a ordem colocada é uma ordem para fechar uma posição longa.exchange.SetDirection("closesell")é utilizado em associação comexchange.Buy, significa que a ordem colocada é uma ordem para fechar uma posição curta. Os iniciantes costumam usarexchange.SetDirection("sell")em conjunto comexchange.Buy, ou outras combinações erradas. Em seguida, um erro é relatado (backtesting pode não relatar um erro, mas este é obviamente um erro lógico, transtorno obsessivo-compulsivo não pode tolerar...). Outro erro comum cometido por iniciantes

        function main() {
            exchange.SetContractType("quarter")   // Set the current contract as a quarterly contract
            exchange.SetDirection("sell")
            var id = exchange.Sell(-1, 1)    
            Log("See my market order is placed and the transaction is completed, there is a position", exchange.GetPosition())    
            exchange.SetDirection("closebuy")   // closebuy is used in conjunction with Sell, yes~
            exchange.Sell(-1, 1)
        }
        

        img
        Aqui, pode perguntar: Porque tenho uma posição e closebuy e Sell também são usados juntos, por que eu recebo um erro e não posso fechar a posição? Eu responderia: Você fechou a direção errada! Uma das situações possíveis no relatório de erro acima é: a direção de fechamento é definida corretamente, a função de ordem é usada corretamente e a posição nesta direção também é mantida, mas o erro ainda é relatado. A razão é que seu programa pode ter colocado várias ordens, mas a ordem inicial não foi preenchida, e a ordem de fechamento está pendente no mercado.

      • Saída de registo, exibição de informações sobre transacções O projeto de estratégias de negociação programadas e quantitativas é inseparável do projeto de interação homem-computador, como exibição de dados e saída de registro de operações. Por exemplo: uso de pythonprint- Não. uso de javascriptconsole.log- Não. Uso de Golangfmt.Println()- Não. C++ usocout

        Vamos falar sobre a exibição de informações na plataforma FMZ, na FMZ Quant Trading Platform, há dois lugares principais onde as informações são exibidas.

        • Coluna de estado Depois que o bot real é executado, a página do bot real é como mostrado na figura:

          img

          A parte de exibição é a informação da coluna de status. A coluna 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 pode ser impressa como um log toda vez, esse tipo de dados pode ser exibido na coluna de status. O log repetirá muitos dados duplicados e sem sentido, afetando a consulta se cada log for impresso). Os dados exibidos na coluna de estado utilizam oLogStatusPara mais detalhes, consulte a documentação da API FMZ.

        • Coluna de registo Também dispalyed na página real bot, como mostrado na figura:

          img

          A parte de exibição é a coluna de log. A coluna de log é usada principalmente para registrar determinados dados em um determinado momento permanentemente, ou registrar uma operação de uma determinada estratégia em um determinado momento. Existem vários tipos de troncos:

          1. Registro comum, as estratégias no FMZ adotam a função Log para a saída e impressão no registro de estratégia.

            img

          2. Registo de pedidos, utilizaçãoexchange.Sell/exchange.Buyem FMZs estratégia irá registar no log output automaticamente.

            img

          3. Registo de cancelamento,exchange.CancelOrderé utilizado na estratégia da FMZ, que produz automaticamente o registo de cancelamento no registo.

            img

          4. Registro de erros, quando a estratégia no FMZ está sendo executada, ocorre um erro de chamada na interface que faz uma solicitação de rede, uma exceção é lançada (como uma declaração de lançamento), o registro de erros é emitido no registro automaticamente.

            img

        As funções da API no FMZ, funções que podem gerar log output como Log ((...), exchange.Buy ((Price, Amount), exchange.CancelOrder ((Id), etc., todas elas 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]), isto é, para gerar as informações de ordem quando a ordem de ordens[j] é cancelada.

        function main() {
            Log("data1", "data2", "data3", "...")
            var data2 = 200
            var id = exchange.Sell(100000, 0.1, "Attached data1", data2, "...")
            exchange.CancelOrder(id, "Attached data1", data2, "...")
            LogProfit(100, "Attached data1", data2, "...")
        }
        
      • Utilização de funções de indicador Antes de falar sobre a função do indicador, vamos entender primeiro o que é um indicador. P: De onde vieram estes indicadores? R: Claro que é calculado. P: Qual é a base do cálculo? R: Calculo baseado em dados da linha K. P: Dê um exemplo? R: Tomando o indicador mais simples, o indicador da média móvel, como exemplo, se usarmos os dados diários da linha K (ou seja, uma linha positiva ou negativa representa um dia) como fonte de dados para o cálculo do indicador. P: O indicador da média móvel pode ser calculado se o número de BARs da linha K for inferior a 10? A: 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 índice efetivo quando o número de dados BAR de linha K não atende ao parâmetro do período do indicador, e a posição correspondente da matriz calculada será preenchida com valores vazios, por exemplo, oJavaScriptA estratégia de linguagem será exibidanullAo imprimir os dados do indicador calculado.

        Acontece que há um exemplo tutorial no quadrado estratégia:https://www.fmz.com/strategy/125770Backtest a estratégia exemplo tutorial, podemos ver o gráfico gerado pelo sistema de backtesting e a média móvel de 10 períodos:

        img

        Estratégia de desenho personalizado, K-line desenhada, bem como gráficos de média móvel.

        img

        P: E se eu quiser uma média móvel de 10 horas? R: Usar dados de linha K com os dados de linha K do período horário será bom.

        Em termos leigos, a linha K que vemos é uma matriz depois de digitalizá-la (você pode perguntar ao Baidu se você não entende o conceito de matriz), cada elemento da qual é uma coluna de linha K, que é organizada em ordem, o primeiro elemento na matriz é o mais distante do tempo atual, e o último elemento da matriz é o mais próximo do tempo atual. Normalmente, a última barra dos dados da linha K é a barra do período atual, que muda em tempo real e é incompleta (você pode observar as alterações entrando em uma página de troca e observar a linha K). Os indicadores calculados também estão em correspondência com as barras da linha K. No exemplo acima, podemos 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 Quant FMZ, podemos usar a biblioteca TA (a biblioteca implementada pela plataforma FMZ, integrada no docker e vários idiomas podem ser usados diretamente) ou a biblioteca talib (a antiga biblioteca de indicadores talib, JS, integração C ++, Python precisa ser instalada por si mesmo). Por exemplo, para calcular a média móvel no exemplo acima: Use a biblioteca TA:

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

        Use a biblioteca talib:

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

        Os dados do indicador calculado ma são uma matriz, e cada elemento corresponde à matriz de linhas K (registros) um para um, ou seja,ma[ma.length -1]corresponde arecords[records.length - 1], e assim por diante.

        O mesmo vale para outros indicadores complexos, e precisamos prestar atenção a indicadores como o MACD.

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

        Neste momento, a variável macd é uma matriz bidimensional (você pode perguntar ao Baidu se não entender 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, linha dea) e um conjunto de barras de volume (macd volume bar, na verdade, estes dados de volume bar também pode ser considerado como uma linha).

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

        Aqui está também um exemplo de tutorial pronto, se estiver interessado, você pode estudar em:https://www.fmz.com/strategy/151972

        img


Relacionados

Mais.