Strategi Pembebasan Momentum

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

img

Ringkasan

Strategi ini menggabungkan purata bergerak, penunjuk Laguerre RSI dan penunjuk ADX untuk melaksanakan perdagangan pecah. Ia pergi lama apabila purata bergerak pantas melintasi di atas purata bergerak perlahan, Laguerre RSI lebih besar daripada 80, dan ADX lebih besar daripada 20; ia pergi pendek apabila purata bergerak pantas melintasi di bawah purata bergerak perlahan, Laguerre RSI kurang daripada 20, dan ADX lebih besar daripada 20. Strategi ini menangkap ciri momentum pasaran dan memasuki pasaran pada awal perkembangan trend.

Prinsip

Strategi ini terutamanya menggunakan penunjuk berikut untuk menentukan trend dan masa kemasukan:

  1. Gabungan purata bergerak: EMA 16 hari, EMA 48 hari, SMA 200 hari. Trend menaik ditentukan apabila purata jangka pendek melintasi di atas purata jangka panjang, dan trend menurun apabila melintasi di bawah.

  2. Laguerre RSI indikator untuk menentukan zon overbought dan oversold. RSI lebih daripada 80 adalah isyarat panjang, dan kurang daripada 20 isyarat pendek.

  3. Indikator ADX untuk menentukan status trend. ADX lebih besar daripada 20 menunjukkan trend, sesuai untuk perdagangan pecah.

Isyarat kemasukan ditentukan oleh arah gabungan purata bergerak, masa kemasukan oleh Laguerre RSI, dan pasaran bukan trend disaring oleh ADX. Isyarat keluar dihasilkan apabila purata bergerak menyeberang kembali. Kerangka penilaian strategi keseluruhan agak munasabah, dengan penunjuk yang berbeza bekerjasama untuk menentukan entri dan keluar panjang / pendek.

Kelebihan

Kelebihan strategi ini termasuk:

  1. Menangkap momentum trend: Strategi hanya memasuki pasaran pada permulaan perkembangan trend, menangkap keuntungan eksponensial dari trend.

  2. Kerugian terhad: Hentikan kerugian yang ditetapkan dengan betul mengehadkan kerugian dari perdagangan individu.

  3. Penunjuk gabungan yang tepat: Purata bergerak, Laguerre RSI dan ADX dapat menentukan arah pasaran dan masa kemasukan dengan agak tepat.

  4. Pelaksanaan mudah: Strategi hanya menggunakan 3 penunjuk dan mudah difahami dan dilaksanakan.

Risiko

Terdapat juga beberapa risiko untuk strategi:

  1. Risiko pembalikan trend: Sebagai strategi trend, kerugian besar boleh berlaku jika pembalikan trend tidak dikesan tepat pada masanya.

  2. Risiko penarikan: Dalam pasaran yang berbeza, berhenti boleh dipukul yang membawa kepada penarikan akaun.

  3. Risiko pengoptimuman parameter: Parameter penunjuk perlu diselaraskan untuk pasaran yang berbeza untuk mengelakkan kegagalan.

Tindakan balas:

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

  2. Mengoptimumkan parameter penunjuk dan ambang pecah.

  3. Menggunakan lindung nilai niaga hadapan dan lain-lain untuk menguruskan pengeluaran.

Arahan pengoptimuman

Beberapa cara untuk mengoptimumkan strategi termasuk:

  1. Pengoptimuman parameter: Uji kombinasi tempoh purata bergerak, parameter Laguerre RSI, parameter ADX untuk mencari tetapan yang optimum.

  2. Pengoptimuman pecah: Uji ambang penembusan purata bergerak yang berbeza untuk mengimbangi kekerapan perdagangan dan keuntungan.

  3. Pengoptimuman kemasukan: Uji penunjuk lain digabungkan dengan Laguerre RSI untuk masa kemasukan yang lebih tepat.

  4. Pengoptimuman Keluar: Penyelidikan isyarat keluar lain dalam kombinasi dengan purata bergerak.

  5. Mengambil keuntungan berbanding pengoptimuman stop loss: Uji strategi yang berbeza untuk mengoptimumkan pulangan.

Ringkasan

Ringkasnya, strategi ini berkesan menangkap pergerakan trend dengan menggunakan gabungan purata bergerak, Laguerre RSI dan ADX untuk menentukan kemasukan dan keluar. Dengan memasuki awal perkembangan trend dan mengikuti dengan teliti aliran trend, keuntungan eksponensial dapat dibuat, sementara kerugian berhenti membantu mengehadkan kerugian. Strategi ini sesuai untuk pelabur yang selesa membuat penilaian pasaran, serta mereka yang melakukan perdagangan automatik selepas pengoptimuman parameter. Secara keseluruhan strategi ini mempunyai utiliti praktikal 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 lanjut