Esta estrategia combina medias móviles y curvas de Hull para identificar la dirección de la tendencia del mercado y seguir las tendencias.
La lógica principal es:
McGinley Dynamic MA juzga la dirección general de la tendencia
Los cruces de la curva del casco generan señales largas/cortas específicas
Indicadores de confirmación opcionales para la verificación de la señal
Gestión del riesgo mediante principios de stop loss y take profit
Posiciones cerradas cuando la curva del casco se invierte
La estrategia tiene como objetivo sistematizar mecánicamente la tendencia siguiente, minimizando las influencias subjetivas individuales.
El MA juzga la dirección general, las confirmaciones flexibles
Señales largas/cortas del casco
La gestión de riesgos basada en reglas minimiza los errores
El ajuste de parámetros y filtros requieren optimización
La precisión de la tendencia tiene incertidumbres
Curva del casco propensa a señales de retraso
Esta estrategia busca sistematizar la tendencia después de las operaciones para que coincida con el ritmo del mercado, pero la optimización de parámetros y las limitaciones de los indicadores requieren precaución para la estabilidad.
/*backtest start: 2023-08-14 00:00:00 end: 2023-09-13 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © Milleman //@version=4 strategy("Millebot", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.04) // Risk management settings Spacer2 = input(false, title="=== Risk management settings ===") Risk = input(1.0, title="% Risk")/100 RRR = input(2,title="Risk Reward Ratio",step=0.1,minval=0,maxval=20) SL = input(5,title="StopLoss %",step=0.25)/100 // Baseline : McGinley Dynamic Spacer3 = input(false, title="=== Baseline - Switch L/S ===") McG_Source = input(close, title="McGinley source") McG_length = input(50, title=" McG length", minval=1) McG_LS_Switch = 0.0 McG_LS_Switch := na(McG_LS_Switch[1]) ? ema(McG_Source, McG_length) : McG_LS_Switch[1] + (McG_Source - McG_LS_Switch[1]) / (McG_length * pow(McG_Source/McG_LS_Switch[1], 4)) // Confirmation indicator Spacer4 = input(false, title="=== Confirmation indicator ===") C1_Act = input(false, title=" Confirmation indicator Activation") C1_src = input(ohlc4, title="Source") C1_len = input(5,title="Length") C1 = sma(C1_src,C1_len) // Entry indicator : Hull Moving Average Spacer5 = input(false, title="=== Entry indicator configuration ===") src = input(ohlc4, title="Source") length = input(50,title="Length HMA") HMA = ema(wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length))),1) //VARIABLES MANAGEMENT TriggerPrice = 0.0, TriggerPrice := TriggerPrice[1] TriggerxATR = 0.0, TriggerxATR := TriggerxATR[1] SLPrice = 0.0, SLPrice := SLPrice[1], TPPrice = 0.0, TPPrice := TPPrice[1] isLong = false, isLong := isLong[1], isShort = false, isShort := isShort[1] //LOGIC GoLong = crossover(HMA[0],HMA[1]) and strategy.position_size == 0.0 and (McG_LS_Switch/McG_LS_Switch[1] > 1) and (not C1_Act or C1>C1[1]) GoShort = crossunder(HMA[0],HMA[1]) and strategy.position_size == 0.0 and (McG_LS_Switch/McG_LS_Switch[1] < 1) and (not C1_Act or C1<C1[1]) //FRAMEWORK //Long if GoLong and not GoLong[1] isLong := true, TriggerPrice := close TPPrice := TriggerPrice * (1 + (SL * RRR)) SLPrice := TriggerPrice * (1-SL) Entry_Contracts = strategy.equity * Risk / ((TriggerPrice-SLPrice)/TriggerPrice) / TriggerPrice //Het aantal contracts moet meegegeven worden. => budget * risk / %afstand tot SL / prijs = aantal contracts strategy.entry("Long", strategy.long, comment=tostring(round(TriggerxATR/TriggerPrice*1000)), qty=Entry_Contracts) strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice, qty_percent = 100) if isLong and crossunder(HMA[0],HMA[1]) strategy.close_all(comment="TrendChange") isLong := false //Short if GoShort and not GoShort[1] isShort := true, TriggerPrice := close TPPrice := TriggerPrice * (1 - (SL * RRR)) SLPrice := TriggerPrice * (1 + SL) Entry_Contracts = strategy.equity * Risk / ((SLPrice-TriggerPrice)/TriggerPrice) / TriggerPrice //Het aantal contracts moet meegegeven worden. => budget * risk / %afstand tot SL / prijs = aantal contracts strategy.entry("Short", strategy.short, comment=tostring(round(TriggerxATR/TriggerPrice*1000)), qty=Entry_Contracts) strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice)//, qty_percent = 100) if isShort and crossover(HMA[0],HMA[1]) strategy.close_all(comment="TrendChange") isShort := false //VISUALISATION plot(McG_LS_Switch,color=color.blue,title="Baseline") plot(C1_Act?C1:na,color=color.white,title="confirmation Indicator") plot(HMA, color=(HMA[0]>HMA[1]? color.green : color.red), linewidth=4, transp=40, title="Entry Indicator") plot(isLong or isShort ? TPPrice : na, title="TakeProfit", color=color.green, style=plot.style_linebr) plot(isLong or isShort ? SLPrice : na, title="StopLoss", color=color.red, style=plot.style_linebr) bgcolor(isLong[1] and cross(low,SLPrice) and low[1] > SLPrice ? color.yellow : na, transp=75, title="SL Long") bgcolor(isShort[1] and cross(high,SLPrice) and high[1] < SLPrice ? color.yellow : na, transp=75, title="SL Short")