Estratégia quantitativa de dupla captação de lucros média móvel

Autora:ChaoZhang, Data: 2023-11-14 16:04:33
Tags:

img

Resumo

Esta estratégia utiliza técnicas simples de cruzamento de médias móveis e duplo lucro para controlar o risco e aumentar a lucratividade.

Estratégia lógica

A estratégia baseia-se no cruzamento da EMA e da WMA para determinar as tendências do mercado.

Ao entrar, dois níveis de take profit são definidos. O primeiro take profit é fixado no preço de entrada + 20 pips, e o segundo take profit é fixado no preço de entrada + 40 pips. Enquanto isso, um stop loss é colocado no preço de entrada - 20 pips.

Quando o preço atinge o primeiro take profit, ele fechará metade da posição. A posição restante continuará correndo em direção ao segundo take profit ou até parar.

Existem três resultados possíveis para cada negócio:

  1. O preço chega ao stop loss, leva perdas de 2% diretamente.

  2. O preço atinge primeiro, obtém o lucro primeiro, fecha metade da posição bloqueando 1% de lucro, depois continua a correr até parar, terminando com o break even.

  3. Depois de atingir o primeiro take profit, o preço continua a correr e atinge o segundo take profit, terminando com 1% + 2% = 3% de lucro total.

Análise das vantagens

A maior vantagem desta estratégia de duplo take profit é que ela controla o risco e evita grandes perdas individuais.

Em comparação com o single take profit/stop loss, esta estratégia tem três resultados - perda, vitória ou equilíbrio, reduzindo a probabilidade de stop loss.

Outra vantagem é a sua simplicidade. A EMA e a WMA são indicadores bem conhecidos que são fáceis de entender. A lógica take profit/stop loss é simples de monitorar.

Análise de riscos

Apesar das vantagens, esta estratégia apresenta também riscos a tomar em consideração.

Em primeiro lugar, como indicadores de média móvel, a EMA e a WMA têm capacidades relativamente fracas para identificar os mercados variáveis.

Em segundo lugar, os níveis fixos de take profit/stop loss podem não se adaptar à volatilidade do mercado, podendo ser facilmente penetrados durante a alta volatilidade, tornando-os ineficazes.

Por último, a estratégia não pode responder a acontecimentos inesperados, com o risco de ficar preso.

Orientações de otimização

Existem vários aspectos para otimizar ainda mais a estratégia:

  1. Melhorar os sinais de entrada: testar melhores indicadores de média móvel ou tendência do que a EMA e a WMA para gerar sinais de melhor qualidade.

  2. Usar métodos como ATR, trailing stop loss etc para fazer os níveis de lucro/perda adaptarem-se aos mercados.

  3. Adicione filtros. Exige confirmação de volume ou indicador secundário antes do cruzamento para evitar armadilhas.

  4. Otimizar o dimensionamento das posições, ajustando o tamanho das posições de acordo com as regras de gestão de capital.

Conclusão

Em resumo, esta é uma estratégia de tendência simples e prática. Utiliza cruzamento de EMA e WMA para entradas, e duplo lucro para controlar riscos. Em comparação com estratégias tradicionais, tem maior taxa de ganho e menor risco. É claro, as limitações dos indicadores e configurações de lucro / perda devem ser observadas. Outras otimizações podem tornar a estratégia mais robusta.


/*backtest
start: 2023-11-06 00:00:00
end: 2023-11-13 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("FS ATR & PS (MA)", overlay=true)

// Strategy
Buy  = input(true)
Sell = input(true)

// Time Period
start_year   = input(title='Start year'   ,defval=2019)
start_month  = input(title='Start month'  ,defval=1)
start_day    = input(title='Start day'    ,defval=1)
start_hour   = input(title='Start hour '  ,defval=0)
start_minute = input(title='Start minute' ,defval=0)
end_time     = input(title='set end time?',defval=false)
end_year     = input(title='end year'     ,defval=2019)
end_month    = input(title='end month'    ,defval=12)
end_day      = input(title='end day'      ,defval=31)
end_hour     = input(title='end hour'     ,defval=23)
end_minute   = input(title='end minute'   ,defval=59)

// MA
ema_period   = input(title='EMA period',defval=10)
wma_period   = input(title='WMA period',defval=20)
ema = ema(close,ema_period)
wma = wma(close,wma_period)

// Entry Condition
longCondition  = 
 crossover(ema,wma) and Buy and
 nz(strategy.position_size) == 0 and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)
 
shortCondition = 
 crossunder(ema,wma) and Sell and
 nz(strategy.position_size) == 0 and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)

// Exit Condition
a = input(20)*10
b = input(40)*10
c = a*syminfo.mintick
d = b*syminfo.mintick

long_stop_level     = float(na)
long_profit_level1  = float(na)
long_profit_level2  = float(na)
long_even_level     = float(na)

short_stop_level    = float(na)
short_profit_level1 = float(na)
short_profit_level2 = float(na)
short_even_level    = float(na)

long_stop_level     := longCondition  ? close - c : long_stop_level     [1]
long_profit_level1  := longCondition  ? close + c : long_profit_level1  [1]
long_profit_level2  := longCondition  ? close + d : long_profit_level2  [1]
long_even_level     := longCondition  ? close + 0 : long_even_level     [1]

short_stop_level    := shortCondition ? close + c : short_stop_level    [1]
short_profit_level1 := shortCondition ? close - c : short_profit_level1 [1]
short_profit_level2 := shortCondition ? close - d : short_profit_level2 [1]
short_even_level    := shortCondition ? close + 0 : short_even_level    [1] 

// Position Sizing
Risk = input(defval=10, title="Risk per trade%", step=1, minval=0, maxval=100)/100
size  = 1

// Strategy
if longCondition
    strategy.entry("Buy"  , strategy.long, qty=size)
    strategy.exit ("Exit1", stop=long_stop_level, limit=long_profit_level1, qty=size/2)
    strategy.exit ("Exit2", stop=long_stop_level, limit=long_profit_level2)
    
if shortCondition
    strategy.entry("Sell" , strategy.short, qty=size)
    strategy.exit ("Exit3", stop=short_stop_level, limit=short_profit_level1, qty=size/2)
    strategy.exit ("Exit4", stop=short_stop_level, limit=short_profit_level2)
    
// Plot
plot(strategy.position_size <= 0 ? na : long_stop_level    , color=#dc143c, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_profit_level1 , color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_profit_level2 , color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size <= 0 ? na : long_even_level    , color=#ffffff, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_stop_level   , color=#dc143c, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_profit_level1, color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_profit_level2, color=#00ced1, style=plot.style_linebr, linewidth=1)
plot(strategy.position_size >= 0 ? na : short_even_level   , color=#ffffff, style=plot.style_linebr, linewidth=1)
plot(ema,color=#00ced1)
plot(wma,color=#dc143c)






Mais.