La idea principal de esta estrategia es ir largo cuando el MA rápido cruza sobre el MA lento, ir corto cuando el MA rápido cruza por debajo del MA lento, y establecer un retraso en el beneficio después de ingresar a la posición.
La estrategia consta de las siguientes partes principales:
Calcule los promedios móviles rápidos y lentos.
Determinar las condiciones de entrada. Ir largo cuando el MA rápido cruza el MA lento, ir corto cuando el MA rápido cruza el MA lento.
Determine la dirección de la tendencia. Registre el número de barras desde las señales largas y cortas, juzgue si es una tendencia alcista o bajista.
Precio de entrada: se registra el precio cuando se activan las señales comerciales como precio de entrada.
Para los tramos largos, el beneficio es alto * (1 + porcentaje de beneficio); para los cortos, el beneficio es bajo * (1 - porcentaje de beneficio).
La línea de ganancias sigue ajustándose, moviéndose en porcentaje fijo a favor de la dirección rentable.
Cuando el precio toque la línea de ganancias, cierre la posición para obtener ganancias.
Solo cuando el precio rompa por primera vez el nivel de activación se activará el beneficio de toma de trayectoria.
La mayor ventaja de esta estrategia es maximizar las ganancias siguiendo la tendencia del take profit.
También agrega filtrado de tendencias con cruces de MA para evitar cambios innecesarios en mercados que no están en tendencia.
Al combinar tendencia, entrada, tomar ganancias, puede montar la tendencia para obtener ganancias continuamente y maximizar el rendimiento.
El principal riesgo es que requiere un movimiento adecuado de precios para alcanzar el beneficio.
Además, el desencadenamiento frecuente de la toma de ganancias en mercados agitados puede causar pérdidas.
Y los parámetros mal establecidos como el porcentaje de ganancias demasiado alto pueden aumentar el riesgo.
El riesgo se puede gestionar estableciendo el porcentaje de ganancia apropiado, evitando el comercio en mercados agitados o utilizando el stop loss.
La estrategia se puede optimizar en los siguientes aspectos:
Optimizar los parámetros de MA probando diferentes períodos para encontrar mejores combinaciones.
Optimice la función de activación probando diferentes niveles de activación.
Optimizar el porcentaje de ganancias a través de backtesting.
Añadir stop loss a los niveles adecuados para controlar el riesgo.
Prueba de filtros adicionales como el volumen, la parada de ATR, etc.
Prueba en diferentes mercados como acciones, divisas, criptomonedas.
Esta estrategia integra múltiples módulos como tendencia, entrada, retraso en la toma de beneficios para maximizar las ganancias mediante la conducción de tendencias. Pero los riesgos deben ser gestionados, evitar mercados agitados, optimizar los parámetros antes de usar. Proporciona una idea de obtener mayores ganancias a través de retraso en la toma de beneficios.
/*backtest start: 2023-01-01 00:00:00 end: 2023-10-06 00:00:00 period: 2d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //@author=Daveatt SystemName = "BEST Trailing Profit Strategy" // This string is to personalize the text that appears with your orders on the chart through strategy() calls and entry/exit markers, and in the alert default message. // Although leaving it empty will not cause problems in study mode, TradeId = "BEST" // These values are used both in the strategy() header and in the script's relevant inputs as default values so they match. // Unless these values match in the script's Inputs and the TV backtesting Properties, results between them cannot be compared. InitCapital = 1000000 InitPosition = 100 InitCommission = 0.075 InitPyramidMax = 1 CalcOnorderFills = true CalcOnTick = true DefaultQtyType = strategy.fixed DefaultQtyValue = strategy.fixed Precision = 2 Overlay=true // strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay, // pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, // commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2) // strategy(title=SystemName, shorttitle=SystemName, overlay=true, // pyramiding=0, default_qty_value=100, precision=7, currency=currency.USD, // commission_value=0.2,commission_type=strategy.commission.percent, initial_capital=10000) // // Author: Daveatt // Revision: R0.1 Beta // Date: 8-Dec-2019 // // inputs src = input(defval=close, type=input.source, title="Source") slowLength = input(20, "Fast Length",minval=2,step=1) fastLength = input(50, "Fast Length",minval=2,step=1) // Calculate moving averages fastSMA = sma(src, slowLength) slowSMA = sma(src, fastLength) // Calculate trading conditions enterLong = crossover(fastSMA, slowSMA) enterShort = crossunder(fastSMA, slowSMA) // trend states since_buy = barssince(enterLong) since_sell = barssince(enterShort) buy_trend = since_sell > since_buy sell_trend = since_sell < since_buy change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1]) // get the entry price entry_price = valuewhen(enterLong or enterShort, src, 0) // Plot moving averages plot(series=fastSMA, color=color.teal) plot(series=slowSMA, color=color.orange) // Plot the entries plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small) plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small) /////////////////////////////// //======[ Take Profit ]======// /////////////////////////////// // Use TP? useTP = input(true, "Use take profit") // TP trailing ProfitTrailPerc = input(1.0, "Trailing Profit (%)",minval=0,step=0.5,type=input.float) * 0.01 use_TP_Trigger = input(true, "Use Take Profit Trigger") // Will trigger the take profit trailing once reached takeProfitTrigger = input(3.0, "Take Profit Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01 // ttp := ttp>tp ? tp : ttp takeprofitPriceTrigger = 0.0 takeprofitPriceTrigger := if (use_TP_Trigger) if (buy_trend) entry_price * (1 + takeProfitTrigger) else entry_price * (1 - takeProfitTrigger) else -1 //plot(entry_price, title='entry_price', transp=100) var TP_Trigger_Long_HIT = false TP_Trigger_Long_HIT := useTP and use_TP_Trigger and buy_trend and high >= takeprofitPriceTrigger ? true : TP_Trigger_Long_HIT[1] var TP_Trigger_Short_HIT = false TP_Trigger_Short_HIT := useTP and use_TP_Trigger and sell_trend and low <= takeprofitPriceTrigger ? true : TP_Trigger_Short_HIT[1] display_long_TP_trigger = useTP and buy_trend and TP_Trigger_Long_HIT == false and takeprofitPriceTrigger != -1 display_short_TP_trigger = useTP and sell_trend and TP_Trigger_Short_HIT == false and takeprofitPriceTrigger != -1 display_TP_trigger = display_long_TP_trigger or display_short_TP_trigger //🔷🔷🔷 // @hugo: Will display the TP trigger as long as not hit // once the TP trigger is hit, the TP trailing will activate plot(display_TP_trigger ? takeprofitPriceTrigger : na, title='takeprofitPriceTrigger', transp=0, color=color.orange, style=plot.style_cross, linewidth=3) longTrailTP= 0.0, shortTrailTP = 0.0 // Trailing Profit // Start trailing once trigger is reached longTrailTP := if useTP and buy_trend tpValue = high * (1 + ProfitTrailPerc) max(tpValue, longTrailTP[1]) else 0 shortTrailTP := if useTP and sell_trend tpValue = low * (1 - ProfitTrailPerc) min(tpValue, shortTrailTP[1]) else 999999 //plot(longTrailTP, title='debug longTrailTP', transp=100) //plot(shortTrailTP, title='debug shortTrailTP', transp=100) ////////////////////////////////////////////////////////////////////////////////////////// //*** TRAILING TAKE PROFIT HIT CONDITIONS TO BE USED IN ALERTS ***// ////////////////////////////////////////////////////////////////////////////////////////// //🔷🔷🔷 // @hugo: I use crossover/crossunder for the alerts to trigger the events only once cond_long_trail_tp_hit = useTP and buy_trend and crossover(high, longTrailTP[1]) and (TP_Trigger_Long_HIT or use_TP_Trigger == false) cond_short_trail_tp_hit = useTP and sell_trend and crossunder(low, shortTrailTP[1]) and (TP_Trigger_Short_HIT or use_TP_Trigger == false) // 🔷🔷🔷 // Plot take profits values for confirmation // Display the trailing TP until not hit plot(series= useTP and buy_trend and high <= longTrailTP and (TP_Trigger_Long_HIT or use_TP_Trigger == false) ? longTrailTP : na, color=color.aqua, style=plot.style_circles, linewidth=2, title="Long Trail TP") plot(series= useTP and sell_trend and low >= shortTrailTP and (TP_Trigger_Short_HIT or use_TP_Trigger == false) ? shortTrailTP : na, color=color.aqua, style=plot.style_circles, linewidth=2, title="Short Trail TP") close_long = cond_long_trail_tp_hit close_short = cond_short_trail_tp_hit // Submit entry orders strategy.entry("EL", long=true, when=enterLong) strategy.close("EL", when=close_long) //if (enterShort) strategy.entry("ES", long=false, when=enterShort) strategy.close("ES", when=close_short) /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////// ALERTS //////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////// //* Put Entry Alerts below *// ////////////////////////////// // IN STUDY MODE ONLY // ⚠️⚠️⚠️ For alerts on the signal itself ⚠️⚠️⚠️ //alertcondition(buy_event, "Open Long", "LONG") //alertcondition(sell_event, "Open Short", "SHORT") // For the closes you will want to trigger these alerts on condition with alert // option "Once Per Bar" for TP and SL if change_trend TP_Trigger_Long_HIT := false TP_Trigger_Short_HIT := false