A estratégia de rastreamento de porcentagem de caixa dinâmica

Autora:ChaoZhang, Data: 2023-11-23 10:32:39
Tags:

img

Resumo

Esta estratégia usa mudanças percentuais de preço para definir linhas de entrada e linhas de stop loss. Ela entra em posições quando os preços atravessam a linha de entrada e sai de posições quando os preços caem abaixo da linha de stop loss. Sua principal característica é que ela assume apenas uma unidade de risco, o que significa que novas posições só serão adicionadas depois que a posição anterior atinge uma meta de lucro pré-estabelecida.

Princípios

A estratégia primeiro define um preço de referência e usa 10% desse preço como faixa de preços - o limite superior é a linha de entrada e o limite inferior é a linha de stop loss. Quando os preços atravessam a linha de entrada, quantidades fixas serão compradas. Quando os preços caem abaixo da linha de stop loss, as posições serão fechadas. Depois de obter lucros, as linhas de entrada e stop loss serão ajustadas em porcentagem para expandir a faixa de lucro. Isso permite que a estratégia rastreie corridas de tendência.

Outro ponto chave da estratégia é que ela assume apenas uma unidade de risco. Ou seja, novas posições só serão adicionadas depois que a posição atual atingir a meta de lucro. As novas posições também seguirão as novas linhas de entrada e stop loss. Isso limita o risco.

Análise das vantagens

Esta estratégia combina as vantagens das trailing stops e do dimensionamento das posições, permitindo um controlo eficaz do risco, ao mesmo tempo em que é rentável.

  1. O uso de intervalos percentuais para as linhas de entrada e stop loss permite o acompanhamento automático da tendência
  2. O risco é limitado a um único dígito, evitando perdas importantes
  3. As novas posições só são adicionadas após os lucros, evitando seguir tendências
  4. As linhas de stop loss aumentam após os lucros, bloqueando os ganhos

Análise de riscos

Há também alguns riscos:

  1. Se os intervalos percentuais forem demasiado amplos, o risco pode aumentar
  2. Se os intervalos forem demasiado estreitos, o potencial de lucro é limitado
  3. A colocação incorreta de um stop loss pode conduzir a uma saída prematura
  4. Adições agressivas podem aumentar as perdas

Estes riscos podem ser evitados ajustando parâmetros como tamanhos de gama, filtros de entrada, etc.

Optimização

Há espaço para uma maior otimização:

  1. Combinação com indicadores de tendência para determinar a direção da tendência
  2. Adicionar modelos de aprendizagem de máquina para linhas mais adaptáveis
  3. Teste de diferentes condições de adição para reduzir o risco
  4. Determinação dos períodos de retenção ideais através de ensaios

Conclusão

Este é um sistema simples e prático baseado em intervalos percentuais. Através do ajuste de parâmetros e otimização do modelo, esta estratégia pode se tornar uma ferramenta de rastreamento de tendências confiável, gerando um desempenho estável para os investidores.


/*backtest
start: 2022-11-16 00:00:00
end: 2023-11-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HermanBrummer 4 April 2021

strategy ("The Box Percent Strat", shorttitle="The Box", overlay = true)

///     Designed for LONG only on Daily, 2D or 3D Charts
///     Uses fixed investment risk amount, meaning you're willing to lose that amount per trade
///     Limit buy to not overpay

RiskPerTrade            = input(10000, "Risk losing this much per trade", tooltip="This calculates how much you will lose based on difference between the entry price and stop loss price")
TradeAboveMAFilterPer   = input(50, "The System won't trade if price is below this MA")

UpBoxSize               = (input(10, "Box size in %") * 0.01)+1 // 1.1 == 10% up
DnBoxSize               = 1-(input(10, "Box size in %") * 0.01) // 0.9 == 10% dn


var FirstBar            = close > 0 ? close : na
var FirstTop            = FirstBar * UpBoxSize
var FirstBot            = FirstBar * DnBoxSize


var top                 = sma(FirstTop, 1)
var bot                 = sma(FirstBot, 1)

///     The Box Calcs
if  high[2] > top
    top                 := top * UpBoxSize
    bot                 := bot * UpBoxSize
if  low[1]  < bot
    top                 := top * DnBoxSize
    bot                 := bot * DnBoxSize

 
plot(bot,   "Bot",      #ff0000) // Green
plot(top,   "Top",      #00ff00) // Red

mid                     = ((top-bot)/2)+bot 
plot(mid,   "Mid", color.gray)

TradeAboveMAFilter      = sma(close, TradeAboveMAFilterPer)
plot(TradeAboveMAFilter, "Trade AboveMAF Filter", color.yellow, 3, style=plot.style_circles)

// col = high[1] < top and high >= top ? color.white : na
// bgcolor(col)


///     Shares
RiskRange                   = close * abs(DnBoxSize - 1) // 0.9 - 1 == 1.10 // 10% abs so you don't get a neg number NB NB
Shares                      = RiskPerTrade / RiskRange 
//plot(close-RiskRange, "RiskRange", color.fuchsia)

Enter   =   high >= top
             and close[1] > TradeAboveMAFilter
             and strategy.opentrades[0] == strategy.opentrades[1]
             and strategy.opentrades[1] == strategy.opentrades[2] 
             and strategy.opentrades[2] == strategy.opentrades[3]
             and strategy.opentrades[3] == strategy.opentrades[4] 
             and strategy.opentrades[4] == strategy.opentrades[5]
             and strategy.opentrades[5] == strategy.opentrades[6]
             // won't enter if new positon was taken in the last 6 bars
             // need better code for this.

///     Buy & Sell
//  (new highs)    and  (Close above moving average filter) and (No new trades were taken receently)
if  Enter //(high >= top)  and  (close[1] > TradeAboveMAFilter) and strategy.opentrades[0] == strategy.opentrades[1] 
    strategy.order("En", strategy.long, qty=Shares, limit=top)//, stop=top)
    
//barcolor(strategy.position_size != 0 ? #00ff00 : color.gray)


// ///     If ONE Position THEN this Stop Because: 
// if  strategy.position_size == 1
//     strategy.exit("Ex", "En", stop=bot)
///     If it has more than one trad OPEN
if  strategy.position_size > 0
    strategy.exit("Ex", "En", stop=bot[2] )   // puts stop on old bot

//plot(strategy.position_avg_price, "Avg Price", color.yellow)





Mais.