Estratégia de Crossover de Média Móvel

SMA MA
Data de criação: 2024-06-03 11:25:43 última modificação: 2024-06-03 11:25:43
cópia: 0 Cliques: 643
1
focar em
1617
Seguidores

Estratégia de Crossover de Média Móvel

Visão geral

Este artigo descreve uma estratégia de negociação quantitativa baseada no princípio de cruzamento de médias móveis. A estratégia controla o risco através da comparação da relação entre o preço e a média móvel, julgando a direção do polinômio, ao mesmo tempo em que define o ponto de parada de parada. O código da estratégia é escrito usando o Pine Script e integra a API da plataforma de negociação Dhan, que permite a negociação automatizada dos sinais da estratégia.

Princípio da estratégia

O núcleo da estratégia é a média móvel, baseada em uma média móvel simples do preço de fechamento em um determinado período como base para o julgamento de tendências. Quando o preço atravessa a linha média, o sinal de quebra é gerado e o sinal de quebra é gerado. Ao mesmo tempo, o uso da função extrem filtra o sinal de repetição contínua, melhorando a qualidade do sinal. A estratégia define o preço de parada e perda correspondente de acordo com a direção da posição atual e a relação entre a posição do preço e a linha média, controlando o risco e o lucro de cada transação.

Vantagens estratégicas

O Moving Average Crossover é um método de rastreamento de tendências simples e fáceis de usar, que permite capturar de forma eficaz as tendências de médio e longo prazo do mercado. Através de parâmetros de configuração razoáveis, a estratégia pode obter ganhos estáveis em situações de tendência. A configuração de stop-loss é favorável para controlar o retorno e aumentar a taxa de risco-receita. A lógica do código da estratégia é clara, usa funções modulares, legíveis e extensivas.

Risco estratégico

A média móvel é essencialmente um indicador de atraso, e quando o mercado gira, o sinal pode ser atrasado, resultando em erros no melhor momento de negociação ou produzindo falsos sinais. A configuração inadequada de parâmetros pode afetar o desempenho da estratégia e precisa ser otimizada de acordo com diferentes características e períodos de mercado.

Direção de otimização da estratégia

  1. Pode-se tentar usar várias combinações de linhas médias de diferentes períodos para aumentar a confiabilidade do sinal, como linhas médias duplas, linhas médias cruzadas, etc.
  2. A configuração do stop loss pode ser ainda mais otimizada, como o ajuste dinâmico de indicadores de volatilidade, como o ATR, ou a adoção de estratégias de stop loss de rastreamento.
  3. Pode-se adicionar mais condições de filtragem, como a quebra de preços de resistência de suporte importante, mudanças no volume de transação, etc., para melhorar a qualidade do sinal.
  4. Em aplicações físicas, é necessário fazer estratégias de retrospectiva, validação e gestão de fundos, controlando o risco de transações individuais e a retirada geral.

Resumir

A estratégia de cruzamento de média móvel é uma estratégia de negociação quantitativa simples e prática, que pode lucrar com a tendência através do acompanhamento de tendências e controle de stop-loss. Mas a estratégia em si tem certas limitações, que precisam ser otimizadas e melhoradas de acordo com as características do mercado e as preferências de risco.

Código-fonte da estratégia
/*backtest
start: 2024-05-01 00:00:00
end: 2024-05-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © syam-mohan-vs @ T7 - wwww.t7wealth.com www.t7trade.com
//This is an educational code done to describe the fundemantals of pine scritpting language and integration with Indian discount broker Dhan. This strategy is not tested or recommended for live trading. 

//@version=5
strategy("Pine & Dhan - Moving Average Crossover Strategy", overlay=true)

//Remove excess signals
exrem(condition1, condition2) =>
    temp = false
    temp := na(temp[1]) ? false : not temp[1] and condition1 ? true : temp[1] and condition2 ? false : temp[1]
    ta.change(temp) == true ? true : false

// Define MA period
ma_period = input(20, title = "MA Length")

// Define target and stop loss levels
target_percentage = input.float(title="Target Profit (%)", defval=2.0)
stop_loss_percentage = input.float(title="Stop Loss (%)", defval=1.0)

// Calculate the MA
ma = ta.sma(close, ma_period)

// Entry conditions
long_entry = close >= ma
short_entry = close < ma

// Calculate target and stop loss prices
target_price = long_entry ? strategy.position_avg_price + (close * (target_percentage / 100)) : strategy.position_avg_price - (close * (target_percentage / 100)) 
stop_loss_price = short_entry ? strategy.position_avg_price + (close * (stop_loss_percentage/ 100)) : strategy.position_avg_price - (close * (stop_loss_percentage / 100)) 

long_entry := exrem(long_entry,short_entry)
short_entry := exrem(short_entry,long_entry)

// Plot the MA
plot(ma, color=color.blue, linewidth=2, title="MA")

// Plot the entry and exit signals
plotshape(long_entry, style=shape.arrowup, color=color.green, size=size.small,location = location.belowbar)
plotshape(short_entry, style=shape.arrowdown, color=color.red, size=size.small,location = location.abovebar)

//Find absolute value of positon size to exit position properly
size = math.abs(strategy.position_size)

//Replace these four JSON strings with those generated from user Dhan account
long_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"I","sort_order":"1","price":"0"}]}'
long_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}'
short_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}'
short_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}'

// Submit orders based on signals
if(strategy.position_size == 0)
    if long_entry 
        strategy.order("Long", strategy.long,alert_message=long_msg)          

    if short_entry
        strategy.order("Short", strategy.short,alert_message=short_msg)        
    
if(strategy.position_size > 0)
    
    if(short_entry)
        strategy.order("Short", strategy.short, qty = size, alert_message=short_msg)     
    else
        strategy.exit("Long Exit", from_entry="Long", qty = size, stop=stop_loss_price, limit= target_price, alert_message=long_exit_msg)

if(strategy.position_size < 0)
    
    if(long_entry)
        strategy.order("Long", strategy.long, qty = size, alert_message=long_msg)    
    else           
        strategy.exit("Short Exit", from_entry="Short", qty = size, stop=stop_loss_price, limit= target_price, alert_message=short_exit_msg)