Chiến lược đột phá biến động

Tác giả:ChaoZhang, Ngày: 2023-12-13 14:36:04
Tags:

img

Tổng quan

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.

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

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.

  1. 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;

  2. Khi giá đóng phá vỡ Bollinger Middle Band, nó phục vụ như một tín hiệu nhập cảnh;

  3. 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;

  4. 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.

Ưu điểm của Chiến lược

Đây là một chiến lược kết hợp các chỉ số xu hướng và biến động.

  1. 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;

  2. 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ẽ;

  3. 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;

  4. 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.

Rủi ro của chiến lược

Những rủi ro chính của chiến lược này là:

  1. 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;

  2. 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ệ;

  3. 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.

Hướng dẫn tối ưu hóa

Chiến lược này có thể được tối ưu hóa thêm trong các khía cạnh sau:

  1. Thêm chỉ số ATR để thiết lập các điểm dừng lỗ và giảm mỗi lỗ dừng;

  2. Tối ưu hóa các thông số Bollinger để giảm tần suất kích hoạt đường giữa;

  3. 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

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()

Thêm nữa