Chiến lược phá vỡ động lực

Tác giả:ChaoZhang, Ngày: 2023-12-13 17:08:53
Tags:

img

Tổng quan

Chiến lược này kết hợp trung bình di chuyển, chỉ số Laguerre RSI và chỉ số ADX để thực hiện giao dịch đột phá. Nó đi dài khi trung bình di chuyển nhanh vượt qua trên trung bình di chuyển chậm, Laguerre RSI lớn hơn 80, và ADX lớn hơn 20; nó đi ngắn khi trung bình di chuyển nhanh vượt qua dưới trung bình di chuyển chậm, Laguerre RSI nhỏ hơn 20, và ADX lớn hơn 20.

Nguyên tắc

Chiến lược chủ yếu sử dụng các chỉ số sau đây để xác định xu hướng và thời gian tham gia:

  1. Sự kết hợp trung bình động: EMA 16 ngày, EMA 48 ngày, SMA 200 ngày. Xu hướng tăng được xác định khi trung bình ngắn hạn vượt trên trung bình dài hạn và xu hướng giảm khi vượt dưới.

  2. RSI lớn hơn 80 là tín hiệu dài, và nhỏ hơn 20 là tín hiệu ngắn.

  3. Chỉ số ADX để xác định tình trạng xu hướng. ADX lớn hơn 20 cho thấy xu hướng, phù hợp với giao dịch đột phá.

Các tín hiệu đầu vào được xác định bởi hướng của sự kết hợp trung bình động, thời gian đầu vào bởi Laguerre RSI và các thị trường không có xu hướng được lọc ra bởi ADX. Các tín hiệu đầu ra được tạo ra khi các đường trung bình động vượt qua trở lại. Khung phán quyết chiến lược tổng thể khá hợp lý, với các chỉ số khác nhau làm việc cùng nhau để xác định đầu vào và đầu ra dài / ngắn.

Điểm mạnh

Những lợi thế của chiến lược này bao gồm:

  1. Bắt được đà xu hướng: Chiến lược chỉ đi vào thị trường khi bắt đầu phát triển xu hướng, nắm bắt lợi nhuận theo cấp số nhân từ xu hướng.

  2. Mức lỗ hạn chế: Đặt mức dừng lỗ phù hợp để hạn chế lỗ từ các giao dịch cá nhân. Ngay cả khi thua giao dịch cũng có cơ hội kiếm lợi nhuận.

  3. Các chỉ số kết hợp chính xác: Các đường trung bình động, Laguerre RSI và ADX có thể xác định tương đối chính xác hướng thị trường và thời gian nhập cảnh.

  4. Thực hiện đơn giản: Chiến lược chỉ sử dụng 3 chỉ số và dễ hiểu và thực hiện.

Rủi ro

Ngoài ra còn có một số rủi ro cho chiến lược:

  1. Rủi ro đảo ngược xu hướng: Là một chiến lược theo xu hướng, có thể xảy ra tổn thất lớn nếu sự đảo ngược xu hướng không được phát hiện kịp thời.

  2. Nguy cơ rút tiền: Trong các thị trường dao động, các điểm dừng có thể bị nhấn dẫn đến việc rút tiền tài khoản.

  3. Rủi ro tối ưu hóa tham số: Các tham số chỉ số cần được điều chỉnh cho các thị trường khác nhau để tránh thất bại.

Các biện pháp đối phó:

  1. Đặt mức dừng lỗ nghiêm ngặt để giới hạn số tiền lỗ giao dịch duy nhất.

  2. Tối ưu hóa các thông số chỉ số và ngưỡng đột phá.

  3. Sử dụng bảo hiểm tương lai v.v. để quản lý rút vốn.

Hướng dẫn tối ưu hóa

Một số cách để tối ưu hóa chiến lược bao gồm:

  1. Tối ưu hóa tham số: Kiểm tra sự kết hợp của các giai đoạn trung bình động, các tham số RSI Laguerre, các tham số ADX để tìm các thiết lập tối ưu.

  2. Tối ưu hóa đột phá: Kiểm tra các ngưỡng đột phá trung bình động khác nhau để cân bằng tần suất giao dịch và lợi nhuận.

  3. Tối ưu hóa nhập cảnh: Kiểm tra các chỉ số khác kết hợp với Laguerre RSI để xác định thời gian nhập cảnh chính xác hơn.

  4. Tối ưu hóa thoát: Nghiên cứu các tín hiệu thoát khác kết hợp với đường trung bình động.

  5. Lấy lợi nhuận so với tối ưu hóa dừng lỗ: Kiểm tra các chiến lược khác nhau để tối ưu hóa lợi nhuận.

Tóm lại

Tóm lại, chiến lược này có hiệu quả nắm bắt các xu hướng di chuyển bằng cách sử dụng sự kết hợp của các đường trung bình động, Laguerre RSI và ADX để xác định các bước vào và ra. Bằng cách vào sớm trong sự phát triển của xu hướng và theo dõi chặt chẽ các xu hướng, lợi nhuận theo cấp số nhân có thể được thực hiện, trong khi dừng lỗ giúp hạn chế lỗ. Chiến lược phù hợp với các nhà đầu tư thoải mái đưa ra phán đoán thị trường, cũng như những người làm giao dịch tự động sau khi tối ưu hóa tham số.


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


Thêm nữa