Эта стратегия является вариацией моей другой стратегии Breakout Trend Follower. В другой стратегии вы можете использовать скользящую среднюю, чтобы выступать в качестве фильтра для ваших сделок (т.е. если цена ниже скользящей средней, она не будет длиться долго). После создания инструмента, который обнаруживает тенденции в более высокие временные рамки, я хотел посмотреть, может ли это быть лучшим фильтром, чем скользящая средняя.
Таким образом, этот сценарий позволяет вам смотреть на более высокие временные тренды (т.е. есть ли более высокие максимумы и более высокие минимумы? Если да, то это восходящий тренд). Вы принимаете сделки только тогда, когда вы находитесь с трендом. У вас есть возможность выбрать до двух трендов, чтобы выступать в качестве фильтра. Каждое направление тренда показано на таблице на графике для легкой справки.
Я обнаружил, что в целом эта стратегия не работает так хорошо, как другая, но она, кажется, намного более придирчива к сделкам. показывает более высокие показатели выигрыша и лучший коэффициент прибыли.
Основная логика этой стратегии заключается в определении тенденций с использованием прорывов уровней поддержки и сопротивления в более высокие временные рамки и осуществлении сделок в направлении тенденции.
В частности, он осуществляет следующие шаги:
Вычислить уровни поддержки и сопротивления на текущем временном интервале (например, 1 час).
Вычислить уровни поддержки и сопротивления по одному или нескольким более высоким временным рамкам (например, 4 часа и ежедневно).
Наградите эти уровни поддержки и сопротивления горизонтальными линиями на графике.
Определить направление тренда, основываясь на том, превышает ли цена предыдущие высокие или низкие точки. Превышение предыдущего максимума указывает на восходящий тренд. Превышение предыдущего минимума указывает на понижающий тренд.
Разрешить пользователю выбрать один или несколько тенденций более высоких временных рамок в качестве условия фильтрации. То есть рассматривать возможность совершения сделок только тогда, когда текущая тенденция временных рамок согласуется с тенденцией более высоких временных рамок.
Когда условие фильтра тренда выполнено, и текущая цена превышает ключевой уровень, вводят длинный или короткий.
По мере движения цены, скорректируйте стоп-лосс на новые низкие точки, чтобы зафиксировать прибыль и следовать тренду.
Выход при запуске стоп-лосса или нарушении ключевого уровня поддержки/сопротивления.
Анализируя тенденции в нескольких временных рамках, стратегия пытается торговать только в направлении более сильных тенденций для улучшения показателя выигрыша.
Использование нескольких временных рамок для оценки тенденций может более точно определить более сильное направление тренда, избегая шума.
По сравнению с простым фильтром скользящей средней, эта стратегия показала более высокий показатель выигрыша и соотношение риск-вознаграждение.
Уровни поддержки и сопротивления обеспечивают четкие уровни входа и остановки убытков.
Корректировка остановок вдоль тренда для максимизации прибыли.
Простая и ясная стратегия логики, легко понять и оптимизировать.
Опирается на более долгосрочные тенденции, склонны к тому, чтобы попасть в ловушку перемены тренда.
Не учитывает фундаментальные воздействия, может отклоняться от цены на крупные события.
Не устанавливается контроль размеров позиций, необходимо оптимизировать размер по размеру счета, волатильности и т.д.
Ограниченный период обратного тестирования.
Не учитывая затраты на торговлю, параметры должны быть скорректированы на основе фактических затрат.
Может разрабатывать сигналы для краткосрочных сделок для реализации стратегий с несколькими временными рамками.
Добавить условия фильтра:
Фундаментальные данные, такие как доходы, новости
Показатели, такие как объем, остановки 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)