Momentum Breakout Strategi

Penulis:ChaoZhang, Tanggal: 2023-12-13 17:08:53
Tag:

img

Gambaran umum

Strategi ini menggabungkan rata-rata bergerak, indikator Laguerre RSI dan indikator ADX untuk menerapkan perdagangan breakout. Strategi ini panjang ketika rata-rata bergerak cepat melintasi di atas rata-rata bergerak lambat, Laguerre RSI lebih besar dari 80, dan ADX lebih besar dari 20; pendek ketika rata-rata bergerak cepat melintasi di bawah rata-rata bergerak lambat, Laguerre RSI kurang dari 20, dan ADX lebih besar dari 20.

Prinsip

Strategi ini terutama menggunakan indikator berikut untuk menentukan tren dan waktu masuk:

  1. Kombinasi rata-rata bergerak: EMA 16 hari, EMA 48 hari, SMA 200 hari. Tren naik ditentukan ketika rata-rata jangka pendek melintasi di atas rata-rata jangka panjang, dan tren menurun ketika melintasi di bawah.

  2. Indikator RSI Laguerre untuk menentukan zona overbought dan oversold. RSI lebih dari 80 adalah sinyal panjang, dan kurang dari 20 adalah sinyal pendek.

  3. Indikator ADX untuk menentukan status tren. ADX lebih besar dari 20 menunjukkan tren, cocok untuk perdagangan breakout.

Sinyal masuk ditentukan oleh arah kombinasi rata-rata bergerak, waktu masuk oleh Laguerre RSI, dan pasar non-trending disaring oleh ADX. Sinyal keluar dihasilkan ketika rata-rata bergerak menyeberang kembali. Kerangka penilaian strategi secara keseluruhan cukup masuk akal, dengan indikator yang berbeda bekerja sama untuk menentukan entri dan keluar panjang / pendek.

Kekuatan

Keuntungan dari strategi ini meliputi:

  1. Menangkap momentum tren: Strategi hanya memasuki pasar pada awal perkembangan tren, menangkap keuntungan eksponensial dari tren.

  2. Kerugian terbatas: Stop loss diatur dengan tepat membatasi kerugian dari perdagangan individu. Bahkan kehilangan perdagangan memiliki kesempatan untuk menghasilkan keuntungan.

  3. Indikator gabungan yang akurat: Rata-rata bergerak, Laguerre RSI dan ADX dapat secara relatif akurat menentukan arah pasar dan waktu masuk.

  4. Pelaksanaan sederhana: Strategi hanya menggunakan 3 indikator dan mudah dipahami dan diterapkan.

Risiko

Ada juga beberapa risiko untuk strategi:

  1. Risiko pembalikan tren: Sebagai strategi yang mengikuti tren, kerugian besar dapat terjadi jika pembalikan tren tidak terdeteksi tepat waktu.

  2. Risiko penarikan: Di pasar yang bervariasi, stop dapat terjadi yang mengarah pada penarikan akun.

  3. Risiko optimasi parameter: Parameter indikator perlu disesuaikan untuk pasar yang berbeda untuk menghindari kegagalan.

Pengendalian:

  1. Stop loss yang ketat untuk membatasi jumlah kerugian perdagangan tunggal.

  2. Mengoptimalkan parameter indikator dan ambang batas.

  3. Menggunakan hedging berjangka dll untuk mengelola drawdown.

Arahan Optimasi

Beberapa cara untuk mengoptimalkan strategi meliputi:

  1. Optimasi parameter: Uji kombinasi periode rata-rata bergerak, parameter Laguerre RSI, parameter ADX untuk menemukan pengaturan yang optimal.

  2. Optimasi Breakout: Uji ambang batas rata-rata bergerak yang berbeda untuk menyeimbangkan frekuensi perdagangan dan profitabilitas.

  3. Optimasi entri: Uji indikator lain dikombinasikan dengan Laguerre RSI untuk waktu entri yang lebih akurat.

  4. Optimasi keluar: Penelitian sinyal keluar lainnya dalam kombinasi dengan rata-rata bergerak.

  5. Mengambil keuntungan vs. pengoptimalan stop loss: Uji strategi yang berbeda untuk mengoptimalkan pengembalian.

Ringkasan

Secara singkat, strategi ini secara efektif menangkap pergerakan tren dengan menggunakan kombinasi moving average, Laguerre RSI dan ADX untuk menentukan entri dan keluar. Dengan memasuki awal perkembangan tren dan mengikuti tren secara dekat, keuntungan eksponensial dapat dibuat, sementara stop loss membantu membatasi kerugian. Strategi ini cocok bagi investor yang nyaman membuat penilaian pasar, serta mereka yang melakukan perdagangan otomatis setelah optimasi parameter. Secara keseluruhan strategi ini memiliki utilitas praktis yang kuat.


/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-12 00:00:00
period: 1m
basePeriod: 1m
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/
// © PtGambler

//@version=5
strategy("3MA + Laguerre RSI + ADX [Pt]", shorttitle = "3MA+LaRSI+ADX[Pt]", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500)


// ********************************** Trade Period / Strategy Setting **************************************
startY = input(title='Start Year', defval=2011, group = "Backtesting window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window")
finishY = input(title='Finish Year', defval=2050, group = "Backtesting window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)
use_entry_sess = input.bool(false, 'Use Entry Session Window', group = "Trading Session")
t1_session = input("0930-1555:23456", "Entry Session", group="Trading Session", tooltip = "Entry Signal only generated within this period.") 
t1 = time(timeframe.period, t1_session)
window = true

margin_req = input.float(1, title="Margin Requirement / Leverage", step=0.1, group = "Trading Options")
qty_per_trade = input.float(100, title = "% of initial capital per trade", group = "Trading Options")
reinvest = input.bool(defval=false,title="Reinvest profit", group = "Trading Options")
reinvest_percent = input.float(defval=100, title = "Reinvest percentage", group="Trading Options")

close_eod = input.bool(false, "All trades will close at the close of trading window", group = "Trading Options")
close_b4_open = input.bool(false, "Position must hit either SL/PT before entering new trade", group = "Trading Options")

profit = strategy.netprofit 
strategy.initial_capital = 50000
float trade_amount = math.floor(strategy.initial_capital*margin_req / close) 

if strategy.netprofit > 0 and reinvest
    trade_amount := math.floor((strategy.initial_capital* (qty_per_trade/100)+(profit*reinvest_percent*0.01))*margin_req/ close) 
else
    trade_amount := math.floor(strategy.initial_capital* (qty_per_trade/100)*margin_req / close)  

// ******************************************************************************************

group_ma = "Moving Average Ribbon"
group_larsi = "Laguerre RSI"
group_adx = "ADX"
group_SL = "Stop Loss / Profit Target"

// ----------------------------------------- MA Ribbon -------------------------------------

ema1_len = input.int(16, "Fast EMA Length", group = group_ma)
ema2_len = input.int(48, "Slow EMA Length ", group = group_ma)
sma1_len = input.int(200, "Slow SMA Length", group = group_ma)

ema1 = ta.ema(close, ema1_len)
ema2 = ta.ema(close, ema2_len)
sma1 = ta.sma(close, sma1_len)

plot(ema1, "EMA 1", color.white, linewidth = 2)
plot(ema2, "EMA 2", color.yellow, linewidth = 2)
plot(sma1, "SMA 1", color.purple, linewidth = 2)

ma_bull = ema1 > ema2 and ema2 > sma1   
ma_bear = ema1 < ema2 and ema2 < sma1

// ------------------------------------------ Laguerre RSI ---------------------------------------

alpha = input.float(0.2, title='Alpha', minval=0, maxval=1, step=0.1, group = group_larsi)

gamma = 1 - alpha
L0 = 0.0
L0 := (1 - gamma) * close + gamma * nz(L0[1])
L1 = 0.0
L1 := -gamma * L0 + nz(L0[1]) + gamma * nz(L1[1])

L2 = 0.0
L2 := -gamma * L1 + nz(L1[1]) + gamma * nz(L2[1])

L3 = 0.0
L3 := -gamma * L2 + nz(L2[1]) + gamma * nz(L3[1])

cu = (L0 > L1 ? L0 - L1 : 0) + (L1 > L2 ? L1 - L2 : 0) + (L2 > L3 ? L2 - L3 : 0)

cd = (L0 < L1 ? L1 - L0 : 0) + (L1 < L2 ? L2 - L1 : 0) + (L2 < L3 ? L3 - L2 : 0)

temp = cu + cd == 0 ? -1 : cu + cd
LaRSI = temp == -1 ? 0 : cu / temp
LaRSI := LaRSI * 100

bull_LaRSI = LaRSI > 80
bear_LaRSI = LaRSI < 20

// --------------------------------------- ADX  ------------------------

adxlen = input(14, title="ADX Smoothing", group = group_adx)
dilen = input(14, title="DI Length", group = group_adx)
dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)

active_adx = sig > 20 //and sig > sig[1]

// ******************************* Profit Target / Stop Loss *********************************************

use_SLPT = input.bool(false, 'Use Fixed SL / PT', group = group_SL)
SL = input.float(50, 'Stop loss in ticks', step = 1, group = group_SL) * syminfo.mintick
PT = input.float(100, "Profit target in ticks", step = 1, group = group_SL) * syminfo.mintick

var L_PT = 0.0
var S_PT = 0.0
var L_SL = 0.0
var S_SL = 0.0

if strategy.position_size > 0
    L_SL := L_SL[1]
    L_PT := L_PT[1]
else if strategy.position_size < 0
    S_SL := S_SL[1]
    S_PT := S_PT[1]
else
    L_SL := close - SL
    L_PT := close + PT
    S_SL := close + SL
    S_PT := close - PT

entry_line = plot(use_SLPT and strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr)

L_PT_line = plot(use_SLPT and strategy.position_size > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr)
S_PT_line = plot(use_SLPT and strategy.position_size < 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr)

L_SL_line = plot(use_SLPT and strategy.position_size > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(use_SLPT and strategy.position_size < 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr)

fill(L_PT_line, entry_line, color = color.new(color.green,90))
fill(S_PT_line, entry_line, color = color.new(color.green,90))
fill(L_SL_line, entry_line, color = color.new(color.red,90))
fill(S_SL_line, entry_line, color = color.new(color.red,90))


// ---------------------------------- Strategy setup ------------------------------------------------------

L_entry1 = ma_bull and bull_LaRSI and active_adx
S_entry1 = ma_bear and bear_LaRSI and active_adx

L_exit1 = ta.crossunder(ema1, ema2)
S_exit1 = ta.crossover(ema1, ema2)

// Trigger zones
bgcolor(ma_bull ? color.new(color.green ,90) : na)
bgcolor(ma_bear ? color.new(color.red,90) : na)

if L_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true)
    strategy.entry("Long", strategy.long, trade_amount)

if S_entry1 and (use_entry_sess ? window : true) and (close_b4_open ? strategy.position_size == 0 : true)
    strategy.entry("Short", strategy.short, trade_amount)

if use_SLPT
    strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit")
    strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit")
else
    if L_exit1
        strategy.close("Long", comment = "Exit Long")

    if S_exit1
        strategy.close("Short", comment = "Exit Short")

if use_entry_sess and not window and close_eod
    strategy.close_all(comment = "EOD close")


Lebih banyak