La idea principal de esta estrategia es utilizar el forko de oro de línea uniforme para hacer más, el forko de muerte de línea uniforme para hacer vacío, y después de entrar en posición, configurar el stop de seguimiento. Cuando el precio alcanza el límite de parada especificado, se activa el stop de seguimiento y se ajusta constantemente el stop de parada para maximizar los beneficios.
La estrategia se divide en las siguientes partes:
Calcula la media rápida y la media lenta. Aquí la media rápida tiene un período de 20 años y la media lenta tiene un período de 50 años.
Para determinar los requisitos de admisión: hacer más en la línea media rápida y baja en la línea media rápida.
Determine la dirección de la tendencia. Registre el número de barras de sobreventa y baja, y determine si la tendencia actual es de más o menos cabeza.
Precio de entrada. El precio registrado en el momento de la emisión de la señal de negociación como precio de entrada.
Configurar el control de la línea de frenado.(1 + porcentaje de suspensión) como suspensión; cuando está en blanco, estará en el punto más bajo(1- porcentaje de estancamiento) como estancamiento.
Seguimiento de las paradas. La línea de paradas se ajusta constantemente y, al moverse en la dirección favorable, continúa moviéndose en la dirección favorable en un porcentaje fijo para maximizar las ganancias.
Se activa la línea de parada. Cuando el precio toque la línea de parada, se detiene la posición.
También hay una función de inicio opcional. Es decir, se establece una línea de inicio y parada que se activa solo cuando el precio se rompe por primera vez.
La mayor ventaja de esta estrategia es que se puede aprovechar el seguimiento de las paradas para maximizar las ganancias. Cuando el mercado funciona en la dirección favorable, las líneas de paradas se mueven constantemente en la dirección favorable, lo que garantiza la ganancia.
Además, la estrategia incluye un filtro de tendencia de mediana línea de juicio, que reduce la repetición innecesaria de posiciones en mercados no tendencia. La función de inicio también evita que una pequeña oscilación en el precio desencadene una parada de seguimiento.
Por lo tanto, esta estrategia integra varios aspectos de la determinación de la tendencia, los requisitos de entrada y la estrategia de parada para obtener beneficios sostenidos y maximizar los beneficios en situaciones de tendencia.
El principal riesgo de esta estrategia es que debe haber suficiente espacio para que el mercado se detenga. Si el mercado se invierte rápidamente, puede haber pérdidas.
Además, en situaciones de temblor, la activación frecuente de los cables de frenado también puede causar daños.
Por último, si los parámetros se ajustan mal, por ejemplo, si la proporción de estancamiento es demasiado grande, también aumenta el riesgo.
El riesgo puede ser controlado por el establecimiento de un Stop Loss Ratio razonable, para evitar el comercio en situaciones de crisis, o el establecimiento de un Stop Loss.
Esta estrategia se puede optimizar en los siguientes aspectos:
Optimización de los parámetros de la media. Se pueden probar diferentes parámetros de la media y encontrar la combinación más adecuada.
Optimización de la función de arranque. Puede probar diferentes tamaños de barra de arranque para encontrar la configuración más adecuada.
Optimización de la proporción de frenado. Se puede encontrar un parámetro de proporción de frenado más adecuado mediante retroalimentación.
Añadir un stop. Establecer una posición de stop razonable y controlar el riesgo.
Optimización de las condiciones de filtración. Se puede probar la adición de otras condiciones de filtración, como volumen de transacción, stop loss ATR, etc.
Optimización de los indicadores. Se puede probar en diferentes indicadores de negociación, como acciones, divisas, criptomonedas, etc.
Esta estrategia integra varios módulos de estrategia, como el juicio de la tendencia, los requisitos de entrada y el seguimiento de las paradas, para que se pueda seguir el seguimiento de las paradas y maximizar los beneficios en situaciones de tendencia. Sin embargo, se debe controlar el riesgo, evitar su uso en situaciones de crisis y optimizar los parámetros para que la estrategia tenga el máximo impacto.
/*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