
Aprenda a estratégia de negociação da construção de módulos visuais - capítulo de introdução, e tenha uma compreensão conceitual da construção e junção de módulos visuais. Então é fácil aprender a usar outros módulos. Algumas funções mais complexas podem ser combinadas.
Em estudos e testes anteriores, entramos em contato com vários módulos de “categoria de transação”. Por exemplo: Módulo “Cotações de Câmbio” Módulo “Troca Obter K-line” …
Não entrarei em detalhes sobre aqueles que já foram usados.

Ao escrever uma estratégia para negociar com um robô, você pode adicionar mais de um objeto de troca, por exemplo, uma estratégia de hedge. Ou você precisa percorrer (travessia significa visitar cada um deles, um por um) os objetos de troca para acessar as condições de mercado. Neste momento, você precisa usar um módulo para obter o número de trocas.
Podemos primeiro usar uma estrutura simples para imprimir o número de trocas atualmente configuradas:

Na verdade, é como chamar o seguinte código de política JavaScript:
function main () {
Log(exchanges.length)
}
Vejamos os resultados da execução deste módulo combinado:

Você pode ver que adicionamos 3 objetos de câmbio, representando três contas de câmbio diferentes, e o resultado da saída do log de backtest é 3.

Ao adicionar três objetos de troca, a caixa suspensa mostrará três opções.
Aprenda um módulo de loop com antecedência, no tipo loop.

Vamos aprender um módulo de julgamento condicional com antecedência:
A condição de julgamento pode ser escrita como:

Usamos o módulo loop para iterar sobre os nomes de troca adicionados Use o módulo de julgamento condicional para determinar se a contagem de loop atual corresponde ao nome da troca a ser impressa.

Resultados da execução do backtest:

Como o código de estratégia JavaScript:
function main () {
for (var i = 1 ; i <= exchanges.length ; i++) {
if (i == 1) {
Log(exchanges[0].GetName())
} else if (i == 2) {
Log(exchanges[1].GetName())
} else {
Log(exchanges[2].GetName())
}
}
}

Um exemplo simples obtém o par de negociação do primeiro objeto de troca atualmente definido e o atribui à variável de texto (criada na categoria de variável com antecedência).
Resultados do backtesting:

Se você chamar o código da política JavaScript:
function main () {
var text = exchange.GetCurrency()
Log(text)
}
Este módulo é muito importante e é usado para colocação de pedidos. A variável de preço é incorporada na primeira posição do encaixe (ranhura) para especificar o preço do pedido. Você também pode inserir diretamente um valor fixo.
A segunda posição do espigão (ponto) incorpora a variável de quantidade do pedido, que é usada para especificar a quantidade do pedido.
Por exemplo, criaremos um exemplo de colocação de uma ordem de compra com base no preço mais recente dos dados de mercado de ticks atuais, com um deslizamento de 10 yuans, definindo a quantidade da ordem para 0,1 moedas e imprimindo o ID da ordem.

Resultados da execução do backtest:

Como o seguinte código de política JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last + 10, 0.1)
Log(id)
}

Este módulo retornará todas as ordens não finalizadas para o par de negociação atual. A estrutura retornada é uma lista (array), que pode ser processada por módulos do tipo lista (operações de travessia, etc.). Por exemplo: modificamos ligeiramente o exemplo do módulo de pedido [4] acima e alteramos o preço de 10 yuans adicionado ao fazer um pedido para uma subtração de preço de 10 yuans. A ordem não será executada imediatamente, mas ficará pendente na profundidade de compra e venda (ou seja, em um determinado nível entre Compra 1, Compra 2 e Compra N), de modo que a ordem estará em uma ordem pendente aguardando execução. Em seguida, usamos o módulo “Obter a ordem de confiança do par de negociação atual” para obter uma lista de ordens no estado PENDENTE (aguardando execução). Para evitar a execução de ordens em condições de mercado subsequentes e afetar a observação final do backtest, após o módulo “Obter a ordem de confiança do par de negociação atual” ser executado e a lista de ordens ser impressa, usamos imediatamente o “Lançar exceção ” módulo para parar o programa.

O backtesting mostra:

O preço da ordem de compra é 10 yuans menor que o preço mais recente naquele momento, então a transação não será concluída imediatamente. Depois, pegue os pedidos que estão aguardando execução e imprima-os. Por fim, uma exceção é lançada para interromper o programa.
Todo o módulo montado é como chamar uma estratégia JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(id)
Log(exchange.GetOrders())
throw "stop"
}

Este módulo é usado para cancelar um pedido.
Há muitos cenários em que isso é necessário ao escrever políticas:
Cancele todos os pedidos pendentes.
Sem dúvida, isso exigirá o uso do “módulo de cancelamento de ordem”. Ao aprender o módulo de cancelamento de ordem, podemos usar [5] para obter o módulo para a ordem de confiança do par de negociação atual e combiná-los para atingir essa função.
Primeiro, para testar o cancelamento de todos os pedidos, fazer um pedido não é muito óbvio, começamos fazendo dois pedidos com preços e quantidades diferentes para distinguir os dois pedidos.

Use o módulo “Percorrer cada elemento na lista” no módulo do tipo loop para percorrer os pedidos na lista de pedidos pendentes atual.
Durante a travessia, cada ordem recuperada é atribuída ao módulo variável order (criado no tipo de módulo variável, conforme mostrado abaixo:)
Use o módulo de tipo de ferramenta:
Retire o ID do pedido e passe-o para a posição côncava do módulo de cancelamento de pedido, e o módulo de cancelamento de pedido executa o pedido de cancelamento.
Execução de backtest:

Usando a descrição da política JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(id)
var id2 = exchange.Buy(_C(exchange.GetTicker).Last - 12, 0.2)
Log(id2)
var orders = exchange.GetOrders()
Log(orders)
for (var i in orders) {
var order = orders[i]
Log(exchange.CancelOrder(order.Id))
}
}

Este módulo pode retornar informações detalhadas do pedido conectando um módulo variável de ID do pedido à posição de encaixe e espiga.

Preste atenção na ordem retornada após a execução:

Comparado com os resultados da execução no exemplo [5], pode-se descobrir que a ordem impressa é uma informação de ordem separada.[] Entre colchetes.
Como o exemplo [5] retorna uma lista, este exemplo retorna uma única informação de ordem (obtida com base na variável ID module na posição do encaixe passada pelo módulo).
O exemplo acima é equivalente à execução de uma política JavaScript:
function main () {
var id = exchange.Buy(_C(exchange.GetTicker).Last - 10, 0.1)
Log(exchange.GetOrder(id))
}
Estudaremos os módulos acima um por um e definiremos a bolsa de teste para futuros de commodities.
Configurações de backtesting:
O exemplo a seguir faz um backtest dessa configuração.

Futuros de commodities têm horários de abertura e fechamento. Quando o mercado está fechado, você não consegue se conectar.

Quando o objeto de troca é configurado como uma bolsa de futuros, se você não definir o contrato e obter diretamente as informações de mercado, um erro será relatado:

Definimos o contrato para MA909, que é o principal contrato atual para metanol.
Dessa forma, obtém-se o valor de preço mais recente no mercado de ticks atual do contrato MA909.
No módulo de ordem de execução

A direção da ordem precisa ser especificada porque os futuros têm:
comprar: abrir uma posição longa
vender: abrir uma posição curta
closebuy: fechar posição longa
closesell: fechar posição vendida
Quatro direções (futuros de commodities têm mais duas direções: closebuy_today fecha posições compradas hoje, closesell_today fecha posições vendidas hoje).
Por exemplo, se o módulo de ordens estiver definido para comprar, haverá dois significados: abrir uma posição longa e fechar uma posição curta, o que cria ambiguidade. Portanto, o módulo “Definir direção da ordem de negociação de futuros” é necessário para definir uma direção clara da ordem.

O backtesting mostra:

Como o código de estratégia JavaScript:
function main () {
while (true) {
if (exchange.IO("status")) {
exchange.SetContractType("MA909")
Log(exchange.GetTicker().Last)
exchange.SetDirection("buy")
Log(exchange.Buy(1000, 1))
throw "stop"
} else {
Log("未连接商品期货前置机")
}
Sleep(1000)
}
}
O uso de futuros de moeda digital é basicamente o mesmo que o uso de futuros de commodities em [8] acima.
Tomando o OKEX como exemplo, o código do contrato pode ser:
BitMEX :
Configurando o módulo de alavancagem

Usado para definir alavancagem para futuros de moeda digital.
# 注意 : 回测不支持。
Como na estratégia JavaScript:
function main () {
exchange.SetMarginLevel(10)
}
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