Основная идея этой стратегии состоит в том, чтобы объединить индикатор двойной тяги с базовой скользящей средней линией для реализации следующей тенденции и обратной торговли.
Стратегия основывается на трех индивидуальных показателях:
Индикатор двойной тяги (Тенденция): рассчитывает взаимосвязь между ценой и каналом перекупленности/перепроданности для определения бычьих и медвежих тенденций, возвращая 1, 0, -1 три состояния.
Перекупленный/перепроданный канал (Tsl): рассчитывает верхний и нижний рельсы с учетом ATR. Прорыв верхнего рельса считается перекупленным, а прорыв нижнего рельса считается перепроданным.
Основная скользящая средняя линия (MA): рассчитывает 20-периодную простую скользящую среднюю цену закрытия.
В частности, стратегия определяет, находится ли цена в бычьем, боковом или медвежьем состоянии в соответствии с значением индикатора двойного толчка. Когда индикатор двойного толчка равен 1, это означает бычье состояние; когда индикатор двойного толчка равен -1, это означает медвежье состояние.
Кроме того, прорыв цены на скользящей средней линии также служит вспомогательным сигналом для руководства направлением торговли.
Конкретные стратегии длинной торговли следующие:
Двойной индикатор тяги > 0, цена поднимается, чтобы прорваться через верхнюю рельсу, которая принадлежит следующей тенденции, идти длинный.
Двойной индикатор тяги < 0, цена падает, чтобы прорваться через нижний рельс, который относится к обратному тренду, идти короткий.
Цена закрытия > Цена открытия > Пивовый уровень, рассматриваемый как разрыв пивова для длинного хода, длинного хода.
Цена закрытия переходит через верхнюю рельсу, а цена закрытия > Движущаяся средняя линия, переходит в длинный курс.
Стратегии короткой торговли следующие:
Двойной индикатор тяги < 0, цена падает, чтобы прорваться через нижний рельс, который относится к следующему тренду, идти коротко.
Двойной индикатор тяги > 0, цена поднимается, чтобы прорваться через верхнюю рельсу, которая относится к обратному тренду, идти длинный.
Цена открытия > Цена закрытия < Пивовый уровень, рассматриваемый как разрыв пивового курса для покупки, покупки.
Цена закрытия проходит через нижнюю рельсу, и цена закрытия < Линия скользящей средней, идет коротко.
Стратегия выхода проста: остановить убытки, когда цена снова пройдет через канал перекупленности/перепроданности.
Стратегия имеет следующие преимущества:
Показатель двойной тяги может точно определить тенденцию рынка и является основным показателем стратегии.
Перекупленный/перепроданный канал в сочетании с индикатором может выявить потенциальные возможности для реверсии.
Основная линия скользящей средней может служить вспомогательным фильтрующим сигналом для предотвращения ложных прорывов.
Опорная точка в сочетании с двойным индикатором тяги формирует высоковероятные торговые точки.
У него есть как следующие тенденции, так и возможности обратной торговли для получения большего количества возможностей получения прибыли.
Сток-лосс перекупленного/перепроданного канала прост и ясен, что полезно для контроля рисков.
Стратегия также имеет следующие риски:
Двойной индикатор тяги может давать неправильные сигналы и должен быть отфильтрован другими индикаторами.
Брейк-трейдинг подвержен ловушке, поэтому требуется строгий стоп-лосс.
Неправильное установление скользящей средней продолжительности может пропустить тенденции или создать ложные сигналы.
Опорные точки нуждаются в обратном тестировании для проверки надежности вероятности.
Перекупленный/перепроданный канал нуждается в оптимизации параметров для адаптации к различным продуктам.
Несоответствие параметров показателей может привести к частой торговле.
Для устранения этих рисков могут быть приняты следующие меры:
Комбинируйте другие показатели, например, K-линию, громкость, чтобы проверить сигналы двойного индикатора тяги.
Соблюдайте строгую стратегию перекупленного/перепроданного стоп-лосса для быстрого стоп-лосса.
Испытайте различные параметры скользящей средней продолжительности, чтобы найти оптимальный.
Полностью проверьте вероятность стратегии по поводу точки поворота.
Оптимизируйте параметры, чтобы найти оптимальную комбинацию для каждого продукта.
Регулируйте параметры индикатора, чтобы сохранить бесперебойную работу всей системы.
Стратегия также может быть оптимизирована в следующих аспектах:
Увеличить алгоритмы машинного обучения для обучения двойного индикатора тяги с большими данными. Это может улучшить точность и уменьшить ложные сигналы.
Добавление адаптивных каналов для автоматической корректировки параметров канала на основе волатильности рынка.
Используйте глубокое обучение для извлечения более изменчивых индикаторов для оптимизации стратегий входа и выхода.
Добавьте продвинутые алгоритмы стоп-лосса, которые могут отслеживать тенденции для стоп-лосса, избегая отмены.
Провести оптимизацию параметров и испытания комбинаций для улучшения общей стабильности стратегии.
Добавить модули управления рисками для более научного контроля риска.
Стратегия сочетает в себе последовательность тренда и изменение тренда органично, оценивая структуру рынка с помощью двойного индикатора тяги и генерируя торговые сигналы с помощью каналов и скользящих средних линий. Она имеет преимущества хорошей эффективности индикатора, обильных торговых возможностей и четкой стоп-лосс. В то же время, она также имеет определенные риски, которые требуют дальнейшей оптимизации для улучшения стабильности. В целом, стратегия полностью интегрирует идеи трендовой торговли и реверсионной торговли и стоит дальнейших исследований и применения.
/*backtest start: 2023-08-25 00:00:00 end: 2023-09-24 00:00:00 period: 2h basePeriod: 15m 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/ // © amysojexson //@version=3 strategy(title="Pivots strategy", overlay=true) // Input settings // Create a pull-down menu for the pivot type pivotType = input(title="Pivot Type", options=["Daily", "Intraday", "Weekly"], defval="Daily") // Make toggles for pivot level options plotPP = input(title="Plot PP", type=bool, defval=true) plotS1R1 = input(title="Plot S1 and R1", type=bool, defval=true) plotS2R2 = input(title="Plot S2 and R2", type=bool, defval=true) plotS3R3 = input(title="Plot S3 and R3", type=bool, defval=true) plotTCBC = input(title="Plot S3 and R3", type=bool, defval=true) // Configure session options sessRange = input(title="Trading Session", defval="0800-1600") showSess = input(title="Highlight Session?", type=bool, defval=false) // Enable or disable pivot labels showLabels = input(title="Show Labels?", type=bool, defval=false) // Step 2. Calculate indicator values // Create a function to fetch daily and weekly data GetData(res, data) => security(syminfo.tickerid, res, data[1], lookahead=barmerge.lookahead_on) // Fetch daily and weekly price data dailyHigh = GetData("D", high) dailyLow = GetData("D", low) dailyClose = GetData("D", close) weeklyHigh = GetData("W", high) weeklyLow = GetData("W", low) weeklyClose = GetData("W", close) // Determine session pivot data // First see how the price bar relates to // the session time range inSession = not na(time(timeframe.period, sessRange)[1]) sessStart = inSession and not inSession[1] sessEnd = not inSession and inSession[1] // Determine session price data sessHigh = 0.0 sessLow = 0.0 sessClose = 0.0 sessHigh := sessStart ? high : inSession ? max(high, sessHigh[1]) : na sessLow := sessStart ? low : inSession ? min(low, sessLow[1]) : na sessClose := sessEnd ? close[1] : na // Compute high, low, close from previous intra-day session highPrevSess = 0.0 lowPrevSess = 0.0 closePrevSess = 0.0 highPrevSess := sessEnd ? fixnan(sessHigh) : highPrevSess[1] lowPrevSess := sessEnd ? fixnan(sessLow) : lowPrevSess[1] closePrevSess := sessEnd ? fixnan(sessClose) : closePrevSess[1] // Now figure out which kind of price data // to use for the pivot calculation theHigh = if (pivotType == "Daily") dailyHigh else if (pivotType == "Intraday") highPrevSess else weeklyHigh theLow = if (pivotType == "Daily") dailyLow else if (pivotType == "Intraday") lowPrevSess else weeklyLow theClose = if (pivotType == "Daily") dailyClose else if (pivotType == "Intraday") closePrevSess else weeklyClose // Finally calculate the pivot levels pp = (theHigh + theLow + theClose) / 3 bc= (theHigh + theLow)/2 tc= (pp-bc)+pp r1 = pp+(.382*(theHigh-theLow)) s1 = pp-(.382*(theHigh-theLow)) r2 = pp +(.618*(theHigh-theLow)) s2 = pp -(.618*(theHigh-theLow)) r3 = pp +(1*(theHigh-theLow)) s3 = pp -(1*(theHigh-theLow)) // Step 3. Output indicator data // Plot the various pivot levels plot(series=plotS3R3 ? r3 : na, title="R3", style=circles, linewidth=1, color=#0023FF) plot(series=plotS2R2 ? r2 : na, title="R2", style=circles, linewidth=1, color=#1E90FF) plot(series=plotS1R1 ? r1 : na, title="R1", style=circles, linewidth=1, color=#09E0F3) plot(series=plotTCBC ? tc : na, title="TC", style=circles, linewidth=.75, color=#FF00D1) plot(series=plotPP ? pp : na, title="PP", style=circles, linewidth=1, color=#000000) plot(series=plotTCBC ? bc : na, title="BC", style=circles, linewidth=.75, color=#FF00D1) plot(series=plotS1R1 ? s1 : na, title="S1", style=circles, linewidth=1, color=#09E0F3) plot(series=plotS2R2 ? s2 : na, title="S2", style=circles, linewidth=1, color=#1E90FF) plot(series=plotS3R3 ? s3 : na, title="S3", style=circles, linewidth=1, color=#0023FF) // Display the pivot names on the chart, if applicable newPivots = (showLabels == false) ? false : (pivotType == "Intraday") ? sessEnd : (pivotType == "Daily") ? dayofmonth != dayofmonth[1] : dayofweek == monday and dayofmonth != dayofmonth[1] plotchar(series=newPivots and plotS3R3 ? r3 : na, char='', text="R3", offset=1, location=location.absolute, color=#0023FF, title="R3 label") plotchar(series=newPivots and plotS2R2 ? r2 : na, char='', text="R2", offset=1, location=location.absolute, color=#1E90FF, title="R2 label") plotchar(series=newPivots and plotS1R1 ? r1 : na, char='', text="R1", offset=1, location=location.absolute, color=#09E0F3, title="R1 label") plotchar(series=newPivots and plotTCBC ? r1 : na, char='', text="TC", offset=1, location=location.absolute, color=#FF00D1, title="TC label") plotchar(series=newPivots and plotTCBC ? r1 : na, char='', text="BC", offset=1, location=location.absolute, color=#FF00D1, title="BC label") plotchar(series=newPivots and plotS1R1 ? s1 : na, char='', text="S1", offset=1, location=location.absolute, color=#09E0F3, title="S1 label") plotchar(series=newPivots and plotS2R2 ? s2 : na, char='', text="S2", offset=1, location=location.absolute, color=#1E90FF, title="S2 label") plotchar(series=newPivots and plotS3R3 ? s3 : na, char='', text="S3", offset=1, location=location.absolute, color=#0023FF, title="S3 label") // Highlight the intra-day price data session on the chart bgcolor(color=showSess and inSession and (pivotType == "Intraday") ? orange : na, transp=95) // Step 4. Create indicator alerts alertcondition(condition=cross(close, s3), title="Pivot S3 Cross", message="Prices crossed Pivot S3 level") alertcondition(condition=cross(close, s2), title="Pivot S2 Cross", message="Prices crossed Pivot S2 level") alertcondition(condition=cross(close, s1), title="Pivot S1 Cross", message="Prices crossed Pivot S1 level") alertcondition(condition=cross(close, tc), title="Pivot TC Cross", message="Prices crossed Pivot TC level") alertcondition(condition=cross(close, pp), title="Pivot PP Cross", message="Prices crossed the main Pivot Point level") alertcondition(condition=cross(close, bc), title="Pivot BC Cross", message="Prices crossed Pivot BC level") alertcondition(condition=cross(close, r1), title="Pivot R1 Cross", message="Prices crossed Pivot R1 level") alertcondition(condition=cross(close, r2), title="Pivot R2 Cross", message="Prices crossed Pivot R2 level") alertcondition(condition=cross(close, r3), title="Pivot R3 Cross", message="Prices crossed Pivot R3 level") MA = sma(close, 20) plot(MA, color=red) Factor = input(2, type=float) Pd = input(10, minval=1,maxval = 100) Up = hl2-(Factor*atr(Pd)) Dn = hl2+(Factor*atr(Pd)) TrendUp = 0.0 TrendUp := close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up TrendDown = 0.0 TrendDown := close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn Trend = 0.0 Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1) Tsl = Trend==1? TrendUp: TrendDown plot(Tsl, color=blue) if close>open if open<pp if close>pp if close>MA strategy.entry("long", true) if close<open if open>pp if close<pp if close<MA strategy.entry("short", false) strategy.close("long", when = open<Tsl) strategy.close("short", when = open>Tsl)