移動平均レンジスグロウリング戦略は,移動平均値に基づいたトレンドフォロー戦略である. 移動平均値間のクロスオーバーを計算して価格トレンドを決定し,利益のためのトレンドを追跡するためにレンジ管理を使用する.
この戦略は,2つの移動平均値を使用する.高速線とスローライン.高速線はパラメータが小さく,価格変化により敏感である.スローラインはパラメータが大きく,傾向をより信頼的に決定する.高速線がスローラインを越えると長くなって,高速線がスローラインを下回ると短くなります.
また,不一致を避けるために主要なトレンド方向を判断するための複数の補助移動平均値を導入している.また,ATRとともに最高値と最低値関数を使用して,収益をロックするために動的ストップ損失を計算する.
戦略では,各取引に対して,定額のオーダーを出すか,パラメータに設定された最大損失パーセントに基づいてポジションサイズを動的に計算するかを選択できます.後者は,各取引のリスクを一定の範囲内にとどめます.
これらのリスクは,MAパラメータを最適化し,補助MAの重量調整,ストップ損失範囲の変更などによって軽減できる.さらに,厳格なポジションサイズ化規則は,単一の取引損失による損害を最小限に抑える.
戦略は以下の側面で最適化できます.
総合的に見ると,移動平均レンジスグロウリング戦略は非常に実践的な定量的な取引戦略である.長期保有に適したトレンドフォローとリスク制御の両方を組み合わせている.パラメータと機能の最適化により,戦略は持続的な収益性のためにより堅牢で知的なものにすることができます.
/*backtest start: 2024-01-10 00:00:00 end: 2024-01-17 00:00:00 period: 45m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // This is a simple crossover Moving Average strategy, good for long term crypto trades. // It buys when the MA "X" crosses up the MA "Y", viceversa for shorts. // Both MAs are selectable from the Inputs section in the front panel. // There is also a Position Management option thats // sizes positions to have the same USD risk (using leverage) on each trade, // based on the percentage distance to the stop loss level. // If you turn this option on you will see how the profit // grows exponentially while the drawdown percentage almost remains the same. strategy("4 MA Strat", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_value = 0.04, initial_capital=100, process_orders_on_close=false) direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) //Inputs PSMGMT=input(defval=false, title="Position Management") risk_per_trade=input(defval=5, title="Risk Per Trade % (for PSMGMT)", step=0.5)*.01 //SL & TP Inputs i_SL=input(true, title="Use Swing Lo/Hi Stop Loss & Take Profit") i_SwingLookback=input(10, title="Swing Lo/Hi Lookback") i_SLExpander=input(defval=0, step=1, title="SL Expander") i_MAFilter=input(false, title="Use MA4 as Bull / Bear filter") //MA Type Selector MAtype = input(false, title="----------------MA Selector-----------------") MA1Period = input(9, title="MA1 Period") MA1Type = input(title="MA1 Type", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"]) MA2Period = input(21, title="MA2 Period") MA2Type = input(title="MA2 Type", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"]) MA3Period = input(50, title="MA3 Period") MA3Type = input(title="MA3 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"]) MA4Period = input(100, title="MA4 Period") MA4Type = input(title="MA4 Type", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "HMA", "ALMA"]) //MA Selector MA1 = if MA1Type == "SMA" sma(close, MA1Period) else if MA1Type == "EMA" ema(close, MA1Period) else if MA1Type == "WMA" wma(close, MA1Period) else if MA1Type == "RMA" rma(close, MA1Period) else if MA1Type == "HMA" hma(close, MA1Period) else if MA1Type == "ALMA" alma(close, MA1Period, 0.85, 6) MA2 = if MA2Type == "SMA" sma(close, MA2Period) else if MA2Type == "EMA" ema(close, MA2Period) else if MA2Type == "WMA" wma(close, MA2Period) else if MA2Type == "RMA" rma(close, MA2Period) else if MA2Type == "HMA" hma(close, MA2Period) else if MA2Type == "ALMA" alma(close, MA2Period, 0.85, 6) MA3 = if MA3Type == "SMA" sma(close, MA3Period) else if MA3Type == "EMA" ema(close, MA3Period) else if MA3Type == "WMA" wma(close, MA3Period) else if MA3Type == "RMA" rma(close, MA3Period) else if MA3Type == "HMA" hma(close, MA3Period) else if MA3Type == "ALMA" alma(close, MA3Period, 0.85, 6) MA4 = if MA4Type == "SMA" sma(close, MA4Period) else if MA4Type == "EMA" ema(close, MA4Period) else if MA4Type == "WMA" wma(close, MA4Period) else if MA4Type == "RMA" rma(close, MA4Period) else if MA4Type == "HMA" hma(close, MA4Period) else if MA4Type == "ALMA" alma(close, MA4Period, 0.85, 6) // X Y Logic x=input(title="x", defval="close", options=["MA1", "MA2", "MA3", "MA4", "close"]) y=input(title="y", defval="MA1", options=["MA1", "MA2", "MA3", "MA4", "close"]) X = if x == "MA1" MA1 else if x == "MA2" MA2 else if x == "MA3" MA3 else if x == "MA4" MA4 else if x == "close" close Y = if y == "MA1" MA1 else if y == "MA2" MA2 else if y == "MA3" MA3 else if y == "MA4" MA4 else if y == "close" close //SL & TP Calculations SwingLow=lowest(i_SwingLookback) SwingHigh=highest(i_SwingLookback) bought=strategy.position_size != strategy.position_size[1] LSL=valuewhen(bought, SwingLow, 0)-((valuewhen(bought, atr(14), 0)/5)*i_SLExpander) SSL=valuewhen(bought, SwingHigh, 0)+((valuewhen(bought, atr(14), 0)/5)*i_SLExpander) islong=strategy.position_size > 0 isshort=strategy.position_size < 0 SL= islong ? LSL : isshort ? SSL : na //Position Management Calculations capital=strategy.equity distance_to_long_stop_loss=1-(LSL/strategy.position_avg_price) distance_to_short_stop_loss=(SSL/strategy.position_avg_price)-1 PS=(capital*risk_per_trade)/distance_to_long_stop_loss SPS=(capital*risk_per_trade)/distance_to_short_stop_loss PSqty=PS/close SPSqty=SPS/close //Strategy Calculations MAFilter=close > MA4 BUY = crossover(X , Y) SELL = crossunder(X , Y) BUY2 = crossover(X , Y) and MAFilter SELL2 = crossunder(X , Y) and not MAFilter //Entries strategy.entry("long", true, qty=PSMGMT ? PSqty : na, when=not i_MAFilter ? BUY : BUY2) strategy.entry("short", false, qty=PSMGMT ? SPSqty : na, when=not i_MAFilter ? SELL : SELL2) //Exits if i_SL //and SL != na strategy.exit("longexit", "long", stop=LSL) strategy.exit("shortexit", "short", stop=SSL) if i_MAFilter strategy.close("long", when=SELL) strategy.close("short", when=BUY) //Plots plot(i_SL ? SL : na, color=color.red, style=plot.style_cross, title="SL") plot(MA1, color=color.green, linewidth=1, title="MA1") plot(MA2, color=color.yellow, linewidth=2, title="MA2") plot(MA3, color=color.red, linewidth=3, title="MA3") plot(MA4, color=color.white, linewidth=3, title="MA4") plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup") plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup") //Debugging Plots plot(LSL, transp=100, title="SwingLow") plot(bought ? 1:0, transp=100, title="bought") plot(PSqty, title="PSqty", transp=100) plot(SPSqty, title="SPSqty", transp=100) plot(PS, title="PS", transp=100) plot(SPS, title="SPS", transp=100) plot(distance_to_long_stop_loss, title="distance to LSL", transp=100) plot(distance_to_short_stop_loss, title="distance to SSL", transp=100) plot(capital, title="equity", transp=100)