Configuração da troca de estratégia quantitativa de negociação de criptomoedas

Autora:Bem-estar, Criado: 2019-09-16 14:55:26, Atualizado: 2023-11-07 20:50:11

img

Quando um iniciante projeta uma estratégia quantitativa de negociação de criptomoedas, muitas vezes existem vários requisitos de funções. Independentemente das linguagens de programação e plataformas, todos eles encontrarão vários requisitos de design. Por exemplo, às vezes são necessárias várias variedades de negociação de rotação, às vezes é necessária cobertura multi-plataforma e às vezes diferentes variedades de negociação são necessárias para serem concorrentes.

A plataforma de aprendizagem continua a utilizar a plataforma de negociação FMZ Quant (https://www.fmz.com), e o mercado é selecionado como o mercado de criptomoedas.

Projeto de estratégia multi-criptomoeda

A maioria dessas situações de demanda é preparada para estratégias de tendência e rede de criptomoedas, que precisam ser executadas no mercado com diferentes métodos de iteração de negociação.

Normalmente, é projetado assim:

function Process (symbol) {
     exchange.IO("currency", symbol)
     var ticker = _C(exchange.GetTicker)
     Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
     // ...
     // ..
     // .
}

function main(){
     var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
     while (true) {
         for (var i = 0 ; i < symbols.length; i++) {
             Process(symbols[i])
             Sleep(500)
         }
     }
}

Configuramos o robô:

img

img

Pode-se ver que isso percebe que um objeto de troca é configurado no robô, e o par de negociação é trocado; o mercado de pares de negociação diferentes é obtido, e o mercado de variedade multi-negociação é executado; e executado sob uma lógica de estratégia.

Pode-se ver que os três pares de negociação que definimos: BTC_USDT, LTC_USDT, ETH_USDT, no loop, obtêm iterativamente a cotação do mercado, e depois de obter as informações, pode detectar especificamente o mercado e desencadear a lógica de negociação projetada pela estratégia.

Alguns leitores podem perguntar: Não gosto de trocar pares de negociação, parece um pouco problemático e a lógica da estratégia não é clara.

Existem, de facto, outras opções de conceção, que apresentaremos a seguir.

Configuração de vários objetos de troca para o robô na mesma conta de troca

Os dados de mercado de diferentes pares de negociação são obtidos através de múltiplos objetos de troca e são executados na lógica da estratégia iterativa.

Por exemplo, configure o robô configurando três objetos de troca para o robô. Os pares de negociação são definidos para BTC_USDT, LTC_USDT e ETH_USDT, respectivamente.

img

O nome é o objeto de troca OKEX Spot V3 Test, na página do painel, na página de configuração de troca:

img

Está tudo feito.

Nós mudamos um pouco deste código, porque desta vez nós adicionamos vários objetos de troca para o robô, que são os objetos de troca do par de negociação BTC_USDT, LTC_USDT, ETH_USDT.

function Process (e) {
    var ticker = _C(e.GetTicker)
    Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
    // ...
    // ..
    // .
}  

function main(){
    while (true) {
        for (var i = 0 ; i < exchanges.length; i++) {
            Process(exchanges[i])
            Sleep(500)
        }
    }
}

Acerte o robô:

img

O exemplo que descrevemos acima, seja trocando pares de negociação ou adicionando um objeto de negociação para vários pares de negociação diferentes de uma conta de configuração.

Então, como é que se usam várias contas de câmbio numa mesma estratégia?

Estratégia de utilização de várias contas de câmbio

Algumas estratégias, tais como cobertura de mercado transversal de várias bolsas, estratégias de várias contas dentro de uma única bolsa.

  • Configuração de intercâmbios múltiplos com intercâmbios diferentes

img

Por exemplo, temos configurado 2 trocas no painel -> Troca -> Adição Exchange página.

Podemos aceder às informações de activos das contas configuradas por estas duas bolsas na estratégia.

img

function main(){
     Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
     Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}

Claro, eu também posso adicionar uma segunda e terceira configuração de troca de contas para uma troca.

  • Configuração de intercâmbios múltiplos com a mesma central.

Por exemplo, adicionamos outra conta para Huobi Futures.

img

Como podem ver, isto configura as contas das duas bolsas Huobi Futures.

img

Quando a estratégia é criada, um objeto Huobi Futures Exchange aparece na opção Modificar configuração do Robot para seleção.

img

Por exemplo, isso permite que duas contas vendam primeiro e depois comprem com a estratégia típica de rede (para cima) ou comprem primeiro e depois vendam (para baixo).

Através dos dois exemplos acima

Aqui está a diferença entre configurar vários objetos de troca no robô e Configurar vários objetos de troca para a mesma conta de troca para o robô:

Este exemplo impressionante e acima mencionado de A mesma conta de câmbio tem vários objetos de câmbio para o robô é um pouco semelhante, mas há diferenças.

A diferença é que o exemplo acima é uma configuração de troca, ou seja:

img

Quando o robô configura o objeto de troca, ele sempre usa:

img

Esta configuração.

É só que quando você adiciona um objeto de troca, as configurações do par comercial são diferentes.

Se a função GetAccount for chamada, as informações do ativo da mesma conta são sempre acessadas.

No entanto:

img

Os dois objetos de troca de futuros huobi assim configurados, embora sejam todos futuros huobi, representam contas de troca diferentes.

  • O uso da configuração de troca facilita o projeto da estratégia de futuros de criptomoedas.

Às vezes, na estratégia de hedging de contratos de criptomoedas, a fim de aproveitar as oportunidades de negociação passageiras, muitos cenários precisam ser colocados simultaneamente.exchange.GoA função para executar uma função de colocação de ordem ou obter a cotação, há um problema com a sincronização, não muito rápido.

Claro que existem, podemos adicionar dois objetos de troca para o robô seguindo o Configure múltiplos objetos de troca para o robô na mesma conta de troca

img

Em seguida, use esta configuração de troca para adicionar outro objeto de troca.

Uma caixa de aviso vai aparecer!

img

Uma configuração de conta de câmbio, você não pode adicionar objetos de câmbio da mesma moeda ou par de negociação.

O que devo fazer? Parece que o robô de estratégia não pode usar dois objetos de troca, e o objeto de troca está ligado a um número de conta de troca?

Ainda há uma maneira!

Vamos para o Dashboard -> Exchange, e depois adicionar uma configuração de troca de futuros OKEX.

img

Clique em Salvar quando configurado.

img

Desta forma, temos duas configurações de troca, mas a mesma informação de configuração API KEY é usada.

img

Quais são os benefícios disso?

Quando escrever uma estratégia, o desenho será muito simples!

function main(){
    exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
    exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
    
    while (true) {
        var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
        var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
        var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
        
        var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
        var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
        var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
        
        if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
            var diff = tickerA.Last - tickerB.Last // calculate the difference
            $.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
            if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
                // Hedging
                rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
                rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
                
                var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
                var idB = rB.wait() // ...
            }
            
            // ...
        }
        
        LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
        Sleep(500)
    }

Esta estratégia de design é muito mais simples e clara?

Operação real do mercado:

img

Como podem ver, são necessários apenas cerca de 50 milissegundos para obter o preço de dois contratos de cada vez.


Relacionados

Mais.