Стратегия открытого и закрытого перекрестных точек

Автор:Чао Чжан, Дата: 2023-12-13 15:51:13
Тэги:

img

Обзор

Стратегия открытого закрытия кросс-точки - это количественная стратегия торговли, основанная на перекрестных перемещениях скользящих средних. Она определяет ценовые тенденции путем расчета перекрестных перемещений между быстрыми и медленными скользящими средними линиями и генерирует сигналы купли и продажи в точках перекрестности. Эта стратегия использует Hull Moving Average в качестве быстрой линии и Super Smoother filter в качестве медленной линии. Эта комбинация включает в себя как плавность, так и способность определения тренда скользящих средних и может эффективно идентифицировать движения цен для получения относительно надежных торговых сигналов.

Принцип стратегии

Формулы для расчета открытой стратегии закрытой кросс-точки следуют: Быстрая линия (Hull MA): WMA(2 * WMA(цена, n/2) - WMA(цена, n), SQRT(n)) Медленная линия (Супергладкий фильтр): Трехкратный фильтр цены

Где WMA - это взвешенная скользящая средняя, SQRT - это квадратный корень, а фильтр содержит один термин задержки первого порядка и два термина задержки второго порядка.

Стратегия оценивает взаимосвязь между быстрыми и медленными линиями, рассчитывая их значения. Вверх перекресток быстрой линии - это сигнал покупки
Снижающийся перекресток скоростной линии - это сигнал продажи

Анализ преимуществ

Открытая стратегия с закрытыми перекрестными точками сочетает в себе преимущества двойной оценки скользящей средней и точечной торговли. Она может точно фиксировать поворотные моменты тренда для своевременных входов и выходов. По сравнению с едиными стратегиями с скользящей средней она имеет следующие преимущества:

  1. Двойная комбинация скользящих средних исключает ложные сигналы. Быстрая линия определяет направление/силу тренда, медленная линия фильтрует колебания, так что сигналы становятся более надежными.
  2. Супергладкий фильтр обладает превосходными возможностями набора данных для эффективного извлечения тенденций цен.
  3. Hull MA имеет высокую чувствительность к изменениям цен и может своевременно заметить их изменение.

Анализ рисков

Открытая стратегия перекрестного закрытия также сопряжена с определенными рисками:

  1. В период колебаний рынков может возникать больше сигналов, которые могут увеличить интервал между МА, чтобы уменьшить ложные сигналы.
  2. Слишком большие интервалы между МА могут упустить некоторые возможности.
  3. Эта стратегия более подходит для продуктов с более четкими тенденциями, не рекомендуется для продуктов с высокой волатильностью.

Руководство по оптимизации

Стратегия открытой кросс-точки может быть оптимизирована в следующих аспектах:

  1. Корректировка параметров МО в соответствии с продуктами различных периодов и диапазонов волатильности.
  2. Добавьте дополнительные индикаторы или фильтры для определения качества тренда, чтобы уменьшить сбои.
  3. Оптимизировать размещение позиций путем включения индикаторов силы тренда.

Заключение

Открытая стратегия закрытия кросс-точек наследует преимущества движущихся средних стратегий, расширяя использование двойных суждений движущихся средних и точечных торговых моделей для формирования более продвинутой и надежной количественной торговой схемы. У нее есть уникальные преимущества в торговле временем, которые заслуживают живых испытаний и изучения применения.


/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//

strategy(title='Open Close Cross Strategy ', shorttitle='sacinvesting', overlay=true, pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10, calc_on_every_tick=false)

// === INPUTS ===
useRes = input(defval=true, title='Use Alternate Resolution?')
intRes = input(defval=3, title='Multiplier for Alernate Resolution')
stratRes = timeframe.ismonthly ? str.tostring(timeframe.multiplier * intRes, '###M') : timeframe.isweekly ? str.tostring(timeframe.multiplier * intRes, '###W') : timeframe.isdaily ? str.tostring(timeframe.multiplier * intRes, '###D') : timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes, '####') : '60'
basisType = input.string(defval='SMMA', title='MA Type: ', options=['SMA', 'EMA', 'DEMA', 'TEMA', 'WMA', 'VWMA', 'SMMA', 'HullMA', 'LSMA', 'ALMA', 'SSMA', 'TMA'])
basisLen = input.int(defval=8, title='MA Period', minval=1)
offsetSigma = input.int(defval=6, title='Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA = input.float(defval=0.85, title='Offset for ALMA', minval=0, step=0.01)
scolor = input(false, title='Show coloured Bars to indicate Trend?')
delayOffset = input.int(defval=0, title='Delay Open/Close MA (Forces Non-Repainting)', minval=0, step=1)
tradeType = input.string('BOTH', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH', 'NONE'])
// === /INPUTS ===

// Constants colours that include fully non-transparent option.
green100 = #008000FF
lime100 = #00FF00FF
red100 = #FF0000FF
blue100 = #0000FFFF
aqua100 = #00FFFFFF
darkred100 = #8B0000FF
gray100 = #808080FF

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = ta.sma(src, len)  // Simple
    v2 = ta.ema(src, len)  // Exponential
    v3 = 2 * v2 - ta.ema(v2, len)  // Double Exponential
    v4 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len)  // Triple Exponential
    v5 = ta.wma(src, len)  // Weighted
    v6 = ta.vwma(src, len)  // Volume Weighted
    v7 = 0.0
    sma_1 = ta.sma(src, len)  // Smoothed
    v7 := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8 = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))  // Hull
    v9 = ta.linreg(src, len, offSig)  // Least Squares
    v10 = ta.alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11 = ta.sma(v1, len)  // Triangular (extreme smooth)
    // SuperSmoother filter
    // ©️ 2013 John F. Ehlers
    a1 = math.exp(-1.414 * 3.14159 / len)
    b1 = 2 * a1 * math.cos(1.414 * 3.14159 / len)
    c2 = b1
    c3 = -a1 * a1
    c1 = 1 - c2 - c3
    v12 = 0.0
    v12 := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    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 : type == 'TMA' ? v11 : type == 'SSMA' ? v12 : v1

// security wrapper for repeat calls
reso(exp, use, res) =>
    security_1 = request.security(syminfo.tickerid, res, exp, gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
    use ? security_1 : exp

// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries = variant(basisType, open[delayOffset], basisLen, offsetSigma, offsetALMA)
// === /SERIES ===

// === PLOTTING ===

// Get Alternate resolution Series if selected.
closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt = reso(openSeries, useRes, stratRes)
//
trendColour = closeSeriesAlt > openSeriesAlt ? color.green : color.red
bcolour = closeSeries > openSeriesAlt ? lime100 : red100
barcolor(scolor ? bcolour : na, title='Bar Colours')
closeP = plot(closeSeriesAlt, title='Close Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
openP = plot(openSeriesAlt, title='Open Series', color=trendColour, linewidth=2, style=plot.style_line, transp=20)
fill(closeP, openP, color=trendColour, transp=80)

// === /PLOTTING ===
//
//
// === ALERT conditions
xlong = ta.crossover(closeSeriesAlt, openSeriesAlt)
xshort = ta.crossunder(closeSeriesAlt, openSeriesAlt)
longCond = xlong  // alternative: longCond[1]? false : (xlong or xlong[1]) and close>closeSeriesAlt and close>=open
shortCond = xshort  // alternative: shortCond[1]? false : (xshort or xshort[1]) and close<closeSeriesAlt and close<=open
// === /ALERT conditions.

// === STRATEGY ===
// stop loss
slPoints = input.int(defval=0, title='Initial Stop Loss Points (zero to disable)', minval=0)
tpPoints = input.int(defval=0, title='Initial Target Profit Points (zero for disable)', minval=0)
// Include bar limiting algorithm
ebar = input.int(defval=10000, title='Number of Bars for Back Testing', minval=0)
dummy = input(false, title='- SET to ZERO for Daily or Longer Timeframes')
//
// Calculate how many mars since last bar
tdays = (timenow - time) / 60000.0  // number of minutes since last bar
tdays := timeframe.ismonthly ? tdays / 1440.0 / 5.0 / 4.3 / timeframe.multiplier : timeframe.isweekly ? tdays / 1440.0 / 5.0 / timeframe.multiplier : timeframe.isdaily ? tdays / 1440.0 / timeframe.multiplier : tdays / timeframe.multiplier  // number of bars since last bar
//
//set up exit parameters
TP = tpPoints > 0 ? tpPoints : na
SL = slPoints > 0 ? slPoints : na

// Make sure we are within the bar range, Set up entries and exit conditions
if (ebar == 0 or tdays <= ebar) and tradeType != 'NONE'
    strategy.entry('long', strategy.long, when=longCond == true and tradeType != 'SHORT')
    strategy.entry('short', strategy.short, when=shortCond == true and tradeType != 'LONG')
    strategy.close('long', when=shortCond == true and tradeType == 'LONG')
    strategy.close('short', when=longCond == true and tradeType == 'SHORT')
    strategy.exit('XL', from_entry='long', profit=TP, loss=SL)
    strategy.exit('XS', from_entry='short', profit=TP, loss=SL)

// === /STRATEGY ===
// eof



Больше