Đây là một chiến lược theo xu hướng dựa trên tín hiệu chéo trung bình động. Khi trung bình động nhanh vượt qua trên trung bình động chậm từ dưới, một tín hiệu mua được tạo ra. Khi trung bình động nhanh vượt qua dưới trung bình động chậm từ trên, một tín hiệu bán được tạo ra.
Chiến lược này sử dụng hai đường trung bình động, đường trung bình động đơn giản 20 giai đoạn và đường trung bình động đơn giản 30 giai đoạn. Khi MA 20 giai đoạn vượt trên MA 30 giai đoạn, một tín hiệu mua được tạo ra. Khi MA 20 giai đoạn vượt dưới MA 30 giai đoạn, một tín hiệu bán được kích hoạt.
Các đường trung bình động tự nó phục vụ như các chỉ số xu hướng, mô tả hướng xu hướng thị trường hiệu quả. Nguyên tắc chéo cho phép chiến lược nắm bắt các điểm đảo ngược xu hướng kịp thời và tạo ra các tín hiệu giao dịch. Các khoảng thời gian 20 ngày và 30 ngày được thiết lập thích hợp để phản ánh xu hướng thị trường mà không quá nhạy cảm với tiếng ồn.
Những lợi thế chính của chiến lược này là:
Những rủi ro chính của chiến lược này bao gồm:
Giải pháp:
Các khía cạnh chính để tối ưu hóa chiến lược:
Hệ thống chéo trung bình động là một chiến lược theo xu hướng đơn giản và hiệu quả. Logic là rõ ràng và dễ hiểu, rất phù hợp cho người mới bắt đầu học. Nó tạo ra các tín hiệu giao dịch dựa trên chéo trung bình động và lợi nhuận từ giao dịch dọc theo xu hướng. Chiến lược có thể được tối ưu hóa theo nhiều cách để trở nên ổn định và hiệu quả hơn.
/*backtest start: 2023-12-03 00:00:00 end: 2024-01-02 00:00:00 period: 1h 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/ // © gliese581d //@version=4 strategy(title="Moving Averages Testing", overlay=true, precision=2, calc_on_every_tick=false, max_bars_back=5000, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=50, commission_type=strategy.commission.percent, initial_capital=10000) //SETTINGS longs_on = input(title="Long Trades enabled", defval=true) shorts_on = input(title="Short Trades enabled", defval=true) long_cond = input(title="Buy/Long Crossover Condition", defval="price x MA1", options=["price x MA1", "price x MA2", "MA1 x MA2"]) short_cond = input(title="Sell/Short Crossunder Condition", defval="price x MA2", options=["price x MA1", "price x MA2", "MA1 x MA2"]) ma1_type = input(title="Moving Average 1 Type", defval="SMA", options=["SMA", "EMA"]) ma1_len = input(defval=20, title="Moving Average 1 Len", type=input.integer, minval=1, maxval=1000, step=1) ma2_type = input(title="Moving Average 2 Type", defval="SMA", options=["SMA", "EMA"]) ma2_len = input(defval=30, title="Moving Average 2 Len", type=input.integer, minval=1, maxval=1000, step=1) //MOVING AVERAGES ma_1 = ma1_type == "EMA" ? ema(close, ma1_len) : sma(close, ma1_len) ma_2 = ma2_type == "EMA" ? ema(close, ma2_len) : sma(close, ma2_len) //STRATEGY //trade entries long_entry = long_cond == "price x MA1" ? crossover(close, ma_1) : long_cond == "price x MA2" ? crossover(close, ma_2) : long_cond == "MA1 x MA2" ? crossover(ma_1, ma_2) : false short_entry = short_cond == "price x MA1" ? crossunder(close, ma_1) : short_cond == "price x MA2" ? crossunder(close, ma_2) : short_cond == "MA1 x MA2" ? crossunder(ma_1, ma_2) : false start_month = input(defval=4, title="Strategy Start Month", type=input.integer, minval=1, maxval=12, step=1) start_year = input(defval=2018, title="Strategy Start Year", type=input.integer, minval=2000, maxval=2025, step=1) end_month = input(defval=12, title="Strategy End Month", type=input.integer, minval=1, maxval=12, step=1) end_year = input(defval=2020, title="Strategy End Year", type=input.integer, minval=2000, maxval=2025, step=1) in_time =true strategy.entry("Long", strategy.long, when=longs_on and in_time and long_entry) strategy.close("Long", when=longs_on and not shorts_on and short_entry) strategy.entry("Short", strategy.short, when=shorts_on and in_time and short_entry) strategy.close("Short", when=shorts_on and not longs_on and long_entry) //PLOTTING //color background last_entry_was_long = nz(barssince(long_entry)[1], 5000) < nz(barssince(short_entry)[1], 5000) bgcol = (longs_on and last_entry_was_long) ? color.green : (shorts_on and not last_entry_was_long) ? color.red : na bgcolor(color=bgcol, transp=90) plot((long_cond == "price x MA1" or long_cond == "MA1 x MA2") or (short_cond == "price x MA1" or short_cond == "MA1 x MA2") ? ma_1 : na, color=color.blue) plot((long_cond == "price x MA2" or long_cond == "MA1 x MA2") or (short_cond == "price x MA2" or short_cond == "MA1 x MA2") ? ma_2 : na, color=color.black) plotshape(long_entry, style=shape.triangleup, location=location.belowbar, color=color.green) plotshape(short_entry, style=shape.triangledown, location=location.abovebar, color=color.red)