This strategy combines moving averages and Hull curves to identify market trend direction and follow through on trends.
The main logic is:
McGinley Dynamic MA judges overall trend direction
Hull curve crossovers generate specific long/short signals
Optional confirmation indicators for signal verification
Risk management via stop loss and take profit principles
Close positions when Hull curve reverses
The strategy aims to mechanically systematize trend following, minimizing individual subjective influences.
MA judges overall direction, flexible confirmations
Hull clear long/short signals
Rules-based risk management minimizes errors
Parameter tuning and filters require optimization
Trend accuracy has uncertainties
Hull curve prone to lagging signals
This strategy seeks to systematize trend following operations to match market rhythm. But parameter optimization and indicator limitations warrant caution for stability.
/*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")