Торговая стратегия Precision Trend Breakout


Дата создания: 2023-11-02 16:26:22 Последнее изменение: 2023-11-02 16:26:22
Копировать: 0 Количество просмотров: 692
1
Подписаться
1617
Подписчики

Торговая стратегия Precision Trend Breakout

Обзор

Стратегия точного взлома тренда основана на трендовых показателях и конкретных K-линейных формах для точного захвата взлома тренда. Эта стратегия использует комплексный метод оценки направления тренда, RSI для определения перекупа и перепродажи, а также в сочетании с высокотехнологичными K-линейными формами для отбора точек взлома, точного определения тренда, совершения взлома в подходящее время и получения дополнительной прибыли.

Стратегический принцип

  1. Используйте 8-дневную ЭМА и 80-дневную ЭМА, чтобы определить направление тренда. 8-дневная ЭМА определяется как позитивная, а 80-дневная ЭМА - как отрицательная.

  2. Определяет определенную комбинационную форму трёх K-линий, то есть первая K-линейная низкая точка ниже второй, а третья K-линейная низкая точка ниже второй. Эта форма появляется во время восходящего тренда как сигнал к покупке.

  3. Третья K-линия становится внутренней K-линией, то есть является лучшей сигнальной точкой, когда цена закрытия находится в пределах предыдущей K-линии. В этот момент появляется форма 123, которая может быть непосредственно размещена в торговом поручении.

  4. Стоп-стоп - это двойная разница между ценой риска и ценой риска. Стоп-стоп - это двойная разница между ценой риска.

  5. При достижении условий тренда, формы и показателя, размещайте прорывные поручения, совершайте сделку с высокой вероятностью. И установите стоп-стоп для блокирования прибыли, чтобы обеспечить стабильную операцию прорыва.

Анализ преимуществ

Эта стратегия имеет следующие значительные преимущества:

  1. Используйте двойные ЭМА, чтобы определить направление тенденции и избежать обратной торговли.

  2. Фильтрация K-линейных форм, имеющих прорывный характер, повышает вероятность получения прибыли.

  3. Сигналы передаются только в том случае, если индикаторы тренда, формы и разницы в ценах совпадают, что гарантирует качество сигнала.

  4. Внутренняя форма K-линии повышает надежность сигнала и дополнительно блокирует время транзакции.

  5. Предоставление стоп-стоп-пойнтов для эффективного управления рисками отдельных сделок.

  6. По данным опроса, победа превышает 65% и имеет статистическое преимущество в долгосрочной прибыльности.

В целом, эта стратегия использует всесторонние суждения о тенденциях, формах и показателях, чтобы точно определить время прорыва в торговле, с стабильным преимуществом риска и прибыли.

Анализ рисков

Основные риски этой стратегии исходят из:

  1. Ошибки в определении тенденций, создание ошибочных сигналов в условиях шока. Можно ввести больше показателей тенденций для многомерного подтверждения.

  2. Одно-единственный метод прекращения убытков не может быть идеальным для каждой ситуации. Можно установить плавающий пункт прекращения убытков.

  3. Опознание K-линейных форм зависит от параметров, которые необходимо оптимизировать для поиска оптимального сочетания.

  4. Невозможно предсказать влияние на торговлю внезапных крупных черных свинцовых событий. Рекомендуется использовать контроль позиций, создавая позиции в группах.

  5. Отслеживаемые данные не могут быть представлены в реальной торговле, существует риск пересочетания.

  6. Торговые затраты оказывают большое влияние на стратегию высокочастотного трейдинга. Следует обеспечить достаточное соотношение выигрышей и убытков для поддержки затрат.

В целом, эта стратегия может эффективно снизить риск и повысить стабильность результатов путем оптимизации параметров, внедрения большего количества измерений суждения и контроля размеров позиций.

Направление оптимизации

В этой стратегии есть несколько возможностей для оптимизации:

  1. Тестирование большего количества K-линейных циклов для определения более стабильных комбинаций.

  2. Повышение показателей оборота для многомерного подтверждения и предотвращения ложных прорывов.

  3. Повышение показателей, таких как коэффициент резкости, коэффициент убыточности и т. д.

  4. Внедрение механизма отслеживания остановок, позволяющего управлять динамикой прибыли.

  5. В сочетании с индексом VIX Panic Index, чтобы избежать неопределенности рынка.

  6. Тестирование различных параметров периода удержания позиции для определения оптимальной эффективности удержания позиции.

  7. Оптимизация механизма остановки убытков, чтобы предотвратить неподвижность статической остановки.

Эти меры позволят еще больше повысить стабильность, гибкость и рентабельность стратегии.

Подвести итог

Тренд-бэк стратегия успешно использует органическое сочетание тренда, формы и стоп-стоп, чтобы обеспечить высокую вероятность поймания тренда. Она обладает четкими торговыми сигналами, признанием множества индикаторов и управляемым риском. Это эффективная стратегия, подходящая для трендовых ситуаций. Благодаря постоянной оптимизации и совершенствованию стратегия может стать мощным инструментом для управления позициями, отслеживающими тренд-бэк.

Исходный код стратегии
/*backtest
start: 2022-11-01 00:00:00
end: 2023-10-14 05:20: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/
// © julianossilva

//@version=5
strategy(title="J2S Backtest: 123-Stormer Strategy",
         shorttitle="J2S Backtest: 123-Stormer Strategy",
         overlay=true, initial_capital=1000, default_qty_value=10,
         default_qty_type = strategy.percent_of_equity, pyramiding=0)

// Initial Backtest Date Range
useStartDate = timestamp("01 Jan 2020 21:00:00")
useEndDate   = timestamp("01 Jan 2023 21:00:00")

// User Inputs
SIGNAL_CONFIG          = "BACKTEST: STORMER STRATEGY (123)"
longEntryInput         = input.bool(defval=true,         title="Long Entry",                     group=SIGNAL_CONFIG)
shortEntryInput        = input.bool(defval=true,         title="Short entry",                    group=SIGNAL_CONFIG)
thresholdForEntryInput = input.int(defval=3,             title="Threshold on clandes for entry", group=SIGNAL_CONFIG)
insideBarStrategyTitle = "Only third candle inside bar is valid"
insideBarStrategyTip   = "According to Stomer, it would be the best signal for the strategy"
insideBarStrategyInput = input.bool(defval=true,         title=insideBarStrategyTitle,           group=SIGNAL_CONFIG, tooltip=insideBarStrategyTip)
EMA_CONFIG             = "BACKTEST: EXPONENTIAL MOVING AVERAGES"
sourceInput            = input.source(defval=close,      title="Source",           inline="01",  group=EMA_CONFIG)
emaTimeframeInput      = input.timeframe("1W",           title="Timeframe",        inline="01",  group=EMA_CONFIG)
emaOffsetInput         = input.int(defval=8,             title="Offset",           inline="01",  group=EMA_CONFIG)
fastEMALengthInput     = input.int(defval=8,             title="Fast EMA Length",  inline="02",  group=EMA_CONFIG)
useFastEMAInput        = input.bool(defval=true,         title="Use Fast EMA",     inline="02",  group=EMA_CONFIG)
slowEMALengthInput     = input.int(defval=80,            title="Slow EMA Length",  inline="03",  group=EMA_CONFIG)
useSlowEMAInput        = input.bool(defval=true,         title="Use Slow EMA",     inline="03",  group=EMA_CONFIG)
PERIOD_CONFIG          = "BACKTEST: TIME PERIOD"
useDateFilterInput     = input.bool(defval=true,         title="Filter Date Range of Backtest",  group=PERIOD_CONFIG)
backtestStartDateInput = input(defval=useStartDate, title="Start Date",                     group=PERIOD_CONFIG)
backtestEndDateInput   = input(defval=useEndDate,   title="End Date",                       group=PERIOD_CONFIG)

// Colors
bbBackgroundColor  = color.rgb(33, 150, 243, 90)
candleColorDown    = color.rgb(239, 83, 80, 80)
candleColorUp      = color.rgb(38, 166, 154, 70)
insideBarColorDown = color.rgb(239, 83, 80, 40)
insideBarColorUp   = color.rgb(38, 166, 154, 20)
downTrendColor     = color.rgb(239, 83, 80, 80)
sidewaysTrendColor = color.rgb(252, 232, 131, 80)
upTrendColor       = color.rgb(38, 166, 154, 80)
buySignalColor     = color.lime
sellSignalColor    = color.orange

// Candles
isCandleUp()   => close > open
isCandleDown() => close <= open
barcolor(isCandleUp() ? candleColorUp : isCandleDown() ? candleColorDown : na)

// Exponential Moving Averages
fastEMA         = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput),    barmerge.gaps_on,  barmerge.lookahead_on)
currentFastEMA  = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput),    barmerge.gaps_off, barmerge.lookahead_on)
previousFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
slowEMA         = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput),    barmerge.gaps_on,  barmerge.lookahead_on)
currentSlowEMA  = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput),    barmerge.gaps_off, barmerge.lookahead_on)
previousSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)

// Trend Rules for Exponential Moving Averages
isSlowEMAUp()   => currentSlowEMA > previousSlowEMA
isSlowEMADown() => currentSlowEMA < previousSlowEMA
isFastEMAUp()   => currentFastEMA > previousFastEMA
isFastEMADown() => currentFastEMA < previousFastEMA

// Exponential Moving Average Colors
fastEMAColor = isFastEMAUp() ? upTrendColor : isFastEMADown() ? downTrendColor : sidewaysTrendColor
slowEMAColor = isSlowEMAUp() ? upTrendColor : isSlowEMADown() ? downTrendColor : sidewaysTrendColor

// Display Exponential Moving Averages
plot(useFastEMAInput ? fastEMA : na, offset=emaOffsetInput, color=fastEMAColor, title="Fast EMA", style=plot.style_line, linewidth=4)
plot(useSlowEMAInput ? slowEMA : na, offset=emaOffsetInput, color=slowEMAColor, title="Slow EMA", style=plot.style_line, linewidth=7)

// Price Trend
pricesAboveFastEMA() => low[2] > currentFastEMA and low[1] > currentFastEMA and low > currentFastEMA
pricesAboveSlowEMA() => low[2] > currentSlowEMA and low[1] > currentSlowEMA and low > currentSlowEMA
pricesBelowFastEMA() => high[2] < currentFastEMA and high[1] < currentFastEMA and high < currentFastEMA
pricesBelowSlowEMA() => high[2] < currentSlowEMA and high[1] < currentSlowEMA and high < currentSlowEMA

// Market in Bullish Trend
isBullishTrend() =>
    if useFastEMAInput and useSlowEMAInput
        pricesAboveFastEMA() and pricesAboveSlowEMA()
    else if useFastEMAInput
        pricesAboveFastEMA()
    else if useSlowEMAInput
        pricesAboveSlowEMA()
    else
        na

// Market in Bearish Trend
isBearishTrend() =>
    if useFastEMAInput and useSlowEMAInput
        pricesBelowFastEMA() and pricesBelowSlowEMA()
    else if useFastEMAInput
        pricesBelowFastEMA()
    else if useSlowEMAInput
        pricesBelowSlowEMA()
    else
        na

// Stormer Strategy (123)
isFirstCandleUp()   => high[2] > high[1] and low[2] > low[1]
isFirstCandleDown() => high[2] < high[1] and low[2] < low[1]
isThirdCandleUp()   => low > low[1]
isThirdCandleDown() => high < high[1]
isThirdCandleInsideBar() => high < high[1] and low > low[1]

// Buy Signal
isStormer123Buy() =>
    if insideBarStrategyInput
        longEntryInput and isFirstCandleUp() and isThirdCandleInsideBar() and isBullishTrend()
    else
        longEntryInput and isFirstCandleUp() and isThirdCandleUp() and isBullishTrend()

// Sell Signal
isStormer123Sell() =>
    if insideBarStrategyInput
        shortEntryInput and isFirstCandleDown() and isThirdCandleInsideBar() and isBearishTrend()
    else
        shortEntryInput and isFirstCandleDown() and isThirdCandleDown() and isBearishTrend()

// Backtest Time Period
inTradeWindow             = true
isInTradeWindow()         => inTradeWindow
isBacktestDateRangeOver() => not inTradeWindow and inTradeWindow[1]

// Backtest Price Parameters
highestPrice = ta.highest(high, 3)
lowestPrice  = ta.lowest(low,3)
priceRange   = highestPrice - lowestPrice

// Stormer Strategy (123): LONG
var myLongOrders = array.new_int(0)
longtEntryID     = "Long Entry:\n" + str.tostring(bar_index)
longExitID       = "Long Exit:\n" + str.tostring(bar_index)
stopLossInLong   = lowestPrice + 0.01
takeProfitInLong = priceRange + high

longEntryHasBeenMet = isInTradeWindow() and isBullishTrend() and isStormer123Buy()

// Scheduling LONG entry
if longEntryHasBeenMet
    array.push(myLongOrders, bar_index)
    strategy.order(longtEntryID, strategy.long, stop=high)
    strategy.exit(longExitID, longtEntryID, stop=stopLossInLong, limit=takeProfitInLong)

// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myLongOrders) == 0 ? na : array.size(myLongOrders) - 1)
    myLongOrder = array.get(myLongOrders, myOrderIndex)
    if bar_index - myLongOrder == thresholdForEntryInput
        longEntryID = "Long Entry:\n" + str.tostring(myLongOrder)
        strategy.cancel(longEntryID)

// Stormer Strategy (123): SHORT
var myShortOrders = array.new_int(0)
shortEntryID      = "Short Entry:\n" + str.tostring(bar_index)
shortExitID       = "Short Exit:\n" + str.tostring(bar_index)
stopLossInShort   = highestPrice + 0.01
takeProfitInShort = low - priceRange

shortEntryHasBeenMet = isInTradeWindow() and isBearishTrend() and isStormer123Sell()

// Scheduling SHORT entry
if shortEntryHasBeenMet
    array.push(myShortOrders, bar_index)
    strategy.order(shortEntryID, strategy.short, stop=low)
    strategy.exit(shortExitID, shortEntryID, stop=stopLossInShort, limit=takeProfitInShort)

// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myShortOrders) == 0 ? na : array.size(myShortOrders) - 1)
    myShortOrder = array.get(myShortOrders, myOrderIndex)
    if bar_index - myShortOrder == thresholdForEntryInput
        shortEntryID := "Short Entry:\n" + str.tostring(myShortOrder)
        strategy.cancel(shortEntryID)

// Close all positions at the end of the backtest period
if isBacktestDateRangeOver()
    strategy.cancel_all()
    strategy.close_all(comment="Date Range Exit")

// Display Signals
plotshape(series=longEntryHasBeenMet,  title="123 Buy",  style=shape.triangleup,   location=location.belowbar, color=buySignalColor,  text="123", textcolor=buySignalColor)
plotshape(series=shortEntryHasBeenMet, title="123 Sell", style=shape.triangledown, location=location.abovebar, color=sellSignalColor, text="123", textcolor=sellSignalColor)