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.
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.
O que precede é dividido a partir da perspectiva das estratégias de negociação.
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
Interfaces que não requerem verificação
Geralmente conhecido como API KEY
Este 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
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.IO
Funçã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?
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)ticker
variável (ver a estrutura devolvida pela função GetTicker), precisamos usarvar newPrice = ticker.Last
Para 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 paranull
Neste 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égianull
O 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ó oGetTicker
A 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...
Como a função de ordem é apenasBuy
, Sell
No 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)
}
Aqui, pode perguntar:
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 print
- 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:
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 oLogStatus
Para mais detalhes, consulte a documentação da API FMZ.
Coluna de registo Também dispalyed na página real bot, como mostrado na figura:
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:
Registro comum, as estratégias no FMZ adotam a função Log para a saída e impressão no registro de estratégia.
Registo de pedidos, utilizaçãoexchange.Sell
/exchange.Buy
em FMZ
Registo de cancelamento,exchange.CancelOrder
é utilizado na estratégia da FMZ
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.
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, oJavaScript
A estratégia de linguagem será exibidanull
Ao 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:
Estratégia de desenho personalizado, K-line desenhada, bem como gráficos de média móvel.
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