
Chiến lược này là một chiến lược chỉ làm nhiều hơn, nó sử dụng giá phá vỡ ATR kênh thấp để xác định thời gian vào và thoát bằng đường trung bình ATR hoặc ATR kênh trên là điểm dừng. Đồng thời, nó cũng sử dụng ATR để tính giá dừng. Chiến lược này phù hợp để giao dịch đường ngắn nhanh chóng.
Khi giá giảm xuống giới hạn dưới của kênh ATR, nó cho thấy giá giảm bất thường. Tại thời điểm này, chiến lược sẽ thực hiện nhiều lệnh vào khi mở đường K tiếp theo. Giá dừng là giá vào trừ ATR Stop Factor nhân ATR. Giá dừng là đường trung bình của kênh ATR hoặc đường trên của kênh ATR, nếu giá đóng cửa K hiện tại thấp hơn giá thấp nhất của một đường K trước đó, thì một đường K trước đó là giá dừng.
Cụ thể, chiến lược này bao gồm các logic sau:
Chiến lược này có những ưu điểm sau:
Chiến lược này cũng có một số rủi ro:
Bạn có thể làm giảm rủi ro bằng cách điều chỉnh chu kỳ ATR, giảm hệ số dừng lỗ, v.v.
Chiến lược này cũng có thể được tối ưu hóa bằng cách:
Chiến lược này nói chung là một chiến lược đảo ngược đường trung bình phá vỡ đường ngắn đơn giản và thực tế. Nó có quy tắc nhập cảnh rõ ràng, cơ chế dừng lỗ nghiêm ngặt và cách dừng hoàn chỉnh. Ngoài ra, nó cũng cung cấp một số không gian tối ưu hóa cho điều chỉnh tham số.
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
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/
// © Bcullen175
//@version=5
strategy("ATR Mean Reversion", overlay=true, initial_capital=100000,default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=6E-5) // Brokers rate (ICmarkets = 6E-5)
SLx = input(1.5, "SL Multiplier", tooltip = "Multiplies ATR to widen stop on volatile assests, Higher values reduce risk:reward but increase winrate, Values below 1.2 are not reccomended")
src = input(close, title="Source")
period = input.int(10, "ATR & MA PERIOD")
plot(open+ta.atr(period))
plot(open-ta.atr(period))
plot((ta.ema(src, period)), title = "Mean", color=color.white)
i_startTime = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")
// Check filter(s)
f_dateFilter = true
atr = ta.atr(period)
// Check buy/sell conditions
var float buyPrice = 0
buyCondition = low < (open-ta.atr(period)) and strategy.position_size == 0 and f_dateFilter
sellCondition = (high > (ta.ema(close, period)) and strategy.position_size > 0 and close < low[1]) or high > (open+ta.atr(period))
stopDistance = strategy.position_size > 0 ? ((buyPrice - atr)/buyPrice) : na
stopPrice = strategy.position_size > 0 ? (buyPrice - SLx*atr): na
stopCondition = strategy.position_size > 0 and low < stopPrice
// Enter positions
if buyCondition
strategy.entry(id="Long", direction=strategy.long)
if buyCondition[1]
buyPrice := open
// Exit positions
if sellCondition or stopCondition
strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : ""))
buyPrice := na
// Draw pretty colors
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1)