Estratégia quantitativa de negociação de Bitcoin baseada em super tendência


Data de criação: 2024-02-06 12:09:09 última modificação: 2024-02-06 12:09:09
cópia: 2 Cliques: 983
1
focar em
1617
Seguidores

Estratégia quantitativa de negociação de Bitcoin baseada em super tendência

Visão geral

Esta estratégia é uma estratégia de negociação automática de quantificação de Bitcoin baseada em indicadores de super tendências. Utiliza indicadores de super tendências para avaliar a tendência do mercado, em combinação com o controle de risco do princípio de parada de ATR, para realizar negociações bidirecionais de curto prazo. A maior vantagem da estratégia é que a relação risco / retorno é boa, a estratégia de parada é confiável e adequada para a posse de médio a longo prazo.

Princípio da estratégia

Esta estratégia usa o indicador de tendência super para determinar a direção da tendência do mercado. Quando o indicador de tendência super muda de tendência descendente para tendência ascendente, faça entrada de cabeça; Quando o indicador de tendência super muda de tendência ascendente para tendência descendente, faça entrada de cabeça.

Especificamente, a estratégia primeiro calcula o comprimento do indicador ATR de 14 ciclos, determinando a distância de parada de cada um por multiplicação por um múltiplo de parada de perda ATR (como 1,5 vezes). Em seguida, calcula o indicador de super-trend, cujo parâmetro de indicador adota o valor padrão (ciclo ATR 9, o fator de super-trend 2.5) e emite um sinal de negociação quando o indicador de super-trend muda de direção.

Após a entrada, o ponto de parada é fixado acima ou abaixo do ponto de parada ATR. O primeiro ponto de parada é calculado de acordo com a relação de risco-retorno, assumindo que 0,75, ou seja, a distância de parada é 0,75 vezes a distância de parada. Quando o preço atinge o primeiro ponto de parada, elimine 50% da posição e mova o ponto de parada para o preço de abertura.

Desta forma, esta estratégia pode garantir a rentabilidade através de um bloqueio parcial, garantindo o controle do risco de parada de perdas, adequado para a estratégia de investimento de detenção de linhas médias e longas.

Análise de vantagens

A principal vantagem desta estratégia é a boa relação risco-receita, que pode ser mantida a médio e longo prazo. As vantagens específicas são:

  1. O uso de super tendências para avaliar as tendências do mercado, filtrar o ruído do mercado e evitar perder as principais tendências.

  2. ATR de rastreamento dinâmico de stop loss, controle confiável de perdas individuais.

  3. A parcela do método de suspensão bloqueia o lucro, o risco é maior do que o lucro.

  4. Quando o preço atinge o Stop Loss 1, ajuste o Stop Loss ao preço de abertura para garantir o lucro e aumentar a estabilidade da estratégia.

  5. A lógica de transação é super simples, fácil de entender, com grande espaço para ajuste de parâmetros.

  6. Pode ser aplicado em dados diários ou de alta frequência das principais bolsas, com grande flexibilidade.

Análise de Riscos

A estratégia também apresenta alguns riscos, que se concentram nos seguintes aspectos:

  1. O risco pode ser reduzido através de um ajuste razoável do ATR Stop Loss Coefficient.

  2. Os indicadores de super tendência falham em seu julgamento, causando erros nos sinais de negociação. ATR e a combinação de parâmetros de super tendência podem ser adequadamente ajustados para otimização.

  3. Algumas das taxas de liquidação são muito altas e não permitem um lucro de tendência suficiente. Algumas taxas de liquidação devem ser ajustadas de acordo com os diferentes mercados.

  4. A frequência de negociação pode ser muito alta ou muito baixa. Os parâmetros de super tendência devem ser ajustados para encontrar o melhor equilíbrio.

Direção de otimização

A estratégia ainda tem muito espaço para otimização e concentra-se nas seguintes áreas:

  1. Tente diferentes métodos de parada de perda de ATR, como ATR padrão, parada de força, parada de faixa de Brin para otimizar a estratégia de parada.

  2. Teste os indicadores de tendência super de diferentes parâmetros para encontrar a combinação ideal de parâmetros. A otimização de parâmetros multidimensionais pode ser feita usando otimização progressiva ou algoritmos genéticos.

  3. Tente sobrepor um segundo nível de stop loss, como o canal Donchian, ao stop loss para torná-lo mais confiável.

  4. Teste diferentes proporções de liquidação parcial para encontrar o melhor equilíbrio entre lucro e risco. A proporção de liquidação parcial também pode ser ajustada dinamicamente.

  5. Explorar estratégias baseadas em aprendizagem de máquina para parar a dinâmica e ajustar a posição dinâmica.

Resumir

Esta estratégia é uma estratégia quantitativa baseada em supertrend, ATR, stop loss, stop profit. Ela é bem equilibrada em risco e ganho, adequada para negociação automática. A estratégia pode otimizar significativamente o superponto, o modo de parar o prejuízo, o modo de ganhar, etc. É uma estratégia quantitativa que vale a pena ajustar e usar a longo prazo.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Developed by © StrategiesForEveryone
//@version=5

strategy("SuperTrend Strategy for BTCUSD 4H", overlay=true, process_orders_on_close = true, initial_capital = 100, default_qty_type = strategy.cash, precision = 2, slippage = 50, commission_value = 0.03, backtest_fill_limits_assumption = 50)

// ------ Date filter (obtained from ZenAndTheArtOfTrading) ---------

initial_date = input(title="Initial date", defval=timestamp("10 Feb 2014 13:30 +0000"), group="Time filter", tooltip="Enter the start date and time of the strategy")
final_date   = input(title="Final date", defval=timestamp("01 Jan 2030 19:30 +0000"), group="Time filter", tooltip="Enter the end date and time of the strategy")
dateFilter(int st, int et) => time >= st and time <= et
colorDate = input.bool(defval=false, title="Date background", tooltip = "Add color to the period of time of the strategy tester")
bgcolor(colorDate and dateFilter(initial_date, final_date) ? color.new(color.blue, transp=90) : na)

// ------------ Super Trend ----------

atrPeriod = input(9, "ATR Length SuperTrend")
factor = input.float(2.5, "Factor SuperTrend", step = 0.05)
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
show_supertrend = input.bool(defval = false, title="Show supertrend ?", group = "Appearance")
bodyMiddle = plot(show_supertrend ? ((open + close) / 2) : na, display=display.none)
upTrend = plot(show_supertrend and direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr)
downTrend = plot(show_supertrend and direction > 0 ? supertrend : na, "Down Trend", color = color.red, style=plot.style_linebr)
fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false)
fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false)

// ---------- Atr stop loss (obtained from garethyeo)

source_atr = input(close, title='Source', group = "Atr stop loss", inline = "A")
length_atr = input.int(14, minval=1, title='Period', group = "Atr stop loss" , inline = "A")
multiplier = input.float(1.5, minval=0.1, step=0.1, title='Atr multiplier', group = "Atr stop loss", inline = "A", tooltip = "Defines the stop loss distance based on the Atr stop loss indicator")
shortStopLoss = source_atr + ta.atr(length_atr) * multiplier
longStopLoss = source_atr - ta.atr(length_atr) * multiplier
show_atr_stoploss = input.bool(defval=false, title="Show Atr stop loss ?", group = "Appearance")
plot(show_atr_stoploss ? longStopLoss : na, color=color.white, style = plot.style_circles)
plot(show_atr_stoploss ? shortStopLoss : na, color=color.white, style = plot.style_circles)

// ------------- Money management --------------

strategy_contracts = strategy.equity / close
distance_sl_atr_long = -1 * (longStopLoss - close) / close
distance_sl_atr_short = (shortStopLoss - close) / close
risk = input.float(2.5, '% Account risk per trade', step=1, group = "Risk management for trades", tooltip = "Percentage of total account to risk per trade")
long_amount = strategy_contracts * (risk / 100) / distance_sl_atr_long
short_amount = strategy_contracts * (risk / 100) / distance_sl_atr_short

// ---------- Risk management ---------------

risk_reward_breakeven_long= input.float(title="Risk/reward for breakeven long", defval=0.75, step=0.05, group = "Risk management for trades")
risk_reward_take_profit_long= input.float(title="Risk/reward for take profit long", defval=0.75, step=0.05, group = "Risk management for trades")
risk_reward_breakeven_short= input.float(title="Risk/reward for break even short", defval=0.75, step=0.05, group = "Risk management for trades")
risk_reward_take_profit_short= input.float(title="Risk/reward for take profit short", defval=0.75, step=0.05, group = "Risk management for trades")
tp_percent=input.float(title="% of trade for first take profit", defval=50, step=5, group = "Risk management for trades", tooltip = "Closing percentage of the current position when the first take profit is reached.")

// ------------ Trade conditions ---------------

bought = strategy.position_size > 0
sold = strategy.position_size < 0
long_supertrend=ta.crossover(close, supertrend)
short_supertrend=ta.crossunder(close, supertrend)
var float sl_long = na
var float sl_short = na 
var float be_long = na
var float be_short = na
var float tp_long = na
var float tp_short = na
if not bought
    sl_long:=na
if not sold
    sl_short:=na

// ---------- Strategy -----------

// Long position 

if not bought and long_supertrend
    sl_long:=longStopLoss           
    long_stoploss_distance = close - longStopLoss
    be_long := close + long_stoploss_distance * risk_reward_breakeven_long
    tp_long:=close+(long_stoploss_distance*risk_reward_take_profit_long)
    strategy.entry('L', strategy.long, long_amount, alert_message = "Long")
    strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent)
    strategy.exit('Exit', 'L', stop=sl_long)
if high > be_long
    sl_long := strategy.position_avg_price
    strategy.exit("Tp", "L", stop=sl_long, limit=tp_long, qty_percent=tp_percent)
    strategy.exit('Exit', 'L', stop=sl_long)
if bought and short_supertrend
    strategy.close("L", comment="CL")

// Short position

if not sold and short_supertrend
    sl_short:=shortStopLoss
    short_stoploss_distance=shortStopLoss - close  
    be_short:=((short_stoploss_distance*risk_reward_breakeven_short)-close)*-1
    tp_short:=((short_stoploss_distance*risk_reward_take_profit_short)-close)*-1
    strategy.entry("S", strategy.short, short_amount, alert_message = "Short")
    strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent)
    strategy.exit("Exit", "S", stop=sl_short)
if low < be_short
    sl_short:=strategy.position_avg_price
    strategy.exit("Tp", "S", stop=sl_short, limit=tp_short, qty_percent=tp_percent)
    strategy.exit("Exit", "S", stop=sl_short)    
if sold and long_supertrend
    strategy.close("S", comment="CS") 

// ---------- Draw position on chart -------------

if high>tp_long
    tp_long:=na
if low<tp_short
    tp_short:=na
if high>be_long
    be_long:=na
if low<be_short
    be_short:=na

show_position_on_chart = input.bool(defval=true, title="Draw position on chart ?", group = "Appearance", tooltip = "Activate to graphically display profit, stop loss and break even")
position_price = plot(show_position_on_chart? strategy.position_avg_price : na, style=plot.style_linebr, color = color.new(#ffffff, 10), linewidth = 1)

sl_long_price = plot(show_position_on_chart and bought ? sl_long : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1)
sl_short_price = plot(show_position_on_chart and sold ? sl_short : na, style = plot.style_linebr, color = color.new(color.red, 10), linewidth = 1)

tp_long_price = plot(strategy.position_size>0 and show_position_on_chart? tp_long : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1)
tp_short_price = plot(strategy.position_size<0 and show_position_on_chart? tp_short : na, style = plot.style_linebr, color = color.new(#11eb47, 10), linewidth = 1)

breakeven_long = plot(strategy.position_size>0 and high<be_long and show_position_on_chart ? be_long : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1)
breakeven_short = plot(strategy.position_size<0 and low>be_short and show_position_on_chart ? be_short : na , style = plot.style_linebr, color = color.new(#00ff40, 60), linewidth = 1)

position_profit_long = plot(bought and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1)
position_profit_short = plot(sold and show_position_on_chart and strategy.openprofit>0 ? close : na, style = plot.style_linebr, color = color.new(#4cd350, 10), linewidth = 1)

fill(plot1 = position_price, plot2 = position_profit_long, color = color.new(color.green,90))
fill(plot1 = position_price, plot2 = position_profit_short, color = color.new(color.green,90))

fill(plot1 = position_price, plot2 = sl_long_price, color = color.new(color.red,90))
fill(plot1 = position_price, plot2 = sl_short_price, color = color.new(color.red,90))

fill(plot1 = position_price, plot2 = tp_long_price, color = color.new(color.green,90))
fill(plot1 = position_price, plot2 = tp_short_price, color = color.new(color.green,90))