
Эта стратегия является вариантом другой стратегии, которую я использовал ранее для прорыва тренд-трекера. В другой стратегии вы можете использовать движущуюся среднюю в качестве фильтра для торговли (то есть, если цена ниже движущейся средней, она не будет делать много).
Таким образом, эта стратегия позволяет вам просматривать тенденции на более высоких временных рамках (то есть есть есть ли более высокие высокие и более низкие низкие? Если да, то это восходящий тренд). Вы делаете ставки только в направлении тенденции. Вы можете выбрать до двух тенденций в качестве фильтров.
Я обнаружил, что эта стратегия в целом не очень хорошо работает по сравнению с другими стратегиями, но она действительно кажется более выборочной для торгов. Она показывает более высокую выигрышную вероятность и лучший коэффициент прибыли.
Центральная логика этой стратегии заключается в том, чтобы использовать поддержку и сопротивление, которые прорывают более высокие временные рамки, чтобы идентифицировать тенденции и торговать в соответствии с направлением тенденции.
В частности, это достигается путем следующих шагов:
Вычислить уровни поддержки и сопротивления в текущем временном периоде (например, в 1 час). Это достигается путем поиска максимальных и минимальных цен в течение определенного периода.
Вычислить позиции поддержки и сопротивления для одного или нескольких более высоких временных рамок (например, 4-часовой и солнечной). Это реализуется с использованием той же логики, что и в текущих временных рамках.
На графике изображены горизонтальные линии этих уровней поддержки и сопротивления. Когда цена пробивает эти уровни, изменяется тенденция на более высоких временных рамках.
Направление тренда определяется в зависимости от того, пробивает ли цена эти ключевые уровни. Если цена пробивает предыдущую высокую точку, она считается восходящей. Если она пробивает предыдущую низкую точку, она считается нисходящей.
Позволяет пользователям выбирать тенденции в одном или нескольких более высоких временных рамках в качестве фильтрующих условий. Это означает, что торговля будет рассматриваться только в том случае, если направление тенденции в текущем временном рамках совпадает с направлением тенденции в более высоких временных рамках.
Покупка или продажа осуществляется, когда выполняются условия фильтрации тенденции и текущая цена прорывает критический уровень. Уровень остановки убытков устанавливается как предыдущая критическая поддержка или сопротивление.
По мере движения цены, когда формируются новые высокие или низкие точки, стоп-лосс перемещается к новым низким точкам, чтобы закрепить прибыль и отследить тенденцию.
Выход из равной позиции, когда сбой вызывается или ключевая поддержка/сопротивление пробивается.
С помощью такого многовременного анализа трендов стратегия пытается торговать только в направлении более сильной тенденции, чтобы повысить вероятность выигрыша. В то же время, ключевые уровни обеспечивают четкие сигналы входа и остановки.
Использование нескольких временных рамок для определения тенденций позволяет более точно идентифицировать направления сильных тенденций и избегать заблуждения от рынка.
По результатам тестирования эта стратегия показала более высокую выигрышную вероятность и лучшее соотношение риска и прибыли по сравнению с фильтрацией на простых скользящих средних.
Поддержка и сопротивление обеспечивают четкий вход и остановку убытков. Нет необходимости усложнять выбор конкретной точки входа.
Строп-позиции могут быть скорректированы в зависимости от движения тренда, чтобы максимально закрепить прибыль.
Стратегическая логика проста и понятна, легко понять и настроить.
Опираясь на тенденции более длинных линейных сегментов, легко поддаются обману при обратном тренде. Следует соответственно сократить временной цикл определения тенденции или использовать другие показатели для вспомогательного суждения.
Не учитывая фундаментальные последствия, может возникнуть отклонение от цены акций при возникновении крупных событий. Можно добавить фильтрующие условия, такие как события ATM или даты отчетности.
Не устанавливается контроль за размером позиции. Размер позиции может быть установлен в зависимости от размеров средств в счете, волатильности и других факторов.
Срок отсчета ограничен. Срок отсчета должен быть расширен, чтобы проверить устойчивость в различных рыночных условиях.
Не учитывается влияние затрат на транзакции. Параметры стратегии должны быть скорректированы в соответствии с конкретными затратами на транзакции в реальном секторе.
Рассматривать только длинные линии. Можно использовать в сочетании с другими стратегиями для разработки сигналов для коротких линий, чтобы достичь многоциклического арбитража.
Добавить условия фильтра:
Основные данные, такие как финансовые отчеты, новости и другие
Показатели, такие как объем сделок, ATR-стоп и т.д.
Параметры оптимизации:
Период подсчета поддержки/сопротивления
Временные рамки для корректировки тенденций
Расширять масштабы стратегии:
Разработка стратегии короткой торговли
Рассмотреть возможность продажи
Многовидовой арбитраж
Улучшение управления рисками:
Размер оптимальной позиции в зависимости от волатильности и размера капитала
Оптимизация стратегий по прекращению убытков, таких как перемещение убытков, привязка убытков и т. д.
Введение механизма поощрения риска
Оптимизация логики исполнения:
Изменение времени выхода на поле
Рассмотрение части позиций
Оптимизация мобильной стратегии стоп-лосс
Эта стратегия, анализируя тенденции в многократных временных рамках, разработала более прочную систему прорыва. По сравнению с фильтрацией таких показателей, как простая подвижная средняя, она показывает более высокий коэффициент выигрыша и риска по отношению к прибыли. Но есть также некоторые аспекты, которые можно оптимизировать, такие как несовершенная система управления рисками, без учета фундаментальных факторов и т. Д. Если ее оптимизировать дальше, она может стать очень практичной стратегией отслеживания тенденций.
/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-26 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// Revision: 1
// Author: @millerrh
// Strategy: Enter long when recent swing high breaks out, using recent swing low as stop level. Move stops up as higher lows print to act
// as trailing stops. Ride trend as long as it is there and the higher lows aren't breached.
// The difference between this one and the previous Breakout Trend Follower is that this one uses higher timeframe higher highs/higher lows as a filter instead
// of an arbitrary Moving Average. I wanted to test out whether waiting for longer term actual trend changes produced better stats than just the moving average.
// Conditions/Variables
// 1. Manually configure which dates to back test
// 2. Can add a filter to only take setups that are above (or below for shorts) user-defined larger timeframe trends (helps avoid trading counter trend)
// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study()
strategy("Breakout Trend Follower V2", overlay=true, initial_capital=10000, currency='USD',
default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy()
//study("Breakout Trend Follower V2", overlay=true)
// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", type = input.time, group = "Backtest Range")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", type = input.time, group = "Backtest Range")
// == USER INPUTS ==
tableLocation = input(defval="Top", options=["Top", "Bottom"], title = "Info Table Location", group = "Display",
tooltip = "Place information table on the top of the pane or the bottom of the pane.")
lookback = input(defval = 3, title = "Pivot Lookback Period", group = "Pivot Points",
tooltip = "Looks for pivot points within this number of bars both left and right.")
showPivotPoints = input(title = "Show Historical Pivot Points?", type = input.bool, defval = false, group = "Pivot Points",
tooltip = "Toggle this on to see the historical pivot points that were used. Change the Lookback Period to adjust the frequency of these points.
The pivot points are only shown for the current chart timeframe - to see the Daily pivot pionts, use the Daily timeframe, etc.")
trendFilter = input(defval="1st Timeframe", options=["1st Timeframe", "Both Timeframes", "None"], title = "Use HTF Trend for Filtering?", group = "Higher Timeframe Levels",
tooltip = "Signals will be ignored when price is not aligned with the higher timeframe trend(s). The intent is to keep you out of bear periods and only buying when
price is showing strength and you are trading with the trend.")
twoSet = input(defval="D", title="1st High Timeframe", type=input.resolution, group = "Higher Timeframe Levels",
tooltip = "Allows you to set two different time frames for looking at the trend.")
threeSet = input(defval="W", title="2nd High Timeframe", type=input.resolution, group = "Higher Timeframe Levels")
showMTFLevels = input(title = "Show Multiple Timeframe S/R Levels?", type = input.bool, defval = true, group = "Higher Timeframe Levels",
tooltip = "Displays the pivot highs and lows of higher timeframes to use as support/resistance levels. When these levels break, the trend
will change on these higher timeframes.")
currentColorS = input(color.new(color.orange,50), title = "Current Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
currentColorR = input(color.new(color.blue,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
oneColorS = input(color.new(color.yellow,50), title = "1st High Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
oneColorR = input(color.new(color.yellow,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
twoColorS = input(color.new(color.white,50), title = "2nd High Timeframe Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
twoColorR = input(color.new(color.white,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
// == DEFINE FUNCTIONS FOR USE IN MULTIPLE TIMEFRAMES (USING A TUPLE TO AVOID SO MANY SECURITY CALLS) ==
f_getHTF() =>
ph = pivothigh(high, lookback, lookback)
pl = pivotlow(low, lookback, lookback)
highLevel = valuewhen(ph, high[lookback], 0)
lowLevel = valuewhen(pl, low[lookback], 0)
barsSinceHigh = barssince(ph) + lookback
barsSinceLow = barssince(pl) + lookback
timeSinceHigh = time[barsSinceHigh]
timeSinceLow = time[barsSinceLow]
[ph, pl, highLevel, lowLevel, barsSinceHigh, barsSinceLow, timeSinceHigh, timeSinceLow]
[ph_01, pl_01, hL_01, lL_01, bsSH_01, bsSL_01, tSH_01, tSL_01] = security(syminfo.tickerid, "", f_getHTF())
[ph_02, pl_02, hL_02, lL_02, bsSH_02, bsSL_02, tSH_02, tSL_02] = security(syminfo.tickerid, twoSet, f_getHTF())
[ph_03, pl_03, hL_03, lL_03, bsSH_03, bsSL_03, tSH_03, tSL_03] = security(syminfo.tickerid, threeSet, f_getHTF())
// Plot historical pivot points for debugging and configuring the lookback period.
plot(showPivotPoints ? ph_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
plot(showPivotPoints ? pl_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
// == PLOT SUPPORT/RESISTANCE LINES ON THE HIGHER TIMEFRAMES ==
// Use a function to define the lines
f_line(x1, y1, y2, _color) =>
var line id = na
// line.delete(id)
// id := line.new(x1, y1, time, y2, xloc.bar_time, extend.right, _color)
// 1st Timeframe
highLine1 = showMTFLevels ? f_line(tSH_01, hL_01, hL_01, currentColorR) : na
lowLine1 = showMTFLevels ? f_line(tSL_01, lL_01, lL_01, currentColorS) : na
// 2nd Timeframe
highLine2 = showMTFLevels ? f_line(tSH_02, hL_02, hL_02, oneColorR) : na
lowLine2 = showMTFLevels ? f_line(tSL_02, lL_02, lL_02, oneColorS) : na
// 3rd Timeframe
highLine3 = showMTFLevels ? f_line(tSH_03, hL_03, hL_03, twoColorR) : na
lowLine3 = showMTFLevels ? f_line(tSL_03, lL_03, lL_03, twoColorS) : na
// == TREND CALCULATIONS (USING A TUPLE TO CONSOLIDATE REPETATIVE CODE AND GENERATE MULTIPE VARIABLES WITH ONE FUNCTION ==
f_signal(highLevel, lowLevel) =>
uptrendSignal = high > highLevel
downtrendSignal = low < lowLevel
inUptrend = bool(na)
inDowntrend = bool(na)
inUptrend := uptrendSignal[1] ? true : downtrendSignal[1] ? false : inUptrend[1]
inDowntrend := not inUptrend
[uptrendSignal, downtrendSignal, inUptrend, inDowntrend]
[uptrendSignal1, downtrendSignal1, inUptrend1, inDowntrend1] = f_signal(hL_01, lL_01) // 1st Timeframe
[uptrendSignal2, downtrendSignal2, inUptrend2, inDowntrend2] = f_signal(hL_02, lL_02) // 2nd Timeframe
[uptrendSignal3, downtrendSignal3, inUptrend3, inDowntrend3] = f_signal(hL_03, lL_03) // 3rd Timeframe
// == TREND TABLE PLOTTING ==
tablePos = tableLocation == "Top" ? position.top_right : position.bottom_right
var table trendTable = table.new(tablePos, 3, 1, border_width = 3)
upColor = color.rgb(38, 166, 154)
downColor = color.rgb(240, 83, 80)
f_fillCell(_column, _row, _cellText, _c_color) =>
table.cell(trendTable, _column, _row, _cellText, bgcolor = color.new(_c_color, 70), text_color = _c_color, width = 6)
if barstate.islast or barstate.islastconfirmedhistory
f_fillCell(0, 0, inUptrend1 ? "▲" : "▼", inUptrend1 ? upColor : downColor)
f_fillCell(1, 0, inUptrend2 ? "▲ " + twoSet : "▼ " + twoSet, inUptrend2 ? upColor : downColor)
f_fillCell(2, 0, inUptrend3 ? "▲ " + threeSet : "▼ " + threeSet, inUptrend3 ? upColor : downColor)
// Conditions for entry and exit
buyConditions = true
buySignal = high > hL_01 and buyConditions // Code to act like a stop-buy for the Study
sellSignal = low < lL_01 // Code to act like a stop-loss for the Study
// (STRATEGY ONLY) Comment out for Study
strategy.entry("Long", strategy.long, stop = hL_01, when = buyConditions)
// strategy.entry("Long", strategy.long, stop = buyLevel2, when = time > Start and time < Finish and high > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop=lL_01)