Chiến lược đột phá biến động là một chiến lược thực hiện các hoạt động mua và bán khi giá vượt qua các mức hỗ trợ hoặc kháng cự chính trong các mô hình biến động.
Chiến lược này chủ yếu dựa trên Bollinger Middle Band, Đường trung bình di chuyển đơn giản 48 ngày (SMA), MACD và ADX bốn chỉ số kỹ thuật.
Xem xét các cơ hội giao dịch khi giá đóng vượt trên hoặc dưới SMA 48 ngày;
Khi giá đóng phá vỡ Bollinger Middle Band, nó phục vụ như một tín hiệu nhập cảnh;
MACD lớn hơn hoặc nhỏ hơn 0, phục vụ như một chỉ số phụ để xác định hướng xu hướng;
ADX lớn hơn 25 để lọc các thị trường không có xu hướng.
Khi bốn điều kiện trên được đáp ứng, đi dài hoặc đi ngắn.
Đây là một chiến lược kết hợp các chỉ số xu hướng và biến động.
SMA 48 ngày lọc các giao dịch quá thường xuyên và khóa trong xu hướng trung bình dài hạn;
Bollinger Middle Band breakout nắm bắt các điểm hỗ trợ / kháng cự chính với chức năng dừng lỗ mạnh mẽ;
MACD đánh giá hướng của các xu hướng chính, tránh giao dịch chống lại xu hướng;
ADX lọc các thị trường không có xu hướng và cải thiện tỷ lệ chiến thắng của chiến lược.
Tóm lại, chiến lược này đã tối ưu hóa trong việc kiểm soát tần suất giao dịch, nắm bắt các điểm chính, xác định hướng xu hướng và lọc các động thái không hợp lệ, do đó có tỷ lệ thắng tương đối cao.
Những rủi ro chính của chiến lược này là:
Trong các thị trường biến động, Bollinger Middle Band có thể kích hoạt quá nhiều cơ hội giao dịch, dẫn đến giao dịch quá mức;
Chỉ số ADX cũng có một số lỗi trong việc xác định xu hướng và di chuyển không hợp lệ;
Nguy cơ rút vốn tương đối lớn, phù hợp với các nhà đầu tư có thể chịu một mức độ rủi ro nhất định.
Chiến lược này có thể được tối ưu hóa thêm trong các khía cạnh sau:
Thêm chỉ số ATR để thiết lập các điểm dừng lỗ và giảm mỗi lỗ dừng;
Tối ưu hóa các thông số Bollinger để giảm tần suất kích hoạt đường giữa;
Thêm các chỉ số khối lượng giao dịch hoặc sức mạnh xu hướng để xác định sức mạnh của xu hướng, tránh các giao dịch đảo ngược yếu.
Tóm lại, Chiến lược đột phá biến động này tương đối trưởng thành trong tổng thể, có hiệu quả nắm bắt các điểm giao dịch chính trong các thị trường biến động. Nó kết hợp các chỉ số xu hướng và biến động, cân bằng giữa rủi ro và lợi nhuận. Với tối ưu hóa hơn nữa, nó dự kiến sẽ có được lợi nhuận dư thừa ổn định hơn.
/*backtest start: 2023-12-11 00:00:00 end: 2023-12-12 00:00:00 period: 10m basePeriod: 1m 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/ // © 03.freeman //Volatility Traders Minds Strategy (VTM Strategy) //I found this startegy on internet, with a video explaingin how it works. //Conditions for entry: //1 - Candles must to be above or bellow the 48 MA (Yellow line) //2 - Candles must to break the middle of bollinger bands //3 - Macd must to be above or bellow zero level; //4 - ADX must to be above 25 level //@version=4 strategy("Volatility Traders Minds Strategy (VTM Strategy)", shorttitle="VTM",overlay=true) source = input(close) //MA ma48 = sma(source,48) //MACD fastLength = input(12) slowlength = input(26) MACDLength = input(9) MACD = ema(source, fastLength) - ema(source, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD //BB length = input(20, minval=1) mult = input(2.0, minval=0.001, maxval=50) basis = sma(source, length) dev = mult * stdev(source, length) upper = basis + dev lower = basis - dev //ADX adxThreshold = input(title="ADX Threshold", type=input.integer, defval=25, minval=1) adxlen = input(14, title="ADX Smoothing") dilen = input(14, title="DI Length") dirmov(len) => up = change(high) down = -change(low) plusDM = na(up) ? na : (up > down and up > 0 ? up : 0) minusDM = na(down) ? na : (down > up and down > 0 ? down : 0) truerange = rma(tr, len) plus = fixnan(100 * rma(plusDM, len) / truerange) minus = fixnan(100 * rma(minusDM, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) sig = adx(dilen, adxlen) // Strategy: (Thanks to JayRogers) // === STRATEGY RELATED INPUTS === //tradeInvert = input(defval = false, title = "Invert Trade Direction?") // the risk management inputs inpTakeProfit = input(defval = 0, title = "Take Profit Points", minval = 0) inpStopLoss = input(defval = 0, title = "Stop Loss Points", minval = 0) inpTrailStop = input(defval = 0, title = "Trailing Stop Loss Points", minval = 0) inpTrailOffset = input(defval = 0, title = "Trailing Stop Loss Offset Points", minval = 0) // === RISK MANAGEMENT VALUE PREP === // if an input is less than 1, assuming not wanted so we assign 'na' value to disable it. useTakeProfit = inpTakeProfit >= 1 ? inpTakeProfit : na useStopLoss = inpStopLoss >= 1 ? inpStopLoss : na useTrailStop = inpTrailStop >= 1 ? inpTrailStop : na useTrailOffset = inpTrailOffset >= 1 ? inpTrailOffset : na // === STRATEGY - LONG POSITION EXECUTION === enterLong() => close>ma48 and close>basis and delta>0 and sig>adxThreshold // functions can be used to wrap up and work out complex conditions //exitLong() => jaw>teeth or jaw>lips or teeth>lips strategy.entry(id = "Buy", long = true, when = enterLong() ) // use function or simple condition to decide when to get in //strategy.close(id = "Buy", when = exitLong() ) // ...and when to get out // === STRATEGY - SHORT POSITION EXECUTION === enterShort() => close<ma48 and close<basis and delta<0 and sig>adxThreshold //exitShort() => jaw<teeth or jaw<lips or teeth<lips strategy.entry(id = "Sell", long = false, when = enterShort()) //strategy.close(id = "Sell", when = exitShort() ) // === STRATEGY RISK MANAGEMENT EXECUTION === // finally, make use of all the earlier values we got prepped strategy.exit("Exit Buy", from_entry = "Buy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset) strategy.exit("Exit Sell", from_entry = "Sell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset) // === Backtesting Dates === thanks to Trost testPeriodSwitch = input(false, "Custom Backtesting Dates") testStartYear = input(2020, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testStartHour = input(0, "Backtest Start Hour") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) testStopYear = input(2020, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testStopHour = input(23, "Backtest Stop Hour") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false isPeriod = testPeriodSwitch == true ? testPeriod() : true // === /END if not isPeriod strategy.cancel_all() strategy.close_all()