Desenvolvimento de estratégias de CTA para obter ganhos absolutos, desde transações quantitativas até gestão de ativos

Autora: , Criado: 2019-06-26 10:27:41, Atualizado: 2023-10-30 20:30:50

[TOC]

img

Prefácio

Por que aprender esta lição?O que é que se ganha aprendendo esta lição? Primeiro, a lição é baseada no JavaScript e no Python, linguagem que é apenas uma tecnologia, e, finalmente, temos de aplicar esta tecnologia a uma indústria.

Aprender o sistema através deste curso pode dar-lhe um conhecimento mais profundo sobre o campo da negociação quantitativa. Se você está pronto para entrar no campo da negociação quantitativa, os colegas também podem ajudá-lo. Se você é um amador de investimento em ações ou futuros, a negociação quantitativa pode auxiliar completamente o seu objetivo de negociação, desenvolvendo estratégias de negociação para obter lucros nos mercados financeiros, além de expandir os canais e plataformas de investimento financeiro.

Antes disso, vou falar sobre a minha experiência de negociação pessoal. Eu não sou de origem financeira, mas de estatística. Comecei a negociar ações desde os anos de estudante e, mais tarde, tornei-me um profissional de negociação quantitativa de fundos privados nacionais, principalmente fazendo pesquisa e desenvolvimento de estratégias.

No círculo de negociação, eu tenho mais de uma década, antes e depois, desenvolvendo todos os tipos de estratégias. Minha idéia de investimento é: controle de risco acima de tudo, foco em ganhos absolutos. Nosso tema do curso é: Desenvolver estratégias de CTA para ganhos absolutos, de negociação quantitativa a gestão de ativos.

1o, estratégia de CTA de futuros e lógica para ganhar dinheiro

1.1 Conhecer o CTA de futuros

O CTA é chamado de consultor de negociação de commodities no exterior e geralmente chamado de gerente de investimentos no país. O CTA tradicional concentra o dinheiro de grandes investidores, depois é confiado a instituições de investimento especializadas e, finalmente, através de um consultor de negociação (ou seja, CTA), investimentos em futuros de ações, futuros de commodities e futuros de títulos de dívida.

Mas, na realidade, com o crescimento do mercado global de futuros, o conceito de CTA também está se ampliando e é muito mais amplo do que os futuros tradicionais. Pode ser investido não apenas no mercado de futuros, mas também no mercado de juros, no mercado de ações, no mercado de câmbio e no mercado de opções, etc. Desde que a variedade tenha uma quantidade de dados históricos, pode-se desenvolver estratégias de CTA correspondentes com base nesses dados históricos.

Antes dos anos 80, a tecnologia dos discos eletrônicos ainda não estava muito desenvolvida, quando a maioria dos traders calculava manualmente os indicadores técnicos do índice William, KDJ, RSI, MACD, CCI e outros para determinar a evolução futura dos futuros de mercadorias. Mais tarde, os traders criaram fundos CTA dedicados para ajudar os clientes a gerenciar seus ativos. Só após a popularização dos discos eletrônicos, os fundos CTA de verdade começaram a aparecer.

Mudanças de tamanho da gestão do CTA img Unidades: mil milhões de dólares

Se olharmos para o gráfico acima, especialmente com a ascensão da negociação quantitativa, o tamanho global dos fundos CTA aumentou de US $ 130,6 bilhões em 2005 para mais de US $ 300 bilhões em 2015; e a estratégia CTA também se tornou uma das estratégias de investimento mais populares dos hedge funds globais.

O crescimento foi acompanhado pelo desempenho do CTA Fund, que é o Índice CTA da Barclays, o Índice CTA da Barclays, um indicador representativo do setor de consultores de comércio de commodities em todo o mundo. Desde o final de 1979 até o final de 2016, o Índice CTA da Barclays acumulou ganhos de 28,95 vezes, com um rendimento anual de 9,59%, com um índice de Sharpe de 0,37 e um retorno máximo de 15,66%.

Como a estratégia CTA geralmente mantém uma relação muito baixa com outras estratégias no portfólio de distribuição de ativos; como no círculo vermelho, durante o período de 2000-2002 do mercado de ações global e durante a crise global dos empréstimos em 2008, o índice de fundos CTA da Barclays não só não caiu, mas também obteve ganhos positivos, e o CTA pode fornecer ganhos fortes quando o mercado de ações e o mercado de títulos sofrem crises. Além disso, podemos ver que o índice CTA da Barclays em muitos produtos desde 1980 tem sido o nível de ganhos, sempre pressionando o P500 e também recuando abaixo do P500.

img

O desenvolvimento da CTA em nosso país é de apenas uma década, mas o impulso é forte, em grande parte devido ao ambiente de negociação de commodity futures mais aberto no país, um limite de capital de negociação mais baixo, a adoção de um sistema de fundos de garantia que permite transações bidirecionais mais amplas, taxas de transação mais baixas, a estrutura tecnológica das bolsas é mais avançada em relação às ações e mais fácil para a negociação sistêmica, etc.

Desde 2010, os fundos CTA existem principalmente na forma de fundos privados. Com a política nacional de abertura gradual do escopo de investimentos de investidores exclusivos, os fundos CTA começaram a existir na forma de investidores exclusivos, e seu modo de funcionamento mais transparente e público também se tornou um instrumento necessário para a distribuição de ativos de mais investidores.

img

Como o gráfico acima mostra, independentemente da facilidade de acesso, do limite de capital, da forma como a estratégia de negociação é executada e do emaranhamento de API, a estratégia CTA também é mais adequada para os traders individuais em relação a outras estratégias de negociação. Os contratos de variedades de futuros domésticos são muito pequenos, como milhares de moedas de milho ou feijão por dia, e quase não existem limites de capital.

img

O processo de design da estratégia CTA também é relativamente simples: primeiro, os dados históricos são processados preliminarmente e, em seguida, inseridos em um modelo quantitativo, que inclui estratégias de negociação formadas por ferramentas como modelagem matemática, programação e design, que geram sinais de negociação por meio da análise computacional desses dados.

1.2 Tipos de estratégias de CTA de futuros

A estratégia de CTA também é diversificada do ponto de vista da estratégia de negociação: pode ser uma estratégia de tendência ou uma estratégia de arbitragem; pode ser uma estratégia de longo prazo de médio ciclo ou uma estratégia de curto prazo diurno; a lógica estratégica pode ser baseada em análise técnica ou em análise fundamental; pode ser uma negociação subjetiva ou sistêmica.

A estratégia de CTA tem diferentes métodos de classificação, que podem ser divididos em: negociação subjetiva e negociação sistêmica, estratégia de CTA no exterior é mais avançada em desenvolvimento, estratégia de CTA de negociação sistêmica está perto de 100%. De acordo com o método de análise, pode ser dividido em: análise fundamental e análise técnica. De acordo com a fonte de receita, pode ser dividido em: negociação de tendência e negociação de choque.

No geral, as estratégias de CTA representam cerca de 70% das estratégias de tendência, cerca de 25% das estratégias de retorno do valor médio e cerca de 5% das estratégias de contratrend ou reversão de tendência. As estratégias de tendência que representam a maior parte, dependendo do ciclo de detenção, podem ser divididas em: negociação de alta frequência, negociação diurna, negociação de curta média e negociação de longa média.

Estratégias de freqüênciaAtualmente, existem dois tipos principais de estratégias de negociação de alta frequência no mercado, uma é a estratégia de alta frequência de fazer o mercado e outra é a estratégia de alta frequência de sucesso. A estratégia de fazer o mercado é fornecer liquidez no mercado de negociação, ou seja, em um mercado de negociação com comerciantes, alguém que deseja comprar ou vender um negócio deve garantir que seu único negócio possa ser transacionado.

Estratégias de preços de alta frequênciaO suporte de alta frequência é o comércio de duas ações ou ETFs e uma combinação de ETFs. De acordo com o método de cálculo do ETF, o preço esperado de um ETF pode ser calculado da mesma forma. O preço indicado pelo ETF pode ser subtraído do preço esperado do ETF, obtendo um diferencial, que geralmente funciona dentro de um canal de preços, que pode ser negociado se o diferencial atravessar o canal para baixo, esperando o retorno do diferencial e lucrar com ele.

Estratégia internaUma estratégia de negociação diurna pode ser chamada de estratégia de negociação diurna, se, literalmente, não se mantiver o estoque durante a noite. Como o ciclo de negociação diurna é curto e geralmente não é possível obter lucros imediatos após a entrada no mercado, a estratégia de negociação diurna é geralmente mais exigente para os traders, pois o mercado muda rapidamente em um curto período de tempo.

Estratégias de médio e longo prazoEm teoria, quanto maior for o período de posicionamento, menor será a capacidade estratégica e menor o risco de retorno. Especialmente em negociações institucionais, como o curto prazo é limitado e grandes capitais não podem entrar e sair em um curto período de tempo, mais estratégias médias e longas são configuradas.

Dados estratégicos do CTAGeralmente, as estratégias de CTA são estudadas com dados de minuto, hora e dia, que incluem: preço de abertura, preço máximo, preço mínimo, preço de fechamento, volume de transações, etc. Apenas uma pequena parte das estratégias de CTA usa dados de Tick, como dados de profundidade como preços de compra, venda, compra e venda nos dados L2.

img

Para a estratégia de CTA, a ideia básica é baseada em indicadores técnicos tradicionais, porque há mais referências públicas, e a lógica é geralmente mais simples e baseia-se em princípios estatísticos. Por exemplo, os indicadores técnicos mais conhecidos: MA, SMA, EMA, MACD, KDJ, RSI, BOLL, W&R, DMI, ATR, SAR, BIAS, OBV, etc.

Existem também modelos clássicos de negociação no mercado, que podem ser usados e melhorados, incluindo: combinações de linhas múltiplas, DualThrust, R-Breaker, Trading Beach, Trading Grid, etc.

Estes são estratégias de negociação baseadas na análise técnica tradicional, cujo processo é baseado em dados históricos e no conceito de negociação correto, refinar fatores ou condições de compra e venda com vantagem de probabilidade e assumir que o mercado continuará a existir no futuro, e finalmente implementar estratégias de negociação em código e negociação totalmente automática.

A maior vantagem da estratégia CTA é que pode obter ganhos absolutos, independentemente de o mercado atual estar em alta ou em baixa, especialmente quando o mercado está se transformando rapidamente em um bezerro, ou quando o movimento do mercado está claramente fluido. A vantagem desta estratégia é muito grande.

1.3 Princípios de lucro da estratégia de CTA de futuros

A estratégia de CTA de futuros é lucrativa principalmente por:

  1. Os movimentos de preços são anti-corpóreos e continuam sempre de forma tendencial. Quando os investidores observam que os preços estão subindo, eles compram com o vento, o que resulta em um aumento adicional dos preços. A mesma coisa acontece com a queda dos preços.
  2. A tolerância de cada investidor para a proporção de lucros e prejuízos é assimétrica, e a capacidade de aceitar o risco é diferente. Para a maioria dos investidores, eles preferem optar por um método de negociação mais conservador e o mercado é mais propenso a tendências.
  3. A formação de preços é determinada por transações, e mesmo que as transações sejam impulsionadas por humanos, a natureza humana é difícil de mudar, o que leva à reaparição de formas fixas.

Outra característica do seguimento de tendências é que os traders perdem pouco quando não há mercado e ganham muito quando o mercado vem, mas todos os que fazem negociações sabem que o mercado é a maior parte do tempo por causa de mercados turbulentos e apenas em um pequeno período de tempo é o mercado de tendências.

Como as estratégias de rastreamento de tendências são instáveis em relação aos ganhos, muitas instituições de investimento construem um portfólio com uma variedade de estratégias, com uma certa quantidade de estratégias de reversão no meio. A estratégia de reversão é a relação entre a existência de coefficientes negativos da sequência de tempo dos preços, ou seja, a alta e baixa absorção.

A CTA e os ativos tradicionais img

Se olharmos para o gráfico acima, as estratégias teoricamente de vários estilos diferentes ou de baixa correlação, serão feitas simultaneamente em face de várias variações de preços do mercado, mas diferentes sinais de negociação ao mesmo tempo. Como várias curvas de ganhos se sobrepõem, tornando o ganho geral complementar, a curva de ganho torna-se mais suave, reduzindo assim a volatilidade dos ganhos.

A partir do ponto de vista acima, pode-se concluir que, ao invés de desenvolver uma estratégia de nível mestre, é melhor desenvolver várias estratégias de parentesco, então como controlar essas estratégias? Aqui, podemos usar o algoritmo de floresta aleatória no aprendizado de máquina, que a floresta aleatória não é um algoritmo independente, é um quadro de decisão que contém várias árvores de decisão.

Em seguida, é necessário projetar uma estratégia-mãe que possa avaliar a liquidez, rentabilidade e estabilidade de todas as variedades no mercado de futuros de commodities, selecionar uma combinação de variedades de futuros de commodities com baixa volatilidade de rendimento, fazer uma seleção neutra para o setor, reduzir ainda mais a volatilidade geral por meio da dispersão do setor do portfólio e, finalmente, negociar uma combinação de várias variedades de futuros de commodities para construir uma combinação real de commodities com correspondência de valor de mercado.

Cada variedade também pode ser configurada com vários parâmetros de estratégia, com a escolha de combinações de parâmetros próximos de retrospectiva que funcionam bem. Quando a tendência do mercado é evidente, os parâmetros de estratégia de vários grupos geralmente se comportam de forma consistente, o que equivale a um acréscimo; quando o mercado está em um mercado turbulento, os parâmetros de estratégia de vários grupos geralmente se comportam de forma inconsistente, o que significa que cada um faz mais ou nada para hedge de risco, o que equivale a uma redução de posições. Isso pode reduzir ainda mais a maior retrospectiva do portfólio, mantendo o rendimento geral inalterado.

2o Caso clássico de estratégia de CTA de futuros

Newton disse uma vez: "Se eu posso ver mais longe do que os outros, é porque estou sobre os ombros de um gigante".

As estratégias de CTA publicadas no mercado são estratégias uniformes, estratégias de faixa de brinquedos, estratégias de traders de praia, estratégias de dinâmica, estratégias de arbitragem, etc. As estratégias de negociação quantitativa têm uma característica, que é a morte e a morte de uma estratégia, que, uma vez divulgada, falha lentamente.

2.1 Análise básica de futuros (inventário, diferença de base, preço)

A análise fundamental não precisa se preocupar com movimentos de preços de curto prazo, acreditando que o valor será finalmente refletido no preço, mas sim com a análise dos fatores que influenciam o preço e determinam o valor da variedade. Geralmente, o método de análise de cima para baixo é usado: a partir de fatores macroscópicos, fatores de variedade e outros fatores.

img

Se olharmos para o gráfico acima, vemos que há muitos fatores que influenciam os preços dos produtos, dezenas de itens no total e dezenas de itens em detalhes, e esses dados estão mudando constantemente.

Na verdade, a análise básica de futuros de mercadorias não analisa todos os fatores, precisamos apenas pegar os elementos centrais da análise básica para encontrar a regularidade a partir de informações complicadas e complicadas.

Fatores macroscópicosOs dados macroeconômicos são complexos e variáveis, todos os dias, a cada momento, há muitos dados econômicos publicados, políticos, bancos centrais, bancos, oficiais e não oficiais. Além das crises políticas e econômicas, a análise macroeconômica é um bom material para conversas e não é muito prática. O famoso especialista em gerenciamento de fundos americano Peter Lynch disse: "Eu não gasto mais de quinze minutos por ano analisando as grandes tendências econômicas".

Fator de variedadeNa análise básica, a análise de variedades é principalmente a análise do aumento da taxa de crescimento, as relações de oferta e demanda, os estoques de mercadorias, os lucros industriais, etc. Pode-se dizer que dominar a análise de fatores de variedades de futuros de mercadorias é basicamente capaz de determinar a maior parte do movimento do mercado.

Os amigos que fazem futuros sabem que os futuros de mercadorias domésticos podem ser simplesmente divididos em: produtos industriais e produtos agrícolas. O método de análise dos produtos industriais e agrícolas é diferente, e explicamos a partir de ambos os aspectos da oferta e da demanda. Nos produtos industriais, a oferta é relativamente estável, a menos que haja um grande avanço tecnológico.

Assim, de acordo com as leis da economia, o preço final dos produtos é determinado pela relação de oferta e demanda, e, em teoria, o preço futuro dos produtos pode ser determinado desde que sejam obtidos dados da oferta e da demanda. Para produtos industriais, os dados da oferta são mais fáceis de obter, mas os dados da demanda são mais difíceis de obter.

Na verdade, podemos fazer ainda mais reduções, a oferta e a demanda no mercado econômico são o resultado mútuo do estoque, podemos julgar a relação entre a oferta e a demanda no mercado através dos dados de estoque. Se um estoque de um produto é alto, significa que a força da oferta do mercado é maior do que a demanda, e se as condições externas não mudam, o preço do produto está prestes a cair.

Além de analisar o estoque de mercadorias, também é necessário analisar o diferencial de preços entre o mercado de futuros e o mercado de futuros, ou seja, o chamado diferencial. Se o preço do futuro for maior do que o preço do presente, chamamos-lhe um aumento do preço do futuro; se o preço do futuro for menor do que o preço do presente, chamamos-lhe um afundamento do futuro. De acordo com o sistema de entrega de futuros, no dia da entrega do futuro, o preço do futuro deve ser igual ao preço do presente.

img

Seja elevado ou rebaixado, devido às restrições do sistema de entrega de futuros, o preço dos futuros da data de entrega deve, em teoria, ser igual ao preço do mercado atual. À medida que a data de entrega se aproxima, o preço do mercado atual e o preço do futuro tendem a coincidir, um é o retorno do futuro ao mercado atual e outro é o retorno do mercado atual ao mercado atual.

De acordo com o princípio acima, podemos determinar o preço futuro dos futuros com base no estoque e no diferencial. Se o estoque de um produto for menor e se o preço do futuro for muito menor do que o preço atual, então podemos determinar: a força da demanda do mercado atual é maior do que a força da oferta, e o preço atual é mais provável de subir no futuro; também, devido ao sistema de entrega de futuros, o preço do futuro será compensado com a proximidade da data de entrega, mantendo-se estável com o preço atual, e o preço do futuro do futuro é mais provável de subir.

Por fim, nós determinamos a direção de grande probabilidade dos preços futuros por meio de estoques e margens, mas não há pontos de venda mais precisos, e, portanto, também é necessário acompanhar a análise técnica para dar sinais claros de entrada e saída. A estrutura da análise básica é: baixo estoque + profundidade de aquecimento + análise técnica de múltiplos sinais de cabeça = fazer mais; alto estoque + aumento significativo de água + análise técnica de sinais de cabeça para baixo = fazer nada.

2.2 Leis de comércio de praias

Falando em estratégias de negociação, temos que falar da prática de negociação de praias representativa. A prática de negociação de praias vem de um dos experimentos mais famosos da história da negociação, quando o especulador de commodities Richard Dennis tentou descobrir se os grandes traders eram nascidos ou cultivados. Para isso, em 1983, ele recrutou 13 pessoas para ensiná-las os conceitos básicos de negociação de futuros, bem como seus próprios métodos e princípios de negociação. Esses praticantes foram chamados de praias de praias.

Durante os quatro anos seguintes, as mariscas obtiveram um retorno anual médio de 80% de lucro. Dennis também demonstrou que, com um conjunto simples de sistemas e regras, pessoas com pouca ou nenhuma experiência de negociação podem se tornar excelentes traders. Mas há mariscas individuais que vendem regras de negociação de mariscas em sites lucrativos. Para impedir esse comportamento, dois mariscos originais, Curtis Feith e Arthur Madock, decidiram disponibilizar regras de negociação de mariscas gratuitamente para o público no site.

Após a revelação da verdade, descobriu-se que as regras de negociação de praias adotaram canais de Dongjian otimizados e usaram o indicador ATR para gerenciar posições. Após décadas de testes históricos, tornou-se um método de negociação que pode ser facilmente lucrativo para o varejista comum e ainda é válido em algumas variedades.

Princípios fundamentais da praia

  • Ter vantagens: encontrar uma estratégia de negociação que seja positiva, pois pode gerar retornos positivos no longo prazo.
  • Gerenciamento de Riscos: Controle os riscos, mantenha a posição, ou você pode não esperar o dia em que você produz resultados.
  • Perseverança: somente se você perseverar e executar sua estratégia, você obterá resultados reais do sistema.
  • É simples e claro: sistemas simples são mais vitais do que sistemas complexos no longo prazo.

A seguir, vamos ver o que as leis de troca de praias dizem. 1, Mercado - o que comprar e vender, essencialmente em quais mercados são negociados, os mercenários são negociadores de futuros, e eles escolhem apenas os mercados com alto volume de negociação e alta liquidez, porque a escolha de mercados inativos aumenta os preços de entrada e saída e também perde muitas oportunidades de tendência. 2o, o tamanho do posicionamento - quanto comprar e vender é uma parte muito importante da estratégia, que muitas vezes é ignorada ou mal tratada. A regra de troca de praias usa o ATR, ou indicador de amplitude de flutuação real média, para calcular posições abertas, sinais de aumento de posições e sinais de stop loss. Este é um design muito habilidoso, com a intenção de ajustar o tamanho do posicionamento através da amplitude de flutuação absoluta do mercado, reduzindo a posse quando a volatilidade do mercado é forte e aumentando a posse quando a volatilidade do mercado é fraca. 3, Entrar no mercado - A entrada da maré baixa é inspirada no canal Dongjian, quando o preço sobe acima do preço mais alto da linha K de 20 ou 55, quando o preço cai abaixo do preço mais baixo da linha K de 20 ou 55, entra em branco. Quando o sinal aparece, entra no mercado, não importa se fecha ou desce a linha K. 4, Stop Loss - A negociação sem stop loss não é bem-sucedida no longo prazo, mas a maioria dos traders mantém posições perdedoras, tentando despertar a esperança de que o mercado inverta. A pirâmide estabelece rigorosamente quando sair de posições perdedoras, se houver vários pedidos e o preço cair 2 unidades, a maioria prejudica o equilíbrio. Se houver pedidos vazios e o preço subir 2 unidades, o vazio para o equilíbrio. 5 - Parar de cair - Parar de cair significa perder muito flutuar, que também é uma parte difícil de aceitar para muitos comerciantes. Se houver um monte de pedidos atuais e o preço cair abaixo do trajeto do canal de Dongguan no dia 10, parar todos os pedidos extras; se houver um monte de pedidos em branco e o preço subir acima do trajeto do canal de Dongguan no dia 10, parar todos os pedidos em branco.

A partir daí, podemos ver que a lei de negociação de praia, embora pareça simples, na verdade já formou uma deformação do sistema de negociação no sentido literal, que abrange todos os aspectos de um sistema de negociação completo, sem deixar espaço para os traders tomarem decisões subjetivas e imaginárias, o que permite que as vantagens de operar o sistema de forma programada sejam realizadas. Incluindo: regras de entrada e saída, gestão de fundos e controle de vento, etc.

O maior benefício do método de negociação de praia é que ele nos ajuda a criar um método de negociação eficaz, que combina a estratégia de construção de lotes, a estratégia de stop loss dinâmico e a estratégia de acompanhamento de tendências do mercado, especialmente o uso do valor ATR e a estratégia de gestão de posições. É claro que também tem um problema comum com a estratégia de acompanhamento de tendências, que é o flutuação.

3o, estratégia de CTA para desenvolvimento de futuros em tempo real

3.1 Desenvolvimento de estratégias de tendências de CTA baseadas em Maio

No final do século passado, um método de negociação muito mágico começou a se tornar popular no setor de investimentos financeiros nos EUA, e depois de milhares de pessoas terem praticado o método, descobriu-se que ele é eficaz e tem um grande valor prático, e foi reconhecido por muitos especialistas em investimentos e comerciantes profissionais, que até agora podem ser perfeitamente aplicados a quase todos os setores de investimentos financeiros, seja forex, ouro, ações, futuros, petróleo bruto, índices e títulos.

O termo caos refere-se à descrição do estado de caos do universo, cuja idéia é: o resultado é inevitável, mas como o conhecimento existente não pode calcular o resultado, porque o cálculo em si também está mudando o resultado, o maior ou menor resultado pode eventualmente ocorrer, mas não o resultado inevitável. Isto é muito semelhante ao mercado de negociação, onde os participantes também alteram o mercado ao analisar o mercado e comprar e vender transações. O mercado tem variabilidade perpétua, quando os participantes aprendem sobre novas formas do mercado, o mercado também aprende que acontece o que é conhecido pelos participantes, então é uma variação. E ele certamente tende a variar em direções desconhecidas para os participantes, e ele tem inteligência suficiente para impedir que os participantes capturem as leis de sua mudança, ou seja, o mercado não é estável, a percepção do mercado não pode representar o futuro.

A teoria do caos é uma ideia relativamente nova, e por isso poucos estudos nacionais sobre a teoria do caos também são desenvolvidos. Considerando que a teoria do caos é uma estratégia de negociação muito universal, que deve ser usada em quase todos os campos de investimento financeiro, incluindo ações, títulos, divisas, câmbio e mercadorias digitais, a versão simplificada deste curso sobre o caos é usada como estratégia para aumentar o interesse e o rendimento dos investidores.

Como o nome sugere, a base teórica para a operação do caos é a teoria do caos, proposta pelo meteorologista Edward Lorenz e considerada uma das maiores descobertas científicas do final do século XX. Foi ele quem criou o famoso efeito borboleta. Bill Williams criativamente aplicou a teoria do caos ao investimento financeiro, combinando disciplinas como geometria de frações e dinâmica não linear, criando uma série de indicadores de análise técnica muito eficazes.

O conjunto de métodos de operação do caos é composto por cinco grandes dimensões (indicadores técnicos):

  • Linha de tubarão (Alligator)

  • O Fractal

  • O Momentum

  • Aceleração

  • A linha de equilíbrio

    img

Como vemos no gráfico acima, a linha de equilíbrio é um conjunto de linhas de equilíbrio que aplicam geometria de divisão e dinâmica não-linear, que é essencialmente uma média móvel ponderada por índice de expansão, pertencente a uma linha uniforme, mas com um método de cálculo um pouco mais complexo do que a linha uniforme.

// 参数
N1:=11;
N2:=21;

// 定义价格中线
N3:=N1+N2;
N4:=N2+N3;
HL:=(H+L)/2;

// 鳄鱼线
Y^^SMA(REF(HL,N3),N4,1);
R:=SMA(REF(HL,N2),N3,1);
G:=SMA(REF(HL,N1),N2,1);

Primeiro, definimos os dois parâmetros externos N1 e N2, e depois, com base nos parâmetros externos, calculamos a média HL do preço mais alto e do preço mais baixo, e depois, com parâmetros diferentes, calculamos a média HL, respectivamente. Para o beijo, o pequeno ciclo da linha do meio é a média novamente, o dente é o ciclo médio da linha do meio é a média novamente, o tornozelo é o ciclo grande da linha do meio é a média novamente. Nesta estratégia, usamos o tornozelo.

O conceito de uma divisão é definido de forma muito visual no método do caos. Podemos fazer uma analogia: abrindo a palma da mão, os dedos para cima, o dedo médio é a divisão superior, o dedo mindinho e o dedão sem nome à esquerda, o dedo indicador e o dedo grosso à direita representam respectivamente a linha K não inovadora e alta. Uma divisão básica é composta por essas 5 linhas K. Assim, a divisão pode ser definida usando o código abaixo:

// 分形
TOP_N:=BARSLAST(REF(H,2)=HHV(H,5))+2;
BOTTOM_N:=BARSLAST(REF(L,2)=LLV(L,5))+2;

TOP:=REF(H,TOP_N);
BOTTOM:=REF(L,BOTTOM_N);

MAX_YRG^^MAX(MAX(Y,R),G); 
MIN_YRG^^MIN(MIN(Y,R),G); 

TOP_FRACTAL^^VALUEWHEN(H>=MAX_YRG,TOP);
BOTTOM_FRACTAL^^VALUEWHEN(L<=MIN_YRG,BOTTOM);

Calculando a linha do tubarão e a divisão, podemos escrever uma estratégia simples de operação do caos com base nessas duas condições, com um conjunto de índices ponderados pela média móvel como o preço de referência para calcular a linha do tubarão e o indicador de divisão. Claro que a estratégia do operador do caos original seria mais complexa.

// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓
BKVOL=0 AND C>=TOP_FRACTAL AND TOP_FRACTAL>MAX_YRG,BPK(1);
// 如果当前无空单,并且收盘价跌破下分形,并且下分形在鳄鱼线下方时,空头开仓
SKVOL=0 AND C<=BOTTOM_FRACTAL AND BOTTOM_FRACTAL<MIN_YRG,SPK(1);

// 如果收盘价跌破鳄鱼的下巴时,多头平仓
C<Y,SP(BKVOL);
// 如果收盘价升破鳄鱼的下巴时,空头平仓
C>Y,BP(SKVOL);

Para facilitar a compreensão, eu escrevi um comentário detalhado diretamente no código, e podemos resumir a lógica de negociação da estratégia em alguns pontos:

  • Multiple Opening: Se não houver muitos pedidos no momento e o preço de fechamento for acima da linha do peixe.
  • Emprego vazio: se não houver um pedido vazio, e o preço de fechamento cair abaixo da divisão, e a divisão inferior estiver abaixo da linha do tubarão.
  • A maioria das posições está paralisada: se o preço de fechamento cair, a mandíbula do tubarão será quebrada.
  • Empréstimo em branco: se o preço de fechamento subir, o peixe vai ficar com a mandíbula quebrada.

Em seguida, vamos ver o que acontece com o resultado do retrospecto estratégico desse simples método de operação caótico. Para aproximar o retrospecto do ambiente real, aqui a taxa de operação é definida como o dobro do mercado, com a abertura e a abertura mais 2 saltos por slider. A variedade de dados retrospectiva é o índice de aço enrolado, a variedade de negociação é o índice de aço enrolado contínuo, com a abertura fixa de uma mão.

img img img

A partir da curva de capital e dos dados de desempenho da retrospectiva, a estratégia tem um bom desempenho e a curva de capital geral é de forma estável para cima. No entanto, a partir do final de 2016, as características do mercado de aço galvanizado mudaram, passando de um movimento unilateral de alta volatilidade para um movimento turbulento amplo. A partir da curva de capital, os lucros de 2017 até agora são claramente fracos.

Em suma, a essência da estratégia do caos é encontrar um ponto de inflexão, sem se preocupar com como o mercado vai, sem se preocupar com o verdadeiro e falso avanço, entrando diretamente no mercado se o avanço for fragmentado.

3.2 Desenvolvimento de estratégias de CTA baseadas em JavaScript

Soros, em seu livro de 1987, The Alchemist's Algorithm of Currency, propôs uma importante proposição: Eu acredito que os preços dos mercados estão sempre errados no sentido de que eles têm um preconceito sobre o futuro. Ele acredita que os pressupostos de eficácia do mercado são apenas pressupostos teóricos, que na verdade os participantes do mercado nem sempre são racionais e que, em cada ponto de tempo, os participantes não podem obter e interpretar objetivamente todas as informações, e que, mesmo que sejam as mesmas informações, todos recebem o mesmo feedback. Ou seja, os preços em si mesmos já contêm as expectativas erradas dos participantes do mercado e, portanto, os preços do mercado são sempre errados. Talvez essa seja a fonte dos lucros dos profissionais.

De acordo com o princípio acima, também sabemos que, em um mercado de futuros ineficaz, os contratos de curto prazo não são sempre sincronizados e seus preços não são totalmente eficazes. Então, com base nos preços dos contratos de curto prazo de diferentes períodos do mesmo indicador de negociação, se os dois preços tiverem uma diferença maior, pode-se comprar e vender contratos de curto prazo de diferentes períodos simultaneamente e fazer um diferencial de curto prazo.

Assim como os futuros de commodities, as moedas digitais também possuem uma combinação de contratos de arbitragem de longo prazo associados; como no OkEX: ETC na semana, ETC na próxima semana, ETC trimestral. Por exemplo, suponha que a diferença entre o preço do ETC naquela semana e o preço do ETC no trimestre permaneça em torno de 5 no longo prazo. Se um diferencial de preço chegar a 7 em um determinado dia, esperamos que o diferencial volte a 5 em algum momento no futuro.

Apesar da existência desse diferencial, o uso de manipulações artificiais é demorado, precário e o impacto das variações de preços, o que geralmente causa muita incerteza. É por isso que o esquema de quantificação de lucros é atraente.

Este curso irá ensinar como, em negociação de moeda digital, usar a plataforma de negociação quantitativa do inventor e os contratos de futuros ETC na bolsa OkEX para demonstrar uma estratégia de arbitragem simples, capturando os lucros visíveis de cada oportunidade de arbitragem instantânea, além de hedgear os riscos possíveis.

Criar uma estratégia de arbitragem de curto prazo de moeda digitalDificuldade: nível médioAmbiente estratégico

  • A marca é do ETH Classic (ETC).
  • Dados de diferença de preços: ETC semana - ETC trimestre (excluindo a verificação de integração)
  • Ciclo de negociação: 5 minutos
  • 头寸匹配:1:1
  • Tipo de transação: cruzamento da mesma variedade

Lógica estratégica

  • Termos de negociação: se a conta corrente não tiver ativos e o preço for inferior ao boll abaixo do trajeto, a negociação é realizada; ou seja, comprar ETC durante a semana e vender ETC durante o trimestre.
  • Se a conta atual não tiver ações e o preço for maior do que o boll, faça a diferença de preço; isto é, venda ETC na semana e compra ETC no trimestre.
  • Termos de equilíbrio de diferença de preço: se a conta corrente tiver mais ETC na semana e tiver mais ETC no trimestre, e o diferencial de preço for maior do que o boll, a diferença de preço é igual; ou seja, vender ETC na semana e comprar ETC no trimestre.
  • Condição de equilíbrio de diferença de preço: se a conta corrente tiver ETC livre durante a semana e tiver vários pedidos de ETC trimestrais, e o preço for inferior ao boll no meio do caminho, o preço será equilíbrio; ou seja, comprar ETC livre durante a semana e vender ETC livre durante o trimestre.

O que está acima é uma simples descrição lógica de uma estratégia de arbitragem de curto prazo de moeda digital, então como realizar suas ideias no programa?

function Data() {}  // 基础数据函数
Data.prototype.mp = function () {}  // 持仓函数
Data.prototype.boll = function () {}  // 指标函数
Data.prototype.trade = function () {}  // 下单函数
Data.prototype.cancelOrders = function () {}  // 撤单函数
Data.prototype.isEven = function () {}  // 处理单只合约函数
Data.prototype.drawingChart = function () {}  // 画图函数

function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB);  // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks;  // 账户余额
    var boll = data.boll(dataLength, timeCycle);  // 计算boll技术指标
    data.trade();  // 计算交易条件下单
    data.cancelOrders();  // 撤单
    data.drawingChart(boll);  // 画图
    data.isEven();  // 处理持有单个合约
}

//入口函数
function main() {
    while (true) {  // 进入轮询模式
        onTick();  // 执行onTick函数
        Sleep(500);  // 休眠0.5秒
    }
}

Imagine o que é o processo de negociação em uma transação dominante? No sistema de negociação não há diferença essencial, exceto: obtenção de dados, cálculo de dados, transação de encomenda, processamento após encomenda. Então também no programa, primeiro o programa executa a função principal da linha 20, uma regra convencional, quando o programa executa a estratégia de transação, o processamento antecipado (se houver) entra em um modo de ciclo infinito, ou modo de consulta, no modo de consulta, a execução repetitiva da função onTick.

Então, na função onTick, é o processo de negociação que temos em negociações subjetivas: primeiro, obtemos dados de preço básicos, depois obtemos o saldo da conta, depois calculamos os indicadores, depois começamos a calcular as condições da transação e colocamos os pedidos, e finalmente o processamento após o pedido, incluindo: retirada de pedidos, desenho, processamento de contratos individuais.

Comparando ideias estratégicas e processos de negociação, é muito fácil construir um quadro estratégico.

  • O preprocessamento da transação.
  • A partir daí, a empresa começou a produzir e comercializar o produto.
  • O pedido é submetido e processado posteriormente.

Após a construção do quadro de estratégia de negociação, é necessário preencher o código de detalhes necessários no quadro de estratégia de acordo com o processo de negociação real e os detalhes da transação.

Primeira, o processamento prévio da transação.

1. Declaração das variáveis globais necessárias

  • Declare um objeto de gráfico de configuraçãovar chart = {}
  • Chama a função Chart, inicializa gráficosvar ObjChart = Chart ( chart )
  • Declare um conjunto de matérias vazias para armazenar séries de diferença de preçovar bars = []
  • Declare uma variável de cronograma de registro de dados históricosvar oldTime = 0

2. Parâmetros externos para a configuração da política

var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量

3. Definir funções de processamento de dados

  • Função básica de dados: Data () Crie uma função Data e defina suas propriedades internas. Incluindo: dados de conta, dados de armazenamento, data de linha K, tempo de tempo, preço de compra/venda de um contrato A/B de arbitragem, diferença de preço positivo/contrário.
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
    this.accountData = _C(exchange.GetAccount); // 获取账户信息
    this.positionData = _C(exchange.GetPosition); // 获取持仓信息
    var recordsData = _C(exchange.GetRecords); //获取K线数据
    exchange.SetContractType(tradeTypeA); // 订阅套利A合约
    var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
    exchange.SetContractType(tradeTypeB); // 订阅套利B合约
    var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
    this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
    this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
    this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
    this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
    this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
    // 正套价差(合约A卖一价 - 合约B买一价)
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // 反套价差(合约A买一价 - 合约B卖一价)
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
  • Obter a função de armazenamento: mp () Atravessa toda a matriz de posições, devolvendo o número de posições de um determinado contrato, de uma determinada direção, se não houver, devolvendo false
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // 获取持仓信息
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}
  • Linha K e função de indicador:boll () Com base nos dados de diferença de preço positivo/contrario, é sintetizada uma nova seqüência de K-linhas; e retornam os dados de tração ascendente, média e descendente calculados pelo indicador Boll.
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // 临时对象
    // 正套价差和反套价差中间值
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // 对比两个深度数据时间戳
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // 根据指定时间周期,在K线数组里面传入价差数据对象
    if (bars.length > num * 2) {
        bars.shift(); // 控制K线数组长度
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
    return {
        up: boll[0][boll[0].length - 1], // boll指标上轨
        middle: boll[1][boll[1].length - 1], // boll指标中轨
        down: boll[2][boll[2].length - 1] // boll指标下轨
    } // 返回一个处理好的boll指标数据
}
  • A função de subdivisão:trade () Introdução do nome e tipo do contrato do submundo, e depois do submundo de par e retorna o resultado do submundo. Como é necessário que dois submundo de direções diferentes sejam submundo simultaneamente, a conversão de um preço de compra/venda é feita dentro da função com base no nome do contrato do submundo.
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // 下单前先重新订阅合约
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // 如果是A合约下单
        askPrice = this.askA; // 设置askPrice
        bidPrice = this.bidA; // 设置bidPrice
    } else if (tradeType == tradeTypeB) { // 如果是B合约下单
        askPrice = this.askB; // 设置askPrice
        bidPrice = this.bidB; // 设置bidPrice
    }
    switch (type) { // 匹配下单模式
        case "buy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}
  • Função de cancelamento de pedidos:cancelOrders ()) Retira todas as matriz de pedidos pendentes e cancela individualmente. E retorna false se houver pedidos pendentes e retorna true se não houver pedidos pendentes.
Data.prototype.cancelOrders = function () {
    Sleep(500); // 撤单前先延时,因为有些交易所你懂的
    var orders = _C(exchange.GetOrders); // 获取未成交订单数组
    if (orders.length > 0) { // 如果有未成交的订单
        for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
            exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
            Sleep(500); //延时0.5秒
        }
        return false; // 如果取消了未成交的单子就返回false
    }
    return true; //如果没有未成交的订单就返回true
}
  • Processamento de contratos individuais: isEven ()) No tratamento de negociações de equilíbrio, ocorre uma situação de uma perna única, onde todos os postos são tratados diretamente com uma simples liquidação. Claro, também pode ser alterado para o método de acompanhamento.
Data.prototype.isEven = function () {
    var positionData = this.positionData; // 获取持仓信息
    var type = null; // 转换持仓方向
    // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
            if (positionData[i].Type == 0) { // 如果是多单
                type = 10; // 设置下单参数
            } else if (positionData[i].Type == 1) { // 如果是空单
                type = -10; // 设置下单参数
            }
            // 平掉所有仓位
            this.trade(positionData[i].ContractType, type, positionData[i].Amount);
        }
    }
}
  • Função de gráfico:drawingChart ()) Invoque o método ObjChart.add () para traçar os dados necessários de mercado e indicadores no gráfico: ascendente, intermediário, descendente, positivo/contrário.
Data.prototype.drawingChart = function (boll) {
    var nowTime = new Date().getTime();
    ObjChart.add([0, [nowTime, boll.up]]);
    ObjChart.add([1, [nowTime, boll.middle]]);
    ObjChart.add([2, [nowTime, boll.down]]);
    ObjChart.add([3, [nowTime, this.basb]]);
    ObjChart.add([4, [nowTime, this.sabb]]);
    ObjChart.update(chart);
}

4. Executa códigos de pré-tratamento de transações dentro da função de entrada main (), que são executados apenas uma vez após o início do programa; incluindo:

  • O filtro do console não é muito importante.SetErrorFilter ( )
  • Configurar a moeda digital para negociarexchange.IO ( )
  • Gráficos desenhados antes do programa começarObjChart.reset ( )
  • Informações do status bar antes do programa ser iniciadoLogProfitReset ( )

Depois de definir o pré-tratamento acima, é necessário entrar no próximo passo, entrar no modo de consulta, executar repetidamente a função onTick (), e definir o tempo de repouso durante a consulta Sleep (), pois a API de algumas trocas de moeda digital tem um limite de acesso em um determinado período de tempo.

function main() {
    // 过滤控制台中不是很重要的信息
    SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
    exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
    ObjChart.reset(); //程序启动前清空之前绘制的图表
    LogProfitReset(); //程序启动前清空之前的状态栏信息
    while (true) { // 进入轮询模式
        onTick(); // 执行onTick函数
        Sleep(500); // 休眠0.5秒
    }
}

2o, obter e calcular dados.

  1. Obtenção de dados básicos de objetos, balanços de contas, dados de indicadores de bol para uso lógico de negociação.
function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
    var accountStocks = data.accountData.Stocks; // 账户余额
    var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
    if (!boll) return; // 如果没有boll数据就返回
}

Três, submissão e tratamento posterior

  1. De acordo com a lógica estratégica acima, a operação de compra e venda é executada. Primeiro, é julgado se as condições do preço e do indicador são satisfatórias, depois é julgado se as condições do posicionamento são satisfatórias e, finalmente, é executada a função trade ().
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
    if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
        data.trade(tradeTypeA, "closebuy"); // 合约A平多
    }
    if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
        data.trade(tradeTypeB, "closesell"); // 合约B平空
    }
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
    if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
        data.trade(tradeTypeA, "closesell"); // 合约A平空
    }
    if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
        data.trade(tradeTypeB, "closebuy"); // 合约B平多
    }
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
    if (data.basb < boll.down) { // 如果basb价差低于下轨
        if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
            data.trade(tradeTypeA, "buy"); // 合约A开多
        }
        if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
            data.trade(tradeTypeB, "sell"); // 合约B开空
        }
    } else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
        if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
            data.trade(tradeTypeA, "sell"); // 合约A开空
        }
        if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
            data.trade(tradeTypeB, "buy"); // 合约B开多
        }
    }
}
  1. Após a conclusão da encomenda, é necessário lidar com anomalias como encomendas pendentes, ter um contrato individual e desenhar gráficos.
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约

Com mais de 200 linhas, criamos uma estratégia simples e completa de CFDs de moeda digital.

// 全局变量
// 声明一个配置图表的 chart 对象
var chart = {
    __isStock: true,
    tooltip: {
        xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
    },
    title: {
        text: '交易盈亏曲线图(详细)'
    },
    rangeSelector: {
        buttons: [{
            type: 'hour',
            count: 1,
            text: '1h'
        }, {
            type: 'hour',
            count: 2,
            text: '3h'
        }, {
            type: 'hour',
            count: 8,
            text: '8h'
        }, {
            type: 'all',
            text: 'All'
        }],
        selected: 0,
        inputEnabled: false
    },
    xAxis: {
        type: 'datetime'
    },
    yAxis: {
        title: {
            text: '价差'
        },
        opposite: false,
    },
    series: [{
        name: "上轨",
        id: "线1,up",
        data: []
    }, {
        name: "中轨",
        id: "线2,middle",
        data: []
    }, {
        name: "下轨",
        id: "线3,down",
        data: []
    }, {
        name: "basb",
        id: "线4,basb",
        data: []
    }, {
        name: "sabb",
        id: "线5,sabb",
        data: []
    }]
};
var ObjChart = Chart(chart); // 画图对象
var bars = []; // 存储价差序列
var oldTime = 0; // 记录历史数据时间戳

// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量

// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
    this.accountData = _C(exchange.GetAccount); // 获取账户信息
    this.positionData = _C(exchange.GetPosition); // 获取持仓信息
    var recordsData = _C(exchange.GetRecords); //获取K线数据
    exchange.SetContractType(tradeTypeA); // 订阅套利A合约
    var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
    exchange.SetContractType(tradeTypeB); // 订阅套利B合约
    var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
    this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
    this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
    this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
    this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
    this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
    // 正套价差(合约A卖一价 - 合约B买一价)
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // 反套价差(合约A买一价 - 合约B卖一价)
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}

// 获取持仓
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // 获取持仓信息
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}

// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // 临时对象
    // 正套价差和反套价差中间值
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // 对比两个深度数据时间戳
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // 根据指定时间周期,在K线数组里面传入价差数据对象
    if (bars.length > num * 2) {
        bars.shift(); // 控制K线数组长度
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
    return {
        up: boll[0][boll[0].length - 1], // boll指标上轨
        middle: boll[1][boll[1].length - 1], // boll指标中轨
        down: boll[2][boll[2].length - 1] // boll指标下轨
    } // 返回一个处理好的boll指标数据
}

// 下单
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // 下单前先重新订阅合约
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // 如果是A合约下单
        askPrice = this.askA; // 设置askPrice
        bidPrice = this.bidA; // 设置bidPrice
    } else if (tradeType == tradeTypeB) { // 如果是B合约下单
        askPrice = this.askB; // 设置askPrice
        bidPrice = this.bidB; // 设置bidPrice
    }
    switch (type) { // 匹配下单模式
        case "buy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // 设置下单模式
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}

// 取消订单
Data.prototype.cancelOrders = function () {
    Sleep(500); // 撤单前先延时,因为有些交易所你懂的
    var orders = _C(exchange.GetOrders); // 获取未成交订单数组
    if (orders.length > 0) { // 如果有未成交的订单
        for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
            exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
            Sleep(500); //延时0.5秒
        }
        return false; // 如果取消了未成交的单子就返回false
    }
    return true; //如果没有未成交的订单就返回true
}

// 处理持有单个合约
Data.prototype.isEven = function () {
    var positionData = this.positionData; // 获取持仓信息
    var type = null; // 转换持仓方向
    // 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // 遍历持仓数

Relacionados

Mais.

Dianwan99Aprender a aprender

Papá!Aprender

Xunfeng91Aprender