Стратегия прорыва волатильности - это стратегия, которая проводит операции по покупке и продаже, когда цены проходят через ключевые уровни поддержки или сопротивления в моделях волатильности.
Эта стратегия в основном основана на четырех технических индикаторах: Bollinger Middle Band, 48-дневный простой скользящий средний (SMA), MACD и ADX.
Рассматривать торговые возможности при пересечении цены закрытия выше или ниже 48-дневной SMA;
Когда цена закрытия проходит через средний диапазон Боллинджера, она служит сигналом входа;
MACD больше или меньше 0, служит вспомогательным индикатором для определения направления тренда;
ADX больше 25, чтобы отфильтровать рынки без тренда.
Когда вышеперечисленные четыре условия выполнены, вы можете пойти на длинный или короткий.
Это стратегия, которая сочетает в себе индикаторы тренда и волатильности.
48-дневная SMA отфильтровывает чрезмерно частую торговлю и блокирует среднесрочные и долгосрочные тенденции;
Прорыв Bollinger Middle Band охватывает ключевые точки прорыва поддержки/сопротивления с сильной функцией стоп-лосса;
MACD оценивает направление основных тенденций, избегая торговли против тенденции;
ADX отфильтровывает не трендовые рынки и улучшает уровень выигрыша стратегии.
В целом, эта стратегия оптимизировала контроль частоты торговли, понимание ключевых точек, определение направления тренда и фильтрацию недействительных ходов, тем самым имея относительно высокий показатель выигрыша.
Основными рисками этой стратегии являются:
На волатильных рынках Bollinger Middle Band может привести к слишком большому количеству торговых возможностей, что приводит к чрезмерной торговле;
Индикатор ADX также имеет некоторые ошибки при определении тенденций и недействительных ходов;
Относительно большой риск привлечения, подходящий для инвесторов, которые могут нести определенный уровень риска.
Эта стратегия может быть дополнительно оптимизирована в следующих аспектах:
Добавить индикатор ATR для установки точек остановки потери и уменьшить по остановке потери;
Оптимизировать параметры Боллинджера для снижения частоты запуска середины линии;
Добавить показатели объема торговли или силы тренда для определения силы трендов, избегая слабых реверсионных операций.
В целом, эта стратегия является относительно зрелой, эффективно охватывая ключевые точки торговли на волатильных рынках. Она сочетает в себе индикаторы тренда и волатильности, балансируя между риском и доходностью. При дальнейшей оптимизации ожидается получение более устойчивой избыточной доходности.
/*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()