
Chiến lược này thực hiện giao dịch đột phá bằng cách kết hợp sử dụng đường trung bình di chuyển, chỉ số Laguerre RSI và chỉ số ADX. Khi đường trung bình di chuyển nhanh vượt qua đường trung bình di chuyển chậm, Laguerre RSI lớn hơn 80, ADX lớn hơn 20 thì nhiều hơn; khi đường trung bình di chuyển nhanh vượt qua đường trung bình di chuyển chậm, Laguerre RSI nhỏ hơn 20, ADX lớn hơn 20 thì trống.
Chiến lược này chủ yếu đánh giá xu hướng và thời gian ra thị trường bằng các chỉ số sau:
Hỗn hợp đường trung bình di chuyển: EMA 16 ngày, EMA 48 ngày, SMA 200 ngày. Khi trung bình ngắn hạn trên đường trung bình dài hạn, nó được coi là thị trường nhiều đầu, và khi đi xuống, nó được coi là thị trường trống.
Chỉ số Laguerre RSI đánh giá vùng quá mua quá bán. RSI lớn hơn 80 là tín hiệu đa đầu và nhỏ hơn 20 là tín hiệu trống đầu.
Chỉ số ADX đánh giá trạng thái xu hướng. ADX lớn hơn 20 cho thấy trạng thái xu hướng, phù hợp với giao dịch phá vỡ.
Tín hiệu đầu vào là sự kết hợp của đường trung bình di chuyển để xác định xu hướng, Laguerre RSI để xác định thời gian đầu vào, ADX lọc thị trường không theo xu hướng. Tín hiệu đầu ra là sự đảo ngược của đường trung bình di chuyển. Toàn bộ khung phán đoán chiến lược là hợp lý hơn, các chỉ số phối hợp với nhau để xác định nhiều lỗ hổng và đầu vào và ra khỏi thị trường.
Chiến lược này có những ưu điểm sau:
Lấy động lực của xu hướng: Chiến lược này chỉ được sử dụng khi xu hướng bắt đầu phát triển và có thể nắm bắt lợi nhuận theo chỉ số của thị trường sau.
Giới hạn tổn thất: Cài đặt mức dừng lỗ phù hợp, bạn có thể kiểm soát tổn thất đơn lẻ trong một phạm vi nhất định. Ngay cả khi gặp trục trặc, cũng có cơ hội kiếm tiền.
Chỉ số phân phối chính xác: Đường trung bình di chuyển, Laguerre RSI và chỉ số ADX có thể đánh giá tương đối chính xác thị trường trống và thời gian tham gia.
Đơn giản để thực hiện: Chiến lược này chỉ sử dụng 3 chỉ số, đơn giản và dễ nắm bắt.
Chiến lược này cũng có một số rủi ro:
Rủi ro thay đổi xu hướng: Chiến lược thuộc chiến lược theo dõi xu hướng, nếu không nhận ra xu hướng thay đổi sẽ gây ra tổn thất lớn hơn.
Rủi ro rút tiền: Trong tình huống chấn động, dừng lỗ có thể bị phá vỡ, dẫn đến rút tiền cho tài khoản.
Rủi ro tối ưu hóa tham số: Các tham số chỉ số cần được điều chỉnh theo thị trường khác nhau, nếu không sẽ không hiệu quả.
Phản ứng:
Hạn chế nghiêm ngặt, kiểm soát tổn thất đơn lẻ
Tối ưu hóa tham số chỉ số, điều chỉnh số lỗ đột phá.
Quản lý thu hồi bằng cách sử dụng các phương pháp như bảo mật kỳ hạn hợp đồng tương lai.
Chính sách này có thể được tối ưu hóa theo các khía cạnh sau:
Tối ưu hóa tham số: Kiểm tra chu kỳ trung bình di chuyển, tham số Laguerre RSI, tham số ADX để tìm kiếm sự kết hợp tham số tối ưu.
Tối ưu hóa lỗ hổng: thử nghiệm các lỗ hổng khác nhau trên đường trung bình di chuyển để tìm sự cân bằng giữa số lần giao dịch và tỷ lệ lợi nhuận.
Tối ưu hóa điều kiện nhập cảnh: Kiểm tra các chỉ số khác kết hợp với chỉ số RSI Laguerre để tìm các điều kiện xác định chính xác hơn thời gian nhập cảnh.
Tối ưu hóa điều kiện ra sân: Nghiên cứu các chỉ số khác kết hợp với trung bình di chuyển để đánh giá chính xác hơn về tín hiệu ra sân.
Mục tiêu lợi nhuận và tối ưu hóa dừng lỗ: thử nghiệm các chiến lược dừng lỗ khác nhau để tối ưu hóa lợi nhuận tài khoản.
Chiến lược này thực hiện việc nắm bắt hiệu quả các tình trạng xu hướng bằng cách sử dụng ba chỉ số đo lường đường trung bình di chuyển, Laguerre RSI và ADX. Bắt đầu đầu tư kịp thời khi xu hướng bắt đầu phát triển, theo dõi xu hướng để nắm bắt lợi nhuận chỉ số. Đồng thời thiết lập chiến lược dừng lỗ để kiểm soát tổn thất đơn.
/*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")