Strategi Breakout Momentum Gabungan


Tanggal Pembuatan: 2023-12-13 17:08:53 Akhirnya memodifikasi: 2023-12-13 17:08:53
menyalin: 6 Jumlah klik: 599
1
fokus pada
1621
Pengikut

Strategi Breakout Momentum Gabungan

Ringkasan

Strategi ini melakukan perdagangan terobosan dengan menggunakan kombinasi dari Moving Average, Laguerre RSI, dan ADX. Strategi ini melakukan perdagangan terobosan dengan menggunakan Moving Average, Laguerre RSI, dan ADX. Strategi ini menangkap karakteristik kuantitatif pasar yang bergerak dan memasuki pasar pada tahap awal perkembangan tren.

Prinsip

Strategi ini didasarkan pada indikator-indikator berikut untuk menilai tren dan waktu masuk ke pasar:

  1. Kombinasi Moving Average: 16 hari EMA, 48 hari EMA, 200 hari SMA. Ketika rata-rata jangka pendek di atas rata-rata jangka panjang, itu dianggap sebagai pasar overhead, dan ketika di bawah, itu dianggap sebagai pasar kosong.

  2. Laguerre RSI mengidentifikasi zona overbought dan oversold. RSI lebih besar dari 80 adalah sinyal overhead dan lebih kecil dari 20 adalah sinyal overhead.

  3. Indikator ADX menilai status tren. ADX lebih besar dari 20 menunjukkan status tren, cocok untuk perdagangan terobosan.

Sinyal masuk adalah kombinasi dari moving average untuk menentukan arah tren, Laguerre RSI untuk menentukan waktu masuk, ADX Filter untuk pasar non-trend. Sinyal keluar adalah pergeseran dari moving average. Seluruh kerangka penilaian strategi relatif rasional, masing-masing indikator saling bekerja sama untuk menentukan polygon dan masuk dan keluar dari pasar.

Keunggulan

Strategi ini memiliki keuntungan sebagai berikut:

  1. Menangkap momentum tren: Strategi ini hanya masuk ketika tren mulai berkembang, dan dapat menangkap keuntungan indeks di pasar berikutnya.

  2. Pembatasan kerugian: dengan pengaturan stop loss yang tepat, Anda dapat mengendalikan kerugian per unit dalam kisaran tertentu. Bahkan jika Anda mengalami penjara, ada peluang untuk mendapatkan keuntungan.

  3. Indikator portofolio menilai dengan akurat: Moving Average, Laguerre RSI dan ADX Indikator dapat menilai pasar dengan lebih akurat mengenai ketersediaan dan waktu masuk.

  4. Implementasi yang sederhana: Strategi ini hanya menggunakan 3 indikator, sehingga implementasinya sederhana dan mudah dipelajari.

Risiko

Strategi ini juga memiliki beberapa risiko:

  1. Trend Reversal Risk: Strategi ini termasuk strategi trend tracking, dan jika tidak terdeteksi pada saat itu, maka akan terjadi kerugian besar.

  2. Risiko penarikan: Dalam situasi yang bergolak, stop loss dapat ditembus, yang menyebabkan penarikan ke akun.

  3. Risiko optimasi parameter: Parameter indikator perlu disesuaikan dengan pasar yang berbeda, jika tidak, akan terjadi kegagalan.

Tanggapan:

  1. Strict Stop Loss, Kontrol Kerugian Tunggal.

  2. Optimalkan parameter indikator, sesuaikan dengan jumlah terobosan.

  3. Pengelolaan penarikan menggunakan metode seperti hedging berjangka.

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Optimalisasi parameter terbaik: Uji siklus rata-rata bergerak, parameter Laguerre RSI, dan parameter ADX untuk menemukan kombinasi parameter optimal.

  2. Optimalisasi terobosan: menguji berbagai terobosan rata-rata bergerak untuk menemukan keseimbangan antara jumlah transaksi dan tingkat keuntungan.

  3. Optimalisasi kondisi masuk: Uji indikator lain yang dikombinasikan dengan indikator RSI Laguerre untuk mencari kondisi yang lebih akurat dalam menentukan waktu masuk.

  4. Pengoptimalan Kondisi Keluar: Mengkaji indikator lain yang dikombinasikan dengan Moving Average sebagai penilaian sinyal Keluar yang lebih akurat.

  5. Tujuan profit dan optimasi stop loss: menguji strategi stop loss yang berbeda untuk mengoptimalkan keuntungan akun.

Meringkaskan

Strategi ini memungkinkan untuk menangkap tren secara efektif dengan menggunakan tiga indikator penilaian Moving Average, Laguerre RSI dan ADX. Masuk tepat waktu ketika tren mulai berkembang, dan berjalan dengan tren untuk menangkap keuntungan indeks.

Kode Sumber Strategi
/*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")