
Chiến lược phá vỡ chấn động là một chiến lược sử dụng hình thức biến động giá để thực hiện giao dịch khi giá vượt qua mức hỗ trợ hoặc kháng cự quan trọng. Chiến lược này kết hợp nhiều chỉ số kỹ thuật để xác định cơ hội giao dịch quan trọng.
Chiến lược này dựa trên bốn chỉ số kỹ thuật: đường trung tâm của vòng Brin, đường trung bình di chuyển đơn giản 48 ngày (SMA), MACD và ADX.
Cân nhắc các cơ hội giao dịch khi giá đóng cửa vượt qua hoặc vượt qua SMA 48 ngày;
Khi giá đóng cửa vượt qua đường trung tâm của Bollinger Bands, nó được sử dụng như một tín hiệu mua vào;
MACD lớn hơn hoặc nhỏ hơn 0 như là một chỉ số hỗ trợ để xác định hướng xu hướng;
ADX phải lớn hơn 25 để lọc ra các biến động không theo xu hướng.
Làm nhiều hơn hoặc ít hơn khi đáp ứng bốn điều kiện trên.
Đây là một chiến lược kết hợp các chỉ số xu hướng và biến động.
48 ngày SMA lọc ra các giao dịch quá thường xuyên, khóa xu hướng đường dài trung bình;
Đường xuyên trung tâm của dây đai Brin nắm bắt các điểm phá vỡ kháng cự hỗ trợ quan trọng, có chức năng ngăn chặn thiệt hại mạnh mẽ;
MACD sẽ đánh giá xu hướng lớn và tránh giao dịch ngược.
ADX lọc các thị trường không theo xu hướng, tăng tỷ lệ chiến lược.
Nói chung, chiến lược này đã được tối ưu hóa ở nhiều khía cạnh như kiểm soát tần suất giao dịch, nắm bắt các điểm quan trọng, đánh giá xu hướng và lọc các hành vi không hiệu quả.
Chiến lược này có những rủi ro:
Trong một thị trường bất ổn, các đường trung tâm của BRI thường xuyên tạo ra các cơ hội giao dịch, có thể dẫn đến giao dịch quá mức.
Chỉ số ADX cũng có một số sai sót trong việc đánh giá xu hướng và không hiệu quả;
Quá trình thu hồi có nhiều rủi ro và phù hợp với các nhà đầu tư có khả năng chịu rủi ro.
Chiến lược này có thể được tối ưu hóa hơn nữa ở những khía cạnh sau:
Tăng chỉ số ATR, thiết lập điểm dừng lỗ, giảm lỗ hổng đơn;
Tối ưu hóa các tham số của vùng Brin để giảm tần số kích hoạt đường trung tâm;
Tăng khối lượng giao dịch hoặc chỉ số cường độ xu hướng để đánh giá xu hướng mạnh hoặc yếu, tránh đảo ngược điểm yếu.
Nhìn chung, chiến lược phá vỡ động đất này khá trưởng thành và nắm bắt được các điểm giao dịch quan trọng trong tình hình động đất. Nó kết hợp xu hướng và chỉ số động đất, nắm bắt được sự cân bằng giữa rủi ro và lợi nhuận. Bằng cách tối ưu hóa hơn nữa, có thể đạt được lợi nhuận vượt trội ổ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()