Основная идея этой стратегии заключается в том, чтобы объединить плюсовые индикаторы с базовыми движущимися средними, чтобы реализовать трендовый отслеживание и трендовую обратную торговлю. Следить за трендом, когда цена совпадает с индикатором; торговать в обратном направлении, когда цена отличается от индикатора.
Стратегия основывается на трёх индивидуальных показателях:
Популярный индикатор ((Trend): рассчитывает связь между ценой и каналом перекупа и перепродажи, определяет тенденции популярных и пустых, возвращает три состояния 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)