Chiến lược giao dịch kênh trung bình động kép

Tác giả:ChaoZhang, Ngày: 2024-02-29 14:54:25
Tags:

img

Tổng quan

Chiến lược giao dịch kênh trung bình động kép là một chiến lược giao dịch xu hướng theo dõi sự chéo chéo giữa các đường trung bình động kép. Chiến lược sử dụng đường trung bình di chuyển biểu thức (EMA) và đường trung bình di chuyển cân (WMA) làm chỉ số giao dịch. Khi đường EMA ngắn hạn vượt trên đường WMA dài hạn, chiến lược sẽ đi dài. Khi đường EMA ngắn hạn vượt dưới đường WMA dài hạn, chiến lược sẽ đi ngắn.

Chiến lược logic

Các tín hiệu giao dịch của chiến lược này đến từ đường chéo vàng và đường chéo chết giữa EMA ngắn hạn 10 giai đoạn và WMA dài hạn 20 giai đoạn. Khi EMA ngắn hạn vượt qua trên WMA dài hạn, nó cho thấy thị trường đang đảo ngược lên, do đó đi dài. Khi EMA ngắn hạn vượt qua dưới WMA dài hạn, nó cho thấy thị trường đang đảo ngược xuống, do đó đi ngắn.

Sau khi xác định hướng giao dịch, chiến lược đặt mức dừng lỗ dưới hoặc trên giá nhập vào khoảng thời gian 1 ATR, với hai lợi nhuận - lợi nhuận đầu tiên được đặt ở mức 1 ATR trên hoặc dưới giá nhập, và lợi nhuận thứ hai được đặt ở mức 2 ATR trên hoặc dưới giá nhập. Khi lợi nhuận đầu tiên được kích hoạt, 50% vị trí sẽ được đóng.

Logic stop loss trailing - nó sẽ được kích hoạt khi giá cao nhất hoặc giá thấp nhất đạt đến mức lợi nhuận đầu tiên.

Ưu điểm

Chiến lược này sử dụng tính năng giảm tiếng ồn làm mịn kép của đường trung bình động để lọc hiệu quả các biến động ngẫu nhiên trên thị trường và xác định các tín hiệu xu hướng trung hạn đến dài hạn, do đó tránh bị mắc kẹt trong whipsaws. Ngoài ra, hai giai đoạn lấy lợi nhuận làm tăng vùng lợi nhuận của chiến lược và tối đa hóa lợi nhuận. Cơ chế dừng lại cũng cho phép chiến lược khóa lợi nhuận và giảm lỗ.

Rủi ro

Đường trung bình động có sự chậm trễ lớn hơn, gây ra nguy cơ mất tín hiệu. Sự chéo giữa hai đường trung bình động cũng có thể tạo ra tín hiệu sai quá mức trên một số thị trường, gây ra tổn thất.

Việc thiết lập stop loss là một thành phần quan trọng của chiến lược. Nếu stop loss quá nhỏ, nó dễ bị ảnh hưởng bởi tiếng ồn thị trường. Nếu stop loss quá lớn, nó có thể không kiểm soát hiệu quả rủi ro.

Ngoài ra, khi thị trường biến động mạnh mẽ, việc dừng lại có thể không hoạt động tốt trong việc bảo vệ.

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

  1. Kiểm tra EMA và WMA với các thông số khác nhau để tìm sự kết hợp thông số tối ưu.

  2. Chọn các điểm cố định hoặc ATR stop loss nhiều lần dựa trên các đặc điểm sản phẩm và phong cách giao dịch khác nhau.

  3. Kiểm tra các hiệu ứng của dừng kéo theo vị trí một phần và dừng kéo theo vị trí đầy đủ.

  4. Đưa ra các chỉ số khác để lọc tín hiệu để hỗ trợ EMA và WMA, để cải thiện chất lượng tín hiệu.

Tóm lại

Nói chung, chiến lược giao dịch kênh trung bình động kép tương đối mạnh mẽ và hoạt động tốt trong các thị trường xu hướng. Bằng cách tối ưu hóa các thông số, cơ chế dừng lỗ và cải thiện chất lượng tín hiệu, hiệu suất giao dịch thực tế của chiến lược này có thể được tăng thêm. Đây là một ý tưởng chiến lược đầy hứa hẹn đáng nghiên cứu sâu và áp dụng trong giao dịch thực tế.


/*backtest
start: 2024-01-29 00:00:00
end: 2024-02-28 00:00:00
period: 3h
basePeriod: 15m
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/
// © gpadihar

//@version=4
strategy("SL1 Pips after TP1 (MA)", commission_type=strategy.commission.cash_per_order, overlay=true)

// Strategy
Buy  = input(true)
Sell = input(true)

// Date Range
start_year    = input(title='Start year'   ,defval=2020)
start_month   = input(title='Start month'  ,defval=1)
start_day     = input(title='Start day'    ,defval=1)
start_hour    = input(title='Start hour'   ,defval=0)
start_minute  = input(title='Start minute' ,defval=0)
end_time      = input(title='set end time?',defval=false)
end_year      = input(title='end year'     ,defval=3019)
end_month     = input(title='end month'    ,defval=12)
end_day       = input(title='end day'      ,defval=31)
end_hour      = input(title='end hour'     ,defval=23)
end_minute    = input(title='end minute'   ,defval=59)

// MA
ema_period = input(title='EMA period',defval=10)
wma_period = input(title='WMA period',defval=20)
ema        = ema(close,ema_period)
wma        = wma(close,wma_period)

// Entry Condition
buy =
 crossover(ema,wma) and
 nz(strategy.position_size) == 0 and Buy and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)
 
sell =
 crossunder(ema,wma) and
 nz(strategy.position_size) == 0 and Sell and
 time > timestamp(start_year, start_month, start_day, start_hour, start_minute) and
 (end_time?(time < timestamp(end_year, end_month, end_day, end_hour, end_minute)):true)

// Pips
pip = input(20)*10*syminfo.mintick

// Trading parameters //
var bool  LS  = na
var bool  SS  = na
var float EP  = na
var float TVL = na
var float TVS = na
var float TSL = na
var float TSS = na
var float TP1 = na
var float TP2 = na
var float SL1 = na
var float SL2 = na

if buy or sell and strategy.position_size == 0
    EP  := close
    SL1 := EP - pip     * (sell?-1:1)
    SL2 := EP - pip     * (sell?-1:1)
    TP1 := EP + pip     * (sell?-1:1)
    TP2 := EP + pip * 2 * (sell?-1:1) 
   
// current trade direction    
LS := buy  or strategy.position_size > 0
SS := sell or strategy.position_size < 0

// adjust trade parameters and trailing stop calculations
TVL := max(TP1,open) - pip[1]
TVS := min(TP1,open) + pip[1]
TSL := open[1] > TSL[1] ? max(TVL,TSL[1]):TVL 
TSS := open[1] < TSS[1] ? min(TVS,TSS[1]):TVS

if LS and high > TP1
    if open <= TP1
        SL2:=min(EP,TSL)
    
if SS and low < TP1
    if open >= TP1
        SL2:=max(EP,TSS)

// Closing conditions
close_long  = LS and open < SL2
close_short = SS and open > SL2

// Buy
strategy.entry("buy"  , strategy.long, when=buy and not SS)
strategy.exit ("exit1", from_entry="buy", stop=SL1, limit=TP1, qty_percent=50)
strategy.exit ("exit2", from_entry="buy", stop=SL2, limit=TP2)

// Sell
strategy.entry("sell" , strategy.short, when=sell and not LS)
strategy.exit ("exit3", from_entry="sell", stop=SL1, limit=TP1, qty_percent=50)
strategy.exit ("exit4", from_entry="sell", stop=SL2, limit=TP2)

// Plots
a=plot(strategy.position_size >  0 ? SL1 : na, color=#dc143c, style=plot.style_linebr)
b=plot(strategy.position_size <  0 ? SL1 : na, color=#dc143c, style=plot.style_linebr) 
c=plot(strategy.position_size >  0 ? TP1 : na, color=#00ced1, style=plot.style_linebr) 
d=plot(strategy.position_size <  0 ? TP1 : na, color=#00ced1, style=plot.style_linebr) 
e=plot(strategy.position_size >  0 ? TP2 : na, color=#00ced1, style=plot.style_linebr) 
f=plot(strategy.position_size <  0 ? TP2 : na, color=#00ced1, style=plot.style_linebr) 
g=plot(strategy.position_size >= 0 ? na  : EP, color=#ffffff, style=plot.style_linebr) 
h=plot(strategy.position_size <= 0 ? na  : EP, color=#ffffff, style=plot.style_linebr) 

plot(ema,title="ema",color=#fff176)
plot(wma,title="wma",color=#00ced1)



Thêm nữa