Chiến lược giao dịch chéo giữa trung bình di chuyển kép

Tác giả:ChaoZhang, Ngày: 2023-12-27 16:07:49
Tags:

img

Tổng quan

Chiến lược này tạo ra tín hiệu mua và bán dựa trên đường chéo vàng và đường chéo chết của đường trung bình chuyển động. Cụ thể, nó sử dụng đường trung bình chuyển động theo cấp số nhân 5 ngày (EMA) và đường trung bình chuyển động theo cấp số nhân kép 34 ngày (DEMA). Khi đường EMA ngắn hạn 5 ngày vượt qua đường DEMA dài hạn 34 ngày, một tín hiệu mua được tạo ra. Khi đường EMA ngắn hạn 5 ngày vượt qua đường DEMA dài hạn 34 ngày, một tín hiệu bán được tạo ra.

Chiến lược logic

  1. Tính toán EMA 5 ngày và DEMA 34 ngày
  2. Tạo tín hiệu mua khi EMA 5 ngày ngắn vượt qua DEMA 34 ngày dài
  3. Tạo tín hiệu bán khi EMA 5 ngày ngắn hạn vượt dưới DEMA 34 ngày dài hạn
  4. Tùy chọn giao dịch chỉ trong các phiên giao dịch cụ thể
  5. Tùy chọn sử dụng lệnh dừng lỗ kéo dài

Chiến lược này kết hợp cả các yếu tố chéo trung bình xu hướng và trung bình động để có hiệu suất ổn định. Trung bình động như một chỉ số theo xu hướng có thể xác định hiệu quả xu hướng thị trường; Sự kết hợp EMA và DEMA có thể làm mịn dữ liệu giá để tạo ra tín hiệu giao dịch; Các chéo giữa trung bình động ngắn hạn và dài hạn có thể cung cấp tín hiệu giao dịch sớm khi thay đổi xu hướng lớn.

Phân tích lợi thế

  1. Định nghĩa chiến lược đơn giản và rõ ràng, dễ hiểu và thực hiện
  2. Việc sử dụng kết hợp các đường trung bình động xem xét cả phán đoán xu hướng và làm mịn dữ liệu giá
  3. Crossover giữa trung bình động ngắn hạn và dài hạn có thể cung cấp các tín hiệu sớm tại các điểm chuyển đổi lớn
  4. Các thông số có thể được tối ưu hóa để điều chỉnh chiều dài trung bình động cho các sản phẩm và khung thời gian khác nhau
  5. Kết hợp hai yếu tố có thể cải thiện sự ổn định của chiến lược

Phân tích rủi ro

  1. Nhiều tín hiệu sai có thể xảy ra trên các thị trường khác nhau
  2. Độ dài trung bình di chuyển không phù hợp có thể gây ra sự chậm trễ tín hiệu
  3. Thời gian giao dịch không phù hợp và cài đặt dừng lỗ có thể ảnh hưởng đến lợi nhuận chiến lược

Những rủi ro này có thể được giảm bằng cách điều chỉnh chiều dài trung bình động, tối ưu hóa giờ giao dịch và thiết lập stop loss hợp lý.

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

  1. Điều chỉnh các thông số chiều dài trung bình động cho các sản phẩm giao dịch và khung thời gian khác nhau
  2. Tối ưu hóa các thông số phiên giao dịch để giao dịch trong thời gian hoạt động nhiều nhất
  3. So sánh dừng lỗ cố định so với dừng lỗ kéo theo
  4. Kiểm tra tác động của các lựa chọn nguồn giá khác nhau đối với chiến lược

Kết luận

Chiến lược này tạo ra các tín hiệu giao dịch thông qua các giao dịch chéo trung bình động đôi, kết hợp với các kỹ thuật theo dõi xu hướng và làm mịn dữ liệu. Đây là một chiến lược theo dõi xu hướng đơn giản và thực tế. Thông qua điều chỉnh tham số và tinh chỉnh logic, nó có thể thích nghi với các sản phẩm và khung thời gian khác nhau, cung cấp tín hiệu sớm về những thay đổi xu hướng lớn và tránh các tín hiệu sai. Đáng khuyến cáo và áp dụng.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",false]]
*/

//@version=2
strategy(title='[STRATEGY][RS]MicuRobert EMA cross V2', shorttitle='S', overlay=true)
USE_TRADESESSION = input(title='Use Trading Session?', type=bool, defval=true)
USE_TRAILINGSTOP = input(title='Use Trailing Stop?', type=bool, defval=true)
trade_session = input(title='Trade Session:',  defval='0400-1500', confirm=false)
istradingsession = not USE_TRADESESSION ? false : not na(time('1', trade_session))
bgcolor(istradingsession?gray:na)
trade_size = input(title='Trade Size:', type=float, defval=1)
tp = input(title='Take profit in pips:', type=float, defval=55.0) * (syminfo.mintick*10)
sl = input(title='Stop loss in pips:', type=float, defval=22.0) * (syminfo.mintick*10)
ma_length00 = input(title='EMA length:', defval=5)
ma_length01 = input(title='DEMA length:',  defval=34)
price = input(title='Price source:', defval=open)

//  ||--- NO LAG EMA, Credit LazyBear:  ---||
f_LB_zlema(_src, _length)=>
    _ema1=ema(_src, _length)
    _ema2=ema(_ema1, _length)
    _d=_ema1-_ema2
    _zlema=_ema1+_d
//  ||-------------------------------------||

ma00 = f_LB_zlema(price, ma_length00)
ma01 = f_LB_zlema(price, ma_length01)
plot(title='M0', series=ma00, color=black)
plot(title='M1', series=ma01, color=black)

isnewbuy = change(strategy.position_size)>0 and change(strategy.opentrades)>0
isnewsel = change(strategy.position_size)<0 and change(strategy.opentrades)>0

buy_entry_price = isnewbuy ? price : buy_entry_price[1]
sel_entry_price = isnewsel ? price : sel_entry_price[1]
plot(title='BE', series=buy_entry_price, style=circles, color=strategy.position_size <= 0 ? na : aqua)
plot(title='SE', series=sel_entry_price, style=circles, color=strategy.position_size >= 0 ? na : aqua)
buy_appex = na(buy_appex[1]) ? price : isnewbuy ? high : high >= buy_appex[1] ? high : buy_appex[1]
sel_appex = na(sel_appex[1]) ? price : isnewsel ? low : low <= sel_appex[1] ? low : sel_appex[1]
plot(title='BA', series=buy_appex, style=circles, color=strategy.position_size <= 0 ? na : teal)
plot(title='SA', series=sel_appex, style=circles, color=strategy.position_size >= 0 ? na : teal)
buy_ts = buy_appex - sl
sel_ts = sel_appex + sl
plot(title='Bts', series=buy_ts, style=circles, color=strategy.position_size <= 0 ? na : red)
plot(title='Sts', series=sel_ts, style=circles, color=strategy.position_size >= 0 ? na : red)

buy_cond1 = crossover(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
buy_cond0 = crossover(price, ma00) and ma00 > ma01 and (USE_TRADESESSION ? istradingsession : true)
buy_entry = buy_cond1 or buy_cond0
buy_close = (not USE_TRAILINGSTOP ? low <= buy_entry_price - sl: low <= buy_ts) or high>=buy_entry_price+tp//high>=last_traded_price + tp or low<=last_traded_price - sl //high >= hh or 
sel_cond1 = crossunder(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
sel_cond0 = crossunder(price, ma00) and ma00 < ma01 and (USE_TRADESESSION ? istradingsession : true)
sel_entry = sel_cond1 or sel_cond0
sel_close = (not USE_TRAILINGSTOP ? high >= sel_entry_price + sl : high >= sel_ts) or low<=sel_entry_price-tp//low<=last_traded_price - tp or high>=last_traded_price + sl //low <= ll or 

strategy.entry('buy', long=strategy.long, qty=trade_size, comment='buy', when=buy_entry)
strategy.close('buy', when=buy_close)
strategy.entry('sell', long=strategy.short, qty=trade_size, comment='sell', when=sel_entry)
strategy.close('sell', when=sel_close)

Thêm nữa