Chiến lược giao dịch dựa trên đường trung bình động cắt nhau


Ngày tạo: 2023-12-27 16:07:49 sửa đổi lần cuối: 2023-12-27 16:07:49
sao chép: 2 Số nhấp chuột: 681
1
tập trung vào
1623
Người theo dõi

Chiến lược giao dịch dựa trên đường trung bình động cắt nhau

Tổng quan

Chiến lược này dựa trên giao điểm vàng và giao điểm chết của đường trung bình di chuyển để tạo ra tín hiệu mua và bán. Cụ thể, chiến lược này sử dụng đồng thời đường trung bình di chuyển 5 ngày ((EMA) và đường trung bình di chuyển 34 ngày ((DEMA)).

Nguyên tắc chiến lược

  1. Tính toán 5 ngày EMA và 34 ngày DEMA
  2. Một tín hiệu mua được tạo ra khi EMA ngắn hạn 5 ngày đi qua DEMA dài hạn 34 ngày từ phía dưới
  3. Một tín hiệu bán ra được tạo ra khi một EMA ngắn hạn 5 ngày đi qua DEMA dài hạn 34 ngày từ trên xuống
  4. Có thể chọn giao dịch chỉ trong một khoảng thời gian giao dịch nhất định
  5. Có thể chọn sử dụng theo dõi dừng lỗ

Chiến lược này kết hợp theo dõi xu hướng và chéo đường trung bình, có hiệu quả ổn định. Trung bình di chuyển là một chỉ số theo dõi xu hướng, có thể xác định xu hướng thị trường một cách hiệu quả. Sử dụng kết hợp của EMA và DEMA có thể làm mỏng dữ liệu giá một cách hiệu quả để tạo ra tín hiệu giao dịch.

Phân tích lợi thế

  1. Chiến lược này đơn giản, rõ ràng và dễ hiểu.
  2. Việc sử dụng moving averages kết hợp cả việc xem xét xu hướng và xử lý dữ liệu giá cả một cách mượt mà
  3. Giao thoa đường trung bình ngắn hạn và dài hạn, có thể đưa ra tín hiệu giao dịch trước khi các điểm biến động lớn của thị trường
  4. Có thể tối ưu hóa thông qua các tham số, điều chỉnh chiều dài của đường trung bình để phù hợp với các giống và chu kỳ khác nhau
  5. Sự kết hợp của hai yếu tố có thể giúp tăng sự ổn định của chiến lược

Phân tích rủi ro

  1. Trong một trận động đất, có thể có nhiều tín hiệu sai
  2. Độ dài đường trung bình không đúng có thể gây ra sự chậm trễ tín hiệu
  3. Thời gian giao dịch và thiết lập dừng lỗ không phù hợp 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ớt bằng cách điều chỉnh chiều dài đường trung bình, tối ưu hóa thời gian giao dịch và thiết lập lệnh dừng hợp lý.

Hướng tối ưu hóa

  1. Điều chỉnh tham số chiều dài đường trung bình cho các loại giao dịch và chu kỳ khác nhau
  2. Tối ưu hóa tham số thời gian giao dịch, giao dịch trong các khoảng thời gian hoạt động chính
  3. So sánh lợi thế của hai phương án dừng cố định và theo dõi dừng
  4. Kiểm tra tác động của các cách tính giá khác nhau đối với chiến lược

Tóm tắt

Chiến lược này tạo ra tín hiệu giao dịch thông qua giao thoa hai đường bằng phẳng, đồng thời kết hợp theo dõi xu hướng và xử lý dữ liệu trơn tru, là một chiến lược theo dõi xu hướng đơn giản và thực tế. Bằng cách điều chỉnh tham số và tối ưu hóa quy tắc, có thể thích ứng với các giống và chu kỳ giao dịch khác nhau, đưa ra tín hiệu giao dịch trước khi thay đổi xu hướng lớn, tránh tín hiệu sai.

Mã nguồn chiến lược
/*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)