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.
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ô:
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:
Existem, de facto, outras opções de conceção, que apresentaremos a seguir.
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.
O nome é o objeto de troca
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ô:
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?
Algumas estratégias, tais como cobertura de mercado transversal de várias bolsas, estratégias de várias contas dentro de uma única bolsa.
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.
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.
Por exemplo, adicionamos outra conta para Huobi Futures.
Como podem ver, isto configura as contas das duas bolsas
Quando a estratégia é criada, um objeto Huobi Futures Exchange aparece na opção Modificar configuração do Robot
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
Este exemplo impressionante e acima mencionado de
A diferença é que o exemplo acima é uma configuração de troca, ou seja:
Quando o robô configura o objeto de troca, ele sempre usa:
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:
Os dois objetos de troca de futuros huobi assim configurados, embora sejam todos futuros huobi, representam contas de troca diferentes.
À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.Go
A 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
Em seguida, use esta configuração de troca para adicionar outro objeto de troca.
Uma caixa de aviso vai aparecer!
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
Clique em Salvar quando configurado.
Desta forma, temos duas configurações de troca, mas a mesma informação de configuração API KEY é usada.
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:
Como podem ver, são necessários apenas cerca de 50 milissegundos para obter o preço de dois contratos de cada vez.