Estrategia de seguimiento del porcentaje de caja dinámica

El autor:¿ Qué pasa?, Fecha: 2023-11-23 10:32:39
Las etiquetas:

img

Resumen general

Esta estrategia utiliza cambios de precio porcentuales para establecer líneas de entrada y líneas de stop loss. Ingresa posiciones cuando los precios rompen la línea de entrada y sale de posiciones cuando los precios caen por debajo de la línea de stop loss. Su característica principal es que solo asume una unidad de riesgo, lo que significa que las nuevas posiciones solo se agregarán después de que la posición anterior alcance un objetivo de ganancia preestablecido.

Principios

La estrategia primero establece un precio de referencia y utiliza el 10% de ese precio como rango de precios - el límite superior es la línea de entrada y el límite inferior es la línea de stop loss. Cuando los precios rompen la línea de entrada, se comprarán cantidades fijas. Cuando los precios caen por debajo de la línea de stop loss, las posiciones se cerrarán. Después de obtener ganancias, las líneas de entrada y stop loss se ajustarán en porcentaje para ampliar el rango de ganancias. Esto permite a la estrategia rastrear las tendencias.

El objetivo de la estrategia es que las nuevas posiciones se agreguen solo después de que la posición actual alcance el objetivo de ganancia, lo que limita el riesgo.

Análisis de ventajas

Esta estrategia combina las ventajas de los trailing stops y el dimensionamiento de las posiciones, lo que permite un control eficaz del riesgo y al mismo tiempo es rentable.

  1. El uso de rangos porcentuales para las líneas de entrada y stop loss permite el seguimiento automático de la tendencia
  2. El riesgo se limita a un solo dígito, evitando pérdidas importantes
  3. Las nuevas posiciones sólo se añaden después de las ganancias, evitando perseguir tendencias
  4. Las líneas de stop loss suben después de las ganancias, bloqueando las ganancias

Análisis de riesgos

También hay algunos riesgos:

  1. Si los intervalos de porcentaje son demasiado amplios, el riesgo puede aumentar
  2. Si los rangos son demasiado estrechos, el potencial de ganancia es limitado
  3. La colocación incorrecta de un stop loss puede llevar a una salida prematura
  4. Las adiciones agresivas pueden amplificar las pérdidas

Estos riesgos pueden evitarse ajustando parámetros como el tamaño del rango, los filtros de entrada, etc.

Optimización

Hay espacio para una mayor optimización:

  1. Combinación con indicadores de tendencia para determinar la dirección de la tendencia
  2. Añadir modelos de aprendizaje automático para líneas más adaptables
  3. Prueba de diferentes condiciones de adición para reducir el riesgo
  4. Encontrar los períodos de retención óptimos mediante ensayos

Conclusión

Este es un sistema simple y práctico basado en el rango porcentual. A través del ajuste de parámetros y la optimización del modelo, esta estrategia puede convertirse en una herramienta de seguimiento de tendencias confiable, generando un rendimiento estable para los inversores.


/*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)





Más.