A programação visual sempre foi uma meta desejada pelos desenvolvedores de ferramentas de software, mesmo no campo da negociação quantitativa. Porque a abordagem de visualização “o que você vê é o que você obtém” reduz muito o limite técnico para o desenvolvimento de programação. Os usuários não precisam mais lidar com um monte de codificação chata. Eles só precisam usar seus cérebros, imaginação e pensamento lógico, e focar no negócio em si. Você pode realizar um programa que você deseja, não é incrível!
Então vamos entrar juntos no campo da programação visual de estratégias de negociação quantitativa!
Após efetuar login em https://www.fmz.com, registre uma conta (se já tiver se registrado, faça login diretamente) e clique em: Centro de Controle->Biblioteca de Políticas->Nova Política.
Podemos ver uma estratégia de visualização inicial. Ele somente emite as informações de ativos da conta da exchange configurada padrão (o primeiro objeto de exchange adicionado no backtest ou robô). (Como mostrado abaixo)
## Antes de começarmos a aprender como usar a visualização, podemos primeiro entender alguns conceitos de design de visualização.
Uma observação cuidadosa revela que todos os módulos têm encaixes (côncavos) e encaixes (convexos), o que significa que os módulos podem ser “conectados” e “conectados”. Se os códigos funcionais representados por dois módulos puderem ser conectados, eles serão encaixados quando você aproximar a espiga e o encaixe dos dois módulos.
Alguns módulos possuem algumas configurações especiais, por exemplo:
Você pode arrastar o módulo “Projeto” à esquerda para o módulo “Unir”, para poder adicionar uma posição de encaixe e espiga, adicionando assim uma posição para emendar o texto. Dessa forma, você pode fazer alguns ajustes e configurações no módulo clicando na pequena engrenagem.
Alguns módulos exigem parâmetros de entrada, que podem ser valores, strings, etc. Se você não adicionar variáveis como parâmetros de entrada do módulo, o módulo será executado de acordo com os parâmetros de entrada padrão.
Um módulo de cálculo como este para encontrar raízes quadradas gera os resultados dos cálculos deste módulo.
Como você pode ver, se o parâmetro de entrada estiver ausente, o valor padrão 9 será usado como parâmetro de entrada para calcular a raiz quadrada de 9.
Claro, se você quiser usar um módulo variável como um parâmetro de entrada, você pode conectar diretamente o módulo variável à posição de encaixe e espiga (recesso).
O módulo pode ser clicado e arrastado com o botão esquerdo do mouse. Os módulos podem ser copiados usando ctrl + c e colados usando ctrl + v, tão convenientemente quanto copiar e colar código ou texto. A área de operação pode ser ampliada ou reduzida usando a roda do mouse, e todos os módulos serão ampliados ou reduzidos. Clique e segure uma área em branco na área de operação e arraste para mover a área de operação. A lixeira à direita registra os módulos que foram excluídos recentemente. Mais importante, depois de montar a estratégia do módulo, não se esqueça de clicar em “Salvar”.
Você pode ver que há muitas categorias de módulos no lado esquerdo da área de edição visual, e há muitos módulos visuais disponíveis em cada categoria.
Há 11 categorias no total.
Este módulo é normalmente usado em combinação com módulos de texto, conforme mostrado abaixo:
Você pode inserir uma string no módulo de classe de texto para que, quando você executar o módulo “informações de saída”, o conteúdo da string no módulo de texto seja impresso.
Teste retrospectivo:
Como código de linguagem JavaScript:
function main(){
Log("你好,可视化编程!")
}
Este módulo se parece com “Informações de saída”, exceto que ele emite informações e as envia para a conta WeChat vinculada à conta atual.
Como código de linguagem JavaScript:
function main () {
Log("微信推送!@")
}
O módulo throw exception permite que o programa gere um erro e então interrompa a execução do programa (sem escrever código de tratamento de exceção).
Isso é semelhante à estratégia do JavaScript, em que a função throw “string a ser gerada” é executada diretamente na função principal.
function main () {
throw "第一句就抛出异常,让程序停止!"
}
Resultados do backtesting:
Geralmente é usado com mais frequência durante a depuração, por exemplo, quando você deseja que o programa pare sob uma determinada condição e imprima alguns dados naquele momento para facilitar a observação.
Ou você pode colocar um módulo de geração de exceções no fluxo de código onde podem ocorrer problemas, para que o programa possa relatar erros e descobrir alguns erros.
Módulo de hibernação
Como na estratégia JavaScript:
function main () {
Sleep(1000 * 5)
}
Teste o módulo de hibernação:
Resultados do backtesting:
Este módulo é semelhante à função LogProfit da API da plataforma de negociação quantitativa do Inventor, imprimindo o log de lucro e desenhando automaticamente a curva de lucro com base nos parâmetros de entrada.
Por exemplo:
A execução do backtest é mostrada abaixo:
O código de política JavaScript correspondente é o seguinte:
function main () {
LogProfit(1)
Sleep(1000 * 5)
LogProfit(2)
Sleep(1000 * 5)
LogProfit(3)
Sleep(1000 * 5)
LogProfit(2)
Sleep(1000 * 5)
LogProfit(5)
}
Ele pode ser emendado em qualquer local onde você queira gerar informações de receita.
O módulo de loop pode encapsular uma série de combinações de módulos emendados e permitir que essa combinação de módulos seja executada em um loop.
teste:
Resultados do backtesting:
Pode-se observar que após o módulo de loop envolver a combinação de módulos que consiste em Print Profit e Sleep, a combinação de módulos será executada continuamente.
O uso deste módulo é basicamente o mesmo do módulo de loop, a única diferença é que este módulo tem uma função de suspensão integrada.
Este módulo pode ser usado quando módulos variáveis ou valores numéricos precisam controlar a precisão. O valor numérico da parte do parâmetro de entrada será emitido como o valor numérico das casas decimais especificadas de acordo com as configurações.
Por exemplo, o número 3,1415926535897 é processado com precisão.
O backtesting mostra:
Usado para limpar logs. Dependendo dos parâmetros de entrada, uma parte dos logs pode ser retida. Conforme a documentação da API:
LogReset()
Usado para limpar o log de receita. Dependendo dos parâmetros de entrada, uma parte do log pode ser retida. Conforme a documentação da API:
LogProfitReset()
Este módulo de ferramenta precisa ser usado em conjunto com o módulo de mercado no “Tipo de módulo de negociação”, conforme mostrado na figura:
Use o módulo de informações de saída para gerar o preço de transação mais recente do mercado de ticker mais recente:
O backtesting mostra:
Como o código de estratégia JavaScript:
function main () {
Log(exchange.GetTicker().Last)
}
Este módulo também precisa ser usado junto com o módulo de aquisição de dados K-line no “Tipo de módulo de negociação”.
Primeiro crie um módulo variável e nomeie-o: K-line.
Em seguida, obtenha os dados da linha K, use o módulo de dados da linha K para obtê-los e atribua-os ao módulo de variável: “linha K”.
Em seguida, use o módulo de comprimento da lista no “Tipo de módulo de lista” para obter o comprimento do módulo variável da linha K, que é usado para especificar de qual barra da linha K obter dados.
Costure, conforme mostrado:
Quando o backtest é executado, o registro de data e hora da última barra da linha K é impresso.
Ele também precisa ser usado junto com o módulo Obter Dados de Profundidade no “Tipo de Módulo de Transação”.
Defina o índice como 0, defina uma ordem de venda e obtenha as informações da ordem de venda.
Como o código de estratégia JavaScript:
function main () {
Log(exchange.GetDepth().Asks[0])
}
Este módulo precisa ser usado em conjunto com o módulo Obter informações de ativos.
Por exemplo: imprimir a quantidade de moedas disponíveis na conta corrente
O backtesting mostra:
Como na estratégia JavaScript:
function main () {
Log(exchange.GetAccount().Stocks)
}
Este módulo é usado para obter o valor de um determinado atributo nos dados do pedido, como o preço ou a quantidade da primeira venda no livro de pedidos (exemplo número 13).
Resultados do backtesting:
Como na estratégia JavaScript:
function main () {
Log(exchange.GetDepth().Asks[0].Price)
}
Ele também pode ser usado para obter um determinado atributo nas informações do pedido retornadas pelo “Módulo de Detalhes do Pedido de Consulta” (que será explicado na seção avançada).
Da mesma forma, ele deve ser usado junto com o “Get Futures Position Module”. Deve-se notar que os dados de posição retornados pelo Get Futures Position Module são uma matriz (lista), que é uma estrutura de dados contendo posições de diferentes contratos e direções . Portanto, você deve especificar o índice ao usá-lo.
Depois de aprender tanto, vamos combinar uma operação de hedge, ou seja, fazer hedge tanto de contratos de curto prazo quanto de contratos futuros ao mesmo tempo. Fazemos um hedge de arbitragem positivo, ou seja, abrimos um contrato a termo curto, 1 contrato, e abrimos um contrato longo no curto prazo.
Resultados do backtesting:
Exemplo de estratégia de visualização:
Mais estratégias estão disponíveis em: https://www.fmz.com/square
Outros artigos desta série