Purata Bergerak Berganda Dengan Strategi Pecahkan Momentum

Penulis:ChaoZhang, Tarikh: 2024-02-06 14:39:22
Tag:

img

Ringkasan

Strategi ini menggunakan salib emas EMA 12 hari dan EMA 26 hari sebagai isyarat kemasukan. Untuk menapis pecah palsu, MACD digunakan untuk menilai trend pasaran dan RSI untuk tahap overbought / oversold. Penembusan harga di atas rintangan juga digunakan sebagai pengesahan.

Strategi ini menyediakan tiga kaedah stop loss pilihan: trailing stop loss, moving average stop dan moving average crossover stop.

Logika Strategi

  1. Isyarat kemasukan
    • Perbezaan antara EMA 12 hari dan EMA 26 hari
    • MACD positif dan garis MACD di atas garis isyarat
    • RSI dalam julat yang telah ditetapkan
  2. Pengesahan kemasukan
    • Pilihan: Penembusan harga di atas rintangan dinamik
  3. Hentikan Kerugian
    • Penghentian kerugian mengikut harga kemasukan dan peratusan yang ditetapkan terlebih dahulu
    • Penutupan di bawah SMA 7 hari
    • Perpindahan penurunan antara EMA 12 hari dan 26 hari
  4. Ambil Manfaat
    • Dua peringkat mengambil sasaran keuntungan, keluar kedudukan separa pada sasaran pertama dan semua pada kedua

Kelebihan

  1. Sistem MA menapis isyarat palsu, meningkatkan ketepatan kemasukan
  2. Pilihan stop loss berbilang untuk gaya peniaga yang berbeza
  3. Risiko kawalan hentian yang dinamik
  4. Ambil keuntungan dalam peringkat kunci dalam beberapa keuntungan

Risiko

  1. Lebih banyak isyarat palsu apabila pasaran berayun
  2. Penghentian belakang boleh ditembusi selepas berjalan kuat
  3. Gagal keluar tepat pada masanya pada pembalikan trend

Penyelesaian:

  1. Gunakan MACD untuk menilai trend sebenar
  2. Sesuaikan Peratusan Belakang
  3. Menggunakan kaedah berhenti lain atau menggabungkan berhenti

Peningkatan

  1. Mengoptimumkan parameter MA untuk prestasi terbaik
  2. Uji perhentian yang berbeza dan cari kaedah terbaik
  3. Sesuaikan mengambil tahap keuntungan untuk ganjaran yang lebih baik
  4. Tambah penapis dengan penunjuk lain
  5. Sesuaikan untuk produk dan jangka masa yang berbeza

Kesimpulan

Strategi ini menggunakan sistem MA untuk isyarat kemasukan, dengan penapis tambahan oleh MACD, RSI dan lain-lain. Kedua-dua berhenti dan sasaran keuntungan dioptimumkan untuk sepadan dengan gaya peniaga yang berbeza.


/*backtest
start: 2023-01-30 00:00:00
end: 2024-02-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/
// © AbdulRahimShama
//@version=5


strategy('12/26-IT strategy', overlay=true,initial_capital = 100000)



Show_Only_12_26_Crossover_Entry = input.bool(true, group = "Entry_Exit Criteria")
Show_12_26_Crossover_and_resistance_Entry = input.bool(false, group = "Entry_Exit Criteria")


Show_TSL_StopLoss = input.bool(true, group = "Entry_Exit Criteria")
Show_Crossdown_StopLoss = input.bool(true, group = "Entry_Exit Criteria")
Show_SMA7_StopLoss = input.bool(false, group = "Entry_Exit Criteria")



////////////////////////////////////////////////
////////////////TARGETS INPUT
////////////////////////////////////////////////

////////Target1

TargetPerc1 = input.float(title="Target (%)", minval=0,defval=5, group="Target-1") / 100
TargetPrice1 = strategy.position_avg_price * (1 + TargetPerc1)
Target1_exit_qty = input.int(50, group="Target-1",tooltip = "% qty to sell when Target1 is reached")



////////Target2

TargetPerc2 = input.float(title="Target (%)", minval=0,defval=10, group="Target-2") / 100
TargetPrice2 = strategy.position_avg_price * (1 + TargetPerc2)
Target2_exit_qty = input.int(100, group="Target-2",tooltip = "% qty to sell when Target2 is reached")



////////////////////////////////////////////////
////////////////TRAILING STOP LOSS
////////////////////////////////////////////////


TSLsource = input(low, title="TSL Source", group="Trailing StopLoss")

longTrailPerc = input.float(title='Trail Long Loss (%)', minval=0.0, step=0.1, defval=1, group="Trailing StopLoss") * 0.01

TrailStopPrice = 0.0

TrailStopPrice := if strategy.position_size > 0
    sPIVOT_highValue = TSLsource * (1 - longTrailPerc)
    math.max(sPIVOT_highValue, TrailStopPrice[1])
else
    0

TSL = close < TrailStopPrice
plot(series=strategy.position_size > 0 and Show_TSL_StopLoss ? TrailStopPrice : na, color=color.new(color.fuchsia, 0), style=plot.style_linebr, linewidth=2, title='Trailing StopLoss')




////////////////////////////////////////////////
////////////////Moving Averages
////////////////////////////////////////////////



EMA_12=ta.ema(close, 12)
EMA_26=ta.ema(close, 26)
EMA_21=ta.ema(close,21)

plot(EMA_12, title="EMA_12", color=color.rgb(0, 255, 0), offset=0, linewidth=1)
plot(EMA_26, title="EMA_26", color=color.rgb(0, 0, 255), offset=0, linewidth=1)
plot(Show_SMA7_StopLoss ? ta.sma(close,7) : na, title="SMA_7", color=color.rgb(255, 0, 0), offset=0, linewidth=1)



////////////////////////////////////////////////
////////////////RESISTANCE INPUT and PLOTTING
////////////////////////////////////////////////

CrossOverLookbackCandles = input.int(10, group= "RESISTANCE")

resistanceSRC = input(high, group= "RESISTANCE")
resistanceLEFT = input(10, group= "RESISTANCE")
resistanceRIGHT = input(10, group= "RESISTANCE")

hih = ta.pivothigh(resistanceSRC, resistanceLEFT, resistanceRIGHT)
top = ta.valuewhen(hih, resistanceSRC[resistanceRIGHT], 0)

res = plot(top, color=top != top[1] ? na : color.new(#00ff00, 50), offset=-resistanceLEFT, linewidth=2, title="Resistance Line")

EMA_12_Low = ta.lowest(EMA_12, CrossOverLookbackCandles)
EMA_26_Low = ta.lowest(EMA_26, CrossOverLookbackCandles)


////////////////////////////////////////////////
////////////////RSI INPUT and PLOTTING
////////////////////////////////////////////////
RSI = ta.rsi(close, 14)
RSILowerRange = input.int(50, tooltip = "RSI value should be ABOVE this value for entry", group = "RSI")
RSIUpperRange = input.int(70, tooltip = "RSI value should be BELOW this value for entry", group = "RSI")



////////////////////////////////////////////////
////////////////MACD
////////////////////////////////////////////////
fast_length = 12
slow_length = 26
MACD_src = close
signal_length = 9

fast_ma = ta.ema(MACD_src, fast_length)
slow_ma = ta.ema(MACD_src, slow_length)
macd = fast_ma - slow_ma
signal = ta.ema(macd, signal_length)
hist = macd - signal



////////////////////////////////////////////////
////////////////ENTRY CRITERIA
////////////////////////////////////////////////


BUYVALUE= input(100000, tooltip = "Buy qty displayed on chart will be based on this value")

BASEENTRY = macd > signal and RSI > RSILowerRange and RSI < RSIUpperRange and close > EMA_21 and close > ta.sma(close, 7)


Entry= ta.crossover(EMA_12, EMA_26) and BASEENTRY
Entry2 = ta.crossover(close, top) and EMA_12_Low < EMA_26_Low and EMA_12 > EMA_26 and RSI < 70

////////////////////////////////////////////////
////////////////BUY SELL STRATEGY
////////////////////////////////////////////////

if ((Entry and Show_Only_12_26_Crossover_Entry))
    strategy.entry("buy", strategy.long, qty=BUYVALUE/close)

if (Entry2 and Show_12_26_Crossover_and_resistance_Entry)
    strategy.entry("buy", strategy.long, qty=BUYVALUE/close)

strategy.exit("Tg1", "buy", limit=TargetPrice1, qty_percent = Target1_exit_qty)
strategy.exit("Tg2", "buy", limit=TargetPrice2, qty_percent = Target2_exit_qty)



if TSL and Show_TSL_StopLoss and close < EMA_12 
    strategy.close_all ("sl")

if ta.crossunder(EMA_12, EMA_26) and Show_Crossdown_StopLoss
    strategy.close_all ("sl")

if ta.crossunder(close, ta.sma(close, 7)) and Show_SMA7_StopLoss
    strategy.close_all ("sl")




Lebih lanjut