Análise da estratégia do canal de Donchian no ambiente de investigação

Autora:Lydia., Criado: 2022-12-26 09:19:00, Atualizado: 2023-09-20 10:43:17

img

Análise da estratégia do canal de Donchian no ambiente de investigação

Introdução da estratégia

Entre muitas estratégias de negociação, a estratégia do Canal de Donchian deve ser uma das estratégias de avanço mais clássicas. Foi famosa já em 1970. Naquela época, uma empresa estrangeira realizou testes de simulação e pesquisa sobre as estratégias de negociação do programa mainstream. Os resultados mostraram que a estratégia do Canal de Donchian foi a mais bem sucedida de todos os testes de estratégia.

Mais tarde, o mais famoso treinamento de comerciantes de tartarugas na história do comércio ocorreu nos Estados Unidos, que foi um grande sucesso. Naquela época, os métodos de negociação das tartarugas eram confidenciais, mas depois de mais de dez anos, as Regras de Negociação das Tartarugas foram publicadas para o público, as pessoas descobriram que as tartarugas usavam a versão aprimorada da estratégia do Canal Donchian.

A estratégia de negociação de ruptura é adequada para as variedades de negociação com tendência relativamente suave. O método de negociação de ruptura mais comum é usar a relação de posição relativa entre preço, suporte e resistência para julgar o ponto de negociação específico.

Regras de estratégia do Canal de Donchian

O canal de Donchian é um indicador de tendência, e sua aparência e sinal são um pouco semelhantes aos do indicador de banda de Bollinger. No entanto, o canal de preço de Donchian é construído de acordo com o preço mais alto e o preço mais baixo dentro de um determinado período. Por exemplo, o valor máximo do preço mais alto das últimas 50 linhas K é calculado para formar a pista superior; Calcule o valor mínimo do preço mais baixo das últimas 50 linhas K para formar a pista inferior.

img

Como mostrado na figura acima, este indicador é composto por três curvas com cores diferentes. Por padrão, os preços mais altos e mais baixos dentro de 20 períodos são usados para mostrar a volatilidade dos preços do mercado. Quando o canal é estreito, isso significa que a volatilidade do mercado é pequena. Por outro lado, quando o canal é largo, isso significa que a volatilidade do mercado é grande.

Se o preço subir acima da faixa superior, é um sinal de compra; Pelo contrário, se o preço cair abaixo da faixa inferior, é um sinal de venda. Como as faixas superior e inferior são calculadas pelos preços mais altos e mais baixos, geralmente, os preços raramente sobem e caem abaixo das linhas superior e inferior do canal ao mesmo tempo. Na maioria dos casos, o preço se move ao longo das faixas superior ou inferior unilateralmente, ou entre as faixas superior e inferior.

Estratégia lógica

Há muitas maneiras de usar o canal de Donchian, que podem ser usados sozinhos ou combinados com outros indicadores. Nesta lição, usaremos o método mais simples. Ou seja, quando o preço atravessa a faixa superior de baixo para cima, ou seja, acima da linha de pressão, acreditamos que a força de muitas partes está crescendo, uma onda de mercado crescente foi formada e o sinal de posição aberta de compra foi gerado; Quando o preço cai abaixo da faixa inferior de cima para baixo, ou seja, abaixo da linha de suporte, acreditamos que o lado da posição curta está fortalecendo, uma onda de tendência de queda foi formada e o sinal de posição aberta de venda foi gerado.

Se o preço cair de volta para a faixa média do canal de Donchian depois de comprar para abrir uma posição, pensamos que a força multipartidária está enfraquecendo, ou a força da posição curta está fortalecendo, e o sinal de venda e fechamento da posição é gerado; Se o preço subir de volta para a faixa média do canal de Donchian após a abertura da posição de venda, pensamos que o lado da posição curta está enfraquecendo, ou as forças multipartidárias estão fortalecendo, e a posição de fechamento de compra é gerada.

Condições de compra e venda

  • Posição de abertura longa: se não houver posição e o preço de fechamento for superior à linha superior.
  • Posição de abertura curta: se não houver posição e o preço de fechamento for inferior à linha inferior.
  • Posição de fechamento longa: se mantiver uma posição longa e o preço de fechamento for inferior à média.
  • Posição de fechamento curta: se mantiver uma posição curta e o preço de fechamento for superior à linha média.

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

Em seguida, vamos compreender esta estratégia um por um no ambiente de pesquisa da plataforma FMZ Quant:

Insira o ambiente de investigação da plataforma FMZ Quant, conforme indicado a seguir:

img

Estratégia do canal de Donchian na versão Python.ipynb Em [1]:

from fmz import *
task = VCtx('''backtest
start: 2019-08-01 09:00:00
end: 2019-10-10 15:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
''')
# Create a Backtesting Environment
# The example format of the backtest information in red above can be obtained by clicking "Save settings" on the strategy edting page of the FMZ Quant platform.

Em [2]:

# First, we need to get the position information, and we define a mp() function to do this.

def mp():
    positions = exchange.GetPosition() # Get position array
    if len(positions) == 0: # If the length of the position array is 0
        return 0 # Prove a short position, return 0
    for i in range(len(positions)): # Iterate through the positions array
        if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
            return 1 # If there are long position orders, return 1
        elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
            return -1 # If there are short position orders, return -1
        
    print(positions)
    
mp() # Next, we execute this function to get the position information, and we can see that the result is 0, which means that the current position is short.

Fora[2]:0

Em [3]:

# Let's start testing this strategy using the current main rebar contract as an example.

exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888.

Fora[3]: {Tipos de combinação: 0, CreateDate: 0, Mês de entrega: 9, Ano de entrega: 0, Fim de entrega : 0, ExchangeID: SHFE, ExchangeInstID: rb888, Data de expiração : 0, InstLifePhase: 49, ID do instrumento: rb888, Nome do instrumento: rb continuidade, IsTrading: 1, Long MarginRatio: 0,06, MaxLimitOrderVolume: 500, Algoritmo de Margem Máxima: 49, MaxMarketOrderVolume: 30, MinLimitOrderVolume: 1, MinMarketOrderVolume: 1, OpenDate: 0, Tipos de opções: 48, PosiçãoDataTipos: 49, Posição Tipo : 50, PriceTick: 1, Classe de produto: 49, ProductID: rb, Ratio de Margem Curta: 0,06, Data de início da entrega: 0, Preço de greve: 0, InstrID subjacente: rb, Múltiplo subjacente: 1, VolumeMultiple: 10}

Em seguida, obtemos a matriz de linhas K, porque de acordo com a lógica estratégica, precisamos que o mercado funcione por um período de tempo e, em seguida, faça julgamentos lógicos, para que nossa lógica estratégica possa se adaptar melhor ao mercado. Aqui, tomaremos 50 linhas K como o requisito inicial temporariamente. As informações de linhas K da FMZ Quant são armazenadas na forma de uma matriz, que contém o preço mais alto, o preço mais baixo, o preço de abertura, o preço de fechamento, a quantidade de negociação e outras informações. Para o conteúdo desta parte, consulte o documento oficial da API da plataforma FMZ Quant:https://www.fmz.com/api

Em [4]:

# Next we define a variable to store the K-line array.

records = exchange.GetRecords() # Get the K-line array

Em [5]:

# According to the strategy logic description, we use the closing price as the price to open a position, so we need to calculate the closing price of the latest K-line.

close = records[len(records) - 1].Close # Get the latest K-line closing price
close

Fora[5]: 3846,0

Em seguida, precisamos calcular o valor máximo do preço mais alto e o valor mínimo do preço mais baixo nas linhas 50 K usando o preço de fechamento como padrão.

Em [6]:

upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
upper

Fora[6]: Outros produtos

Em [7]:

lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
lower

Fora[7]: 3856,0

Em seguida, precisamos calcular o valor médio das faixas superior e inferior deste canal.

Em [8]:

middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks.
middle

Fora[8]: 3879,5

Acima, concluímos todos os cálculos necessários para esta estratégia. Em seguida, começaremos a julgar as condições de abertura logicamente e realizar a operação de posição de abertura real de acordo com os resultados do julgamento lógico. Deve-se notar aqui que precisamos usar o modelo de futuros de commodities domésticos da plataforma FMZ Quant. Como o ambiente de pesquisa atual não pode suportar esse modelo, vamos escrevê-lo temporariamente, mas a operação relatará um erro, na página de escrita de estratégia da plataforma FMZ Quant para codificação real, importe este modelo sem nenhum problema, o endereço do modelo é:https://www.fmz.com/strategy/24288. Quando você codifica na página de edição de estratégia da plataforma FMZ Quant, você precisa copiar este modelo para sua própria biblioteca de estratégias primeiro, e depois selecione-o ao backtesting.

Em [ ]:

obj = ext.NewPositionManager() # When using the FMZ Quant trading class library, errors will be reported at runtime, which can be ignored. Now it is the research environment,
                               # This problem does not occur during the actual coding process, and the following is the same without further comment.

O próximo passo é determinar a lógica da estratégia e abrir e fechar posições de acordo com a lógica.

Em [ ]:

if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
            obj.CoverAll() # Close all positions
        if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
            obj.CoverAll() # Close all positions
        if positions == 0: # If it's a short position
            if close > upper: # If the closing price rises above the upper track
                obj.OpenLong("rb888", 1) # Buy opening positions
            elif close < lower: # If the closing price falls below the lower track
                obj.OpenShort("rb888", 1) # Sell opening positions

Em [ ]:

# Complete strategy code:
def mp():
    positions = exchange.GetPosition() # Get the position array
    if len(positions) == 0: # If the length of the position array is 0
        return 0 # It proved a short position, return 0
    for i in range(len(positions)): # Iterate through the positions array
        if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
            return 1 # If there are long position orders, return 1
        elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
            return -1 # If there are short position orders, return -1

def main(): # Main function
    exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888
    while True: # Enter the loop
        records = exchange.GetRecords() # Get the K-line array
        if len(records) < 50: continue # If there are less than 50 K-lines, skip the loop
        close = records[len(records) - 1].Close # Get the latest K-line closing price
        positions = mp() # Get position information function
        upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
        lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
        middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks
        obj = ext.NewPositionManager() # Use the Trading Library
        if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
            obj.CoverAll() # Close all positions
        if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
            obj.CoverAll() # Close all positions
        if positions == 0: # If it's a short position
            if close > upper: # If the closing price rises above the upper track
                obj.OpenLong("rb888", 1) # Buy opening positions
            elif close < lower: # If the closing price falls below the lower track
                obj.OpenShort("rb888", 1) # Sell opening positions

Relacionados

Mais.