
Открытая кристаллическая стратегия движущихся средних трендовых отслеживания является стратегией движения трендовых отслеживания на основе движущихся средних. Эта стратегия определяет текущий рыночный тренд путем расчета движущихся средних цен на открытии и закрытии; делать больше, когда движущаяся средняя цены на закрытии пересекает движущуюся среднюю цены на открытии; делать пустое, когда движущаяся средняя цены на закрытии пересекает движущуюся среднюю цену на открытии.
Основная логика этой стратегии основана на связи между ценой открытия и ценой закрытия, чтобы судить о текущей тенденции. Открытая цена отражает отношения спроса и предложения на текущем рынке и торговую психологию, а закрытая цена отражает результаты торгов в тот же день. Как правило, если цена закрытия выше, чем цена открытия, то это означает, что в тот день ситуация в движении сильнее, и многосторонняя атмосфера лучше; если цена закрытия ниже, чем цена открытия, то это означает, что в тот день ситуация в движении слабее, и воздушная атмосфера тяжелее.
Эта стратегия использует эту логику, чтобы определить текущую тенденцию, рассчитывая скользящие средние цены открытия и закрытия. В частности, правила ее решения следующие:
Когда скользящая средняя цены закрытия накладывается на скользящую среднюю цены открытия, делается больше. Это означает, что в настоящее время усиливается атмосфера скольжения, и можно войти в скольжение.
Когда движущаяся средняя цены закрытия проходит под движущейся средней цены открытия, делается пустота. Это означает, что в настоящее время воздушная атмосфера усиливается, и можно войти в пустую линию.
Когда произойдет обратный сигнал, первоначальная позиция будет остановлена.
В этой стратегии также установлены стоп-стопы для отслеживания прибыли. После входа, в реальном времени будет рассчитываться разница между ценой входа и текущей ценой. Когда цена будет работать выше установленного количества стоп-стоп, стоп-линия будет скатываться вверх, чтобы заблокировать часть прибыли.
В целом, стратегия оценивает тренд в течение периода длины цикла скользящих средних; занимает позиции только в одном направлении; остановка первоначальной позиции является прямой обратной практикой и не имеет настроек, подобных остановке ATR; есть настройка стоп-трекинга для блокировки прибыли.
Эта стратегия имеет следующие преимущества:
Правила принятия решений ясны и просты.│ │ │ │ │ │ │ │ │ │ │ │ │ │ │
Гибкий выбор типов скользящих среднихЕсть несколько десятков вариантов скользящих средних, которые можно легко комбинировать, чтобы найти оптимальные параметры.
Гибкость в использовании разрешенияДля того, чтобы сигналы были более чувствительными и своевременными, разрешение стратегии может быть установлено в 3-4 раза больше, чем на графике.
Есть механизм погашения убытковВ стратегии установлены стоп-лосы для отслеживания, что позволяет эффективно контролировать одиночные потери и отзывы.
Настраиваемое время хранения│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
Гибкость при корректировке риска и прибыли│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
В этой стратегии есть определенные риски, которые сосредоточены на следующих аспектах:
Пропущенный поворотВыходные сигналы этой стратегии могут быть немного позже, чем обратная сторона цены, что приводит к закрытию хвоста. Это может быть смягчено путем соответствующего сокращения циклов движущихся средних.
Не подходит для города с сильными толчками❚ В условиях сильных колебаний эта стратегия часто открывает позиции, а расходы на них становятся тяжелыми. ❚ В этом случае можно соответственно ослабить количество остановочных пунктов или продлить цикл движущейся средней.
Однозначное суждение。 Стратегия основана только на одном наборе показателей, подверженных влиянию отклонения. Можно рассмотреть возможность введения других показателей, таких как MACD, которые обогащают логику стратегии.
Параметры легко оптимизируются。 Параметры скользящих средних и стоп-паметры легко переоптимизируются, и реальная производительность может быть слабее, чем обратная. 。 Выбор параметров следует рассматривать с осторожностью。
Эта стратегия может быть оптимизирована в следующих направлениях:
Комбинирование с другими показателями◯ можно попробовать внедрить показатели прироста, показатели волатильности и т. д., чтобы обогатить стратегическую логику и повысить стабильность ◯
Периодическая коррекция параметров│ │в зависимости от типа рынка, динамически корректировать параметры скользящих средних, удлинять циклы в трендовых условиях и сокращать циклы в волатильных. │
Динамическая корректировка показателей риска│ может динамически корректировать стоп-пойнты и отклонения на основе реальных колебаний за последнее время │
Улучшение логики стоп-лостаСуществующие ограничения на убытки основаны только на цене и количестве баллов, можно рассмотреть возможность введения более богатых ограничений, таких как ATR.
Стратегия отслеживания трендов с перекрестным движущимся средним является более типичной стратегией для определения направления тренда на основе открытых и закрытых отношений. Она обладает такими преимуществами, как простота правил принятия решений, четкость, гибкость, регулируемость и контролируемые риски, а также проблемы с ошибочными поворотными точками и нежелательными сильными колебаниями. Эта стратегия может быть оптимизирована с помощью богатых показателей, корректировки динамических параметров и усиления логики остановки потерь, что позволяет лучше уловить возможности тренда и реагировать на изменения рынка.
/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title = "Open Close Cross Strategy (PineScript=v4)", shorttitle = "OCC Strategy", overlay = true )
// Revision: 1
// Author: @JayRogers
//
// Description:
// - Strategy based around Open-Close Crossovers.
// Setup:
// - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing
// tends to yield the best results, regardless of which MA option you may choose (if any)
// - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of
// green and red.
// - Option to either use basic open and close series data, or pick your poison with a wide array of MA types.
// - Optional trailing stop for damage mitigation if desired (can be toggled on/off)
// - Positions get taken automagically following a crossover - which is why it's better to set the resolution
// of the script greater than that of your chart, so that the trades get taken sooner rather than later.
// - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine
// will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you
// can handle.
// === INPUTS ===
useRes = input(defval=true, title="Use Alternate Resolution? ( recommended )")
stratRes = input(defval="120", title="Set Resolution ( should not be lower than chart )", type=input.resolution)
useMA = input(defval=true, title="Use MA? ( otherwise use simple Open/Close data )")
basisType = input(defval="DEMA", title="MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )", type=input.string)
basisLen = input(defval=14, title="MA Period", minval=1)
offsetSigma = input(defval=6, title="Offset for LSMA / Sigma for ALMA", minval=0)
offsetALMA = input(defval=0.85, title="Offset for ALMA", minval=0, step=0.01)
useStop = input(defval=true, title="Use Trailing Stop?")
slPoints = input(defval=200, title="Stop Loss Trail Points", minval=1)
slOffset = input(defval=400, title="Stop Loss Trail Offset", minval=1)
// === /INPUTS ===
// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
v1 = sma(src, len) // Simple
v2 = ema(src, len) // Exponential
v3 = 2 * v2 - ema(v2, len) // Double Exponential
v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len) // Triple Exponential
v5 = wma(src, len) // Weighted
v6 = vwma(src, len) // Volume Weighted
sma_1 = sma(src, len) // Smoothed
v7 = na(v5[1]) ? sma_1 : (v5[1] * (len - 1) + src) / len
v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) // Hull
v9 = linreg(src, len, offSig) // Least Squares
v10 = alma(src, len, offALMA, offSig) // Arnaud Legoux
type == "EMA" ? v2 : type == "DEMA" ? v3 : type == "TEMA" ? v4 :
type == "WMA" ? v5 : type == "VWMA" ? v6 : type == "SMMA" ? v7 :
type == "HullMA" ? v8 : type == "LSMA" ? v9 : type == "ALMA" ? v10 : v1
// security wrapper for repeat calls
reso(exp, use, res) =>
security_1 = security(syminfo.tickerid, res, exp)
use ? security_1 : exp
// === /BASE FUNCTIONS ===
// === SERIES SETUP ===
// open/close
variant__1 = variant(basisType, close, basisLen, offsetSigma, offsetALMA)
reso__1 = reso(variant__1, useRes, stratRes)
reso__2 = reso(close, useRes, stratRes)
closeSeries = useMA ? reso__1 : reso__2
variant__2 = variant(basisType, open, basisLen, offsetSigma, offsetALMA)
reso__3 = reso(variant__2, useRes, stratRes)
reso__4 = reso(open, useRes, stratRes)
openSeries = useMA ? reso__3 : reso__4
trendState = bool(na)
trendState := closeSeries > openSeries ? true :
closeSeries < openSeries ? false : trendState[1]
// === /SERIES ===
// === PLOTTING ===
barcolor(color=closeSeries > openSeries ? #006600 : #990000, title="Bar Colours")
// channel outline
closePlot = plot(closeSeries, title="Close Line", color=#009900, linewidth=2, style=plot.style_line, transp=90)
openPlot = plot(openSeries, title="Open Line", color=#CC0000, linewidth=2, style=plot.style_line, transp=90)
// channel fill
closePlotU = plot(trendState ? closeSeries : na, transp=100, editable=false)
openPlotU = plot(trendState ? openSeries : na, transp=100, editable=false)
closePlotD = plot(trendState ? na : closeSeries, transp=100, editable=false)
openPlotD = plot(trendState ? na : openSeries, transp=100, editable=false)
fill(openPlotU, closePlotU, title="Up Trend Fill", color=#009900, transp=40)
fill(openPlotD, closePlotD, title="Down Trend Fill", color=#CC0000, transp=40)
// === /PLOTTING ===
// === STRATEGY ===
// conditions
longCond = crossover(closeSeries, openSeries)
shortCond = crossunder(closeSeries, openSeries)
// entries and base exit
strategy.entry("long", strategy.long, when=longCond)
strategy.entry("short", strategy.short, when=shortCond)
// if we're using the trailing stop
if useStop
strategy.exit("XL", from_entry="long", trail_points=slPoints, trail_offset=slOffset)
strategy.exit("XS", from_entry="short", trail_points=slPoints, trail_offset=slOffset)
// not sure needed, but just incase..
strategy.exit("XL", from_entry="long", when=shortCond)
strategy.exit("XS", from_entry="short", when=longCond)
// === /STRATEGY ===