この戦略は,EMAとSMAクロスオーバーと組み合わせてトレンド方向を決定するためにMACDを使用する.MACDヒストグラムが信号線上を横切ってトレンドが上昇するときにエントリーシグナルが表示されます.ストップロスは浮動ATRトレーリングストップの下の価格レベルに設定されます.戦略はまた,利益を得るために部分的に退出し,より大きな価格急上昇で退出し,ストップロスがヒットするまでトレーリングストップでいくつかのポジションを保持します.
低速EMAが低速EMAを超越すると,短期トレンドが長期トレンドより優れていることを示し,購入をシグナル化する.一方,低速EMAを超越するSMAは短期的には上向きの勢いを強めることを示唆する.したがって,EMA&SMAクロスオーバーに基づくMACD線を超越と上昇トレンドの組み合わせは,より強いエントリーシグナルを識別するのに役立ちます.
ATRはストップ損失レベルを計算するために使用されます. ATRは価格変動範囲を効果的に測定できます.価格がこの範囲を下回ると,ストップ損失が誘発されます. ATR期間は調整できます - 短い期間により正確なストップを可能にしますが,ストップアウトが簡単になります. 長い期間により広いストップがより強力になります. ストップレベルは価格の上昇も追跡し,トレンドフォロー効果を達成します.
利益を得るために小価格上昇に部分的に退出する.利益をロックするために大きな価格急上昇により多く退出する.ストップ損失がヒットするまでトレーリングストップでいくつかのポジションを維持する.これは利益をロックするのに役立ちます.それでも一定の期間ポジションを維持することができます.
MACD と トレンド インディケーターからの誤った信号のリスク. パラメータを調整するか,他のインディケーターを追加する.
ATRのストップ損失が発生するリスク. ATR期間またはストップ損失倍数を増やすことができます.
後ろのポジションが閉じ込められるリスク 後ろのポジションのサイズを減らして 時間の損失を削減します
より良いトレンド判断のためにMACDパラメータを最適化
より良いストップ損失レベルのためにATR期間を最適化
エクシート比率とポジションサイズを最適化して,閉じ込められたリスクを減らす
ストップ・ロスを改善するために,移動する取利益または波動性インデックスを追加することを検討します
この戦略は,トレンドとエントリータイムを正確に決定するためにMACD,EMA/SMAおよび他の指標を組み合わせます.浮動ATRストップロスはトレンドに従う間に利益をロックするのに役立ちます.出口は利益を得るために,利益を確保し,ポジションを持続的に保持するために段階的に設定されています.全体的には,良好な結果で安定しています.しかし,パラメータと出口はより良いリターンのためにさらに最適化することができます.
/*backtest start: 2022-10-30 00:00:00 end: 2023-11-05 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Deobald //@version=4 strategy("MACD Strategy", overlay=true) // FUNCTIONS Ema(src,p) => ema = 0. sf = 2/(p+1) ema := nz(ema[1] + sf*(src - ema[1]),src) Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0) Atr(p) => atr = 0. Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1]))) atr := nz(atr[1] + (Tr - atr[1])/p,Tr) /// TREND ribbon_period = input(34, "Period", step=1) leadLine1 = ema(close, ribbon_period) leadLine2 = sma(close, ribbon_period) p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) // MACD fast_length = input(title="Fast Length", type=input.integer, defval=3) slow_length = input(title="Slow Length", type=input.integer, defval=5) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2) sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false) sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true) // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length) slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length) hist = macd - signal //plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) // plot(macd, title="MACD", color=col_macd, transp=0) // plot(signal, title="Signal", color=col_signal, transp=0) // TAKE PROFIT AND STOP LOSS long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100 long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1) long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100 long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1) long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) // Stop Loss multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1) ATR_period=input(17,"ATR period", minval=1, step=1) // Strategy entry_long=crossover(macd,signal) and leadLine2 < leadLine1 entry_price_long=valuewhen(entry_long,close,0) SL_floating_long = entry_price_long - multiplier*Atr(ATR_period) exit_long= close < SL_floating_long ///// BACKTEST PERIOD /////// testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(2020, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod() => true if testPeriod() strategy.entry("long", strategy.long, comment="Long", when=entry_long) strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick) strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick) strategy.close_all("long", when=exit_long, comment="exit long" ) // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit") plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit") plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")