4.2 Como implementar negociação estratégica na linguagem JavaScript

Autora:Bem-estar, Criado: 2019-04-27 11:53:15, Atualizado:

Resumo

No artigo anterior, introduzimos o conhecimento fundamental que quando se usa JavaScript para escrever um programa, incluindo a gramática básica e materiais.

Introdução da estratégia

A banda de Bollinger é um dos indicadores técnicos mais utilizados, inventado por John Bollinger na década de 1980. Em teoria, os preços sempre flutuam em torno de uma certa faixa de valores.

O método de cálculo é usar o princípio estatístico, primeiro calcular o desvio padrão do preço por um período de tempo e, em seguida, adicionar ou subtrair 2 vezes o desvio padrão da média móvel para encontrar o intervalo confiável do preço.

img

Devido ao conceito de desvio padrão, a largura da banda de Bollinger é ajustada dinamicamente com base nas flutuações recentes dos preços. Quando as flutuações são pequenas, as bandas de Bollinger serão mais estreitas; caso contrário, as flutuações serão maiores e as bandas de Bollinger serão mais largas. Quando o canal BOLL está mudando de estreito para largo, o preço retorna gradualmente à média. Quando o canal BOLL está mudando de largo para estreito, isso significa que o preço de mercado começa a mudar. Se o preço atravessar o trilho superior, isso significa que o poder de compra é aprimorado.

Método de cálculo do indicador da banda de Bollinger

Entre todos os indicadores técnicos, o método de cálculo da banda de Bollinger é um dos mais complicados, que introduz o conceito de desvio-padrão na estatística, envolvendo o cálculo da trajetória média (MB ), da trajetória superior (UP) e da trajetória inferior (DN).

  • Ferrovia central = média móvel simples de N períodos de tempo

  • Reel superior = reel médio + desvio padrão do período de tempo K × N

  • Ferrovia inferior = Ferrovia média − desvio-padrão do período de tempo K × N

function main( ) { // program entry
    while (true) { // enter the loop
        exchange.SetContactType('this_week'); // set contact type
        var records = exchange.GetRecods(); // get the k line array
        var boll = TA.B0LL(records, 50); // get the 50-cycle BOLL indicator array
        var top = boll[0]; // get the upper-rail BOLL indicator array
        var ma = boll[l]; // get the middle-rail BOLL indicator array
        var bottom = boll[2]; // get the lower-rail BOLL indicator array
        Log(top); // print the upper-rail BOLL indicator array to the log
        Log(ma); // print the middle-rail BOLL indicator array to the log
        Log(bottom);// print the lower-rail BOLL indicator array to the log
    }
}

Estratégia lógica

As Bandas de Bollinger são usadas de várias maneiras e podem ser usadas sozinhas ou em combinação com outros indicadores. Nesta seção do tutorial, vamos usá-lo da maneira mais fácil, que é: Quando o preço atravessa o trilho superior, abra uma posição longa; quando o preço atravessa o trilho inferior, abra uma posição curta.

img

Se o preço for novamente devolvido ao trilho médio da Banda de Bollinger após a abertura da posição longa, acreditamos que a força do poder de compra está enfraquecendo, ou a força do poder de venda está fortalecendo, portanto, é aqui que entra o sinal de posição de fechamento. a mesma lógica para posição curta.

Condições de negociação

  • Posição longa aberta: Se não houver posição e o preço de fechamento for superior à linha de fundo.

  • Posição curta: Se não houver posição e o preço de fechamento for inferior ao nível da linha inferior.

  • Fechar posição longa: se a posição longa for mantida e o preço de fechamento for inferior ao preço médio,

  • Fechar posição curta: se a posição curta for mantida e o preço de fechamento for superior ao nível médio,

Implementação do código de estratégia

Para alcançar a estratégia, primeiro precisamos considerar quais dados precisamos? através de que API para obter? então como calcular a lógica de negociação? finalmente, qual a maneira de colocar o pedido? vamos implementá-lo passo a passo:

Passo 1: Utilize o quadro estratégico da CTA

A chamada estrutura de estratégia CTA é um conjunto de estruturas padrão que a FMZ Quant projetou oficialmente. Usando esta estrutura, você pode ignorar o problema de programação trivial e se concentrar diretamente na lógica da programação. Por exemplo, se você não usar essa estrutura, precisará considerar mudar o preço da ordem, o tipo de ordem, retirar ordens e assim por diante.

function main() {
    $.CTA("this_week", function(st) {
        // write your strategy here
    })
}

O quadro acima é a estratégia CTA usando a ferramenta FMZ Quant. É um formato de código fixo, e todo o código de lógica de negociação está começando na linha 3.

Observe que o código de variedade de negociação acima é this_week, o que significa que representa o uso da linha k semanal, dados de negociação usando os dados semanais.

Passo 2: Obtenha todos os tipos de dados

Pensem nisso, que tipo de dados precisamos? de nossa lógica de negociação estratégica, primeiro precisamos obter o status da posição atual, e, em seguida, comparar o preço de fechamento com o indicador Bollinger Band trilhos superior, médio e inferior.

  • Obter dados da linha K.

O primeiro é obter a matriz de dados da linha K e o preço de fechamento da linha K anterior, com a matriz da linha K, podemos calcular o indicador da Banda de Bollinger. pode ser escrito assim:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

    })
}

Como mostrado acima:

Linha 4: Obtenha a matriz de linhas K, que é um formato fixo.

Linha 5 Filtrar o comprimento da linha K, porque o parâmetro para calcular o indicador da Banda de Bollinger é 20, quando a linha K é menor que 20, é impossível calcular o indicador da Banda de Bollinger.

Linha 6 : A partir da matriz de linhas K obtida, primeiro obtenha o objeto da linha K anterior e, em seguida, obtenha o preço de fechamento deste objeto. Obtendo o penúltimo elemento nesta matriz, que é o comprimento desta matriz menos 2 ((r[r.length - 2]).

Os elementos da matriz K-line são todos objetos, o objeto contém o preço de abertura, mais alto, mais baixo e de fechamento; também o volume e o tempo de negociação.

Por exemplo, para obter o preço de fechamento, basta adicionar ". " seguido pelo nome do atributo (r[r.length - 2].Close).

  • Obter dados de tempo da linha K

Como esta é uma estratégia intradiária, precisamos fechar todas as posições antes de um certo tempo ((a maioria das bolsas de negociação de criptomoedas geralmente abrem 24/7), então devemos julgar se a linha K atual está próxima daquele determinado momento quando devemos parar de negociar ou fazer uma pausa. Se estiver perto dessa linha K de fechamento, feche todas as posições. Se não estiver, continue a estratégia. O código é escrito assim:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
    })
}

Como mostrado acima:

Linha 8: obtenha os objetos do atributo timestamp da linha K e, em seguida, crie um objeto time ((new Date (timestamp)).

Linha 9: Calcule as horas e minutos de acordo com o objeto de tempo e determine se o tempo da linha K atual é 14:45.

  • Obter dados de posição

A informação de posição é uma condição muito importante na estratégia quantitativa de negociação. Quando as condições de negociação são estabelecidas, é necessário julgar se deve colocar uma ordem pelo status da posição e pelo número de posições. Por exemplo, quando as condições para abrir posições longas são estabelecidas, se houver posição de detenção, não coloque a ordem; se não houver posição de detenção, coloque a ordem. assim:

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

    })
}

Como mostrado acima:

Linha 11: Obtenha o status da posição atual. Se houver posição longa, o valor é 1; se houver posição curta, o valor é -1; se não houver posição, o valor é 0.

  • Obtenha dados da banda de Bollinger

Em seguida, precisamos calcular os valores dos trilhos superiores, médios e inferiores do indicador da Banda de Bollinger. precisamos obter a matriz booleana primeiro, e depois obter os valores dos trilhos superiores, médios e inferiores dessa matriz. Na ferramenta quântica FMZ, é muito simples obter a matriz booleana, basta chamar a API da Banda de Bollinger diretamente, é uma matriz bidimensional.

A ordem para obter o valor é: primeiro obter a matriz especificada na matriz e, em seguida, obter o elemento especificado a partir da matriz especificada, como mostrado abaixo:

var arr = [[100, 200, 300],[10,20,30],[1,2,3]]; // this is a two-dimensional array
var test = arr[0]; //first obtain the specified array in the array and assign the value to variable "test"
var demo1 = test[0]; //then get a value from the test array
demo1; // the result is : 100

var demo2 = arr[0][0]; // you also can write like this
demo2; // the result is the same : 100

Abaixo, das linhas 13 a 19 estão obtendo a parte de codificação de trilhos superiores, médios e inferiores da banda de Bollinger, onde a linha 13 é usada pela ferramenta FMZ Quant API, que pode acessar diretamente a matriz de bandas de Bollinger; a linha 14 a linha 16 estão obtendo a matriz bidimensional respectivamente para a matriz de trilhos superior, médio e inferior; a linha 17 a linha 19 estão obtendo o valor especificado da matriz de trilhos superior, médio e inferior.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2];  // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

    })
}

Etapa 3: Encomenda e negociação

Com os dados acima, podemos escrever a lógica de negociação e a parte de colocação de ordem agora. Também é muito simples, a mais usada é a declaração if, que pode ser descrita como: se a condição 1 e a condição 2 forem verdadeiras, coloque a ordem; se a condição 3 ou a condição 4 forem verdadeiras, coloque a ordem.

function main() {
    $.CTA("this_week", function(st) {

        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price

        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours

        var mp = st.position.amount; // get the holding position information

        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value

        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.

    })
}

Na figura acima, as linhas 21 a 24 são a parte de codificação da lógica de negociação e da colocação de ordens.

Tomemos a posição longa aberta como exemplo. Esta é uma declaração if. Se apenas uma linha de código for executada nesta declaração, as amarrações encaralizadas " {} " podem ser omitidas. A declaração é traduzida em texto, o que significa: se a posição atual for 0 e o preço de fechamento for maior do que o trilho superior, e o tempo da linha k não for 14:45, então " retornar 1 "

Você pode descobrir que estas linhas têm "return 1 " e "return -1", que é um formato fixo, o que significa: se é a direção de compra, escreva "return 1"; se é a direção de venda, escreva "return -1".

Código completo da estratégia

Neste ponto, um código de estratégia completa é escrito. Se a estrutura de negociação, dados de negociação, lógica de negociação e ordem de colocação são escritos separadamente, é muito simples?

function main() {
    $.CTA("this_week", function(st) {
        var r = st.records; // get the k line data
        if (r.length < 20) return; // filter the length of k line data
        var close = r[r.length - 2].Close; // get the previous k line closing price
        var time = new Date(r[r.length - 1].Time); // according the current k-line timestamp, create a time object
        var isClose = time.getHours() == 14 && time.getMinutes() == 45; // judging whether the current k-line is 14:45. this is just a example, you can specify any time you want during the 24 hours
        var mp = st.position.amount; // get the holding position information
        var boll = TA.BOLL(r, 20, 2); //calucating the Bollinger Band indicator
        var upLine = boll[0]; // get the up-rail array
        var midLine = boll[1]; // get the middle-rail array
        var downLine = boll[2]; // get the lower-rail array
        var upPrice = upLine[upLine.length - 2]; // get the previous K-line upper rail value
        var midPrice = midLine[midLine.length -2]; // get the previous K-line middle rail value
        var downPrice = downLine[downLine.length -2]; // get the previous K-line lower rail value
        if (mp == 1 && (close < midPrice || isClose)) return -1; // if holding long position, and the closing price is less than the mid-rail, or the current time is 14:45, closing long position.
        if (mp == -1 && (close > midPrice || isClose)) return 1; // if holding short position, and the closing price is greater than the mid-rail, or the current time is 14:45, closing short position.
        if (mp == 0 && close > upPrice && !isClose) return 1; // if there are no holding position, and the closing price is greater than the upper-rail, or the current time is not 14:45, open long position.
        if (mp == 0 && close < downPrice && !isClose) return -1;// if there are no holding position, and the closing price is less than the lower-rail, or the current time is not 14:45, open short position.
    })
}

Há duas coisas que precisam ser avisadas:

  1. Tente (mas não necessariamente) escrever a lógica da estratégia como a condição atual da linha K é estabelecida, em seguida, colocando a ordem na próxima linha k. Ou a condição anterior da linha k é estabelecida, colocando ordens na linha atual k, desta forma, o resultado do backtest e o desempenho real do mercado não são muito diferentes.

  2. Em geral, a lógica da posição de fechamento deve ser escrita na frente da lógica da posição de abertura. O propósito disso é tentar fazer a lógica da estratégia atender às suas expectativas. Por exemplo, se a lógica da estratégia apenas atender a situação em que precisa fazer a direção oposta de negociação depois de fechar uma posição, a regra deste tipo de situação é fechar a posição primeiro e depois abrir a nova posição. Se escrevermos a lógica da posição de fechamento na frente da lógica da posição de abertura, ela irá cumprir perfeitamente essa regra.

Resumindo

Acima, aprendemos cada etapa do desenvolvimento de uma estratégia quantitativa de negociação intradiária completa, incluindo: introdução da estratégia, método de cálculo do indicador de Bollinger, lógica da estratégia, condições de negociação, implementação do código de estratégia, etc. Através deste caso de estratégia, não só estamos familiarizados com os métodos de programação das ferramentas FMZ Quant, mas também podemos construir algumas outras estratégias que são adaptadas de acordo com este modelo.

A estratégia quantitativa de negociação não é nada mais do que um resumo da experiência ou do sistema de negociação subjetivo. Se escrevermos a experiência ou o sistema usado na negociação subjetiva antes de escrever a estratégia quantitativa e, em seguida, traduzi-la em código um por um, você descobrirá que a escrita de uma estratégia quantitativa será muito mais fácil.

Anúncio da secção seguinte

Em desenvolvimento de estratégia de negociação quantitativa, se só pode escolher uma linguagem de programação, sem hesitação, deve ser Python. Desde a obtenção de dados para backtesting, até mesmo a parte de colocação de pedidos, Python cobriu toda a cadeia de negócios. No campo do investimento quantitativo financeiro, Python ocupou uma posição extremamente importante, a próxima seção do curso começaremos a aprender a linguagem Python.

Exercícios após a escola

  1. Tente utilizar o conhecimento desta secção para implementar uma estratégia de média móvel dupla.

  2. Tente implementar a estratégia do indicador KDJ usando a linguagem JavaScript na plataforma FMZ Quant.


Mais.