Стратегия кросс-трейдинга с открытыми скобками и высокой ценой


Дата создания: 2023-10-18 11:22:57 Последнее изменение: 2023-10-18 11:22:57
Копировать: 1 Количество просмотров: 637
1
Подписаться
1621
Подписчики

Стратегия кросс-трейдинга с открытыми скобками и высокой ценой

Обзор

Эта стратегия основана на перекрестных торговых сигналах открытия и высокой цены. Сделать больше, когда цена открывается, и сделать пустое, когда цена открывается. Использование движущихся средних может сгладить данные о цене, уменьшить шум в торговле.

Стратегический принцип

  1. В зависимости от входных параметров определяется, используется ли альтернативная периодическая разрешаемость ((useRes) 。 Если используется, то периодическая разрешаемость устанавливается в соответствии с stratRes 。

  2. В зависимости от входных параметров определяется, используется ли скользящая средняя ((useMA) 。 Если используется, выбирается тип скользящей средней в соответствии с basicType, basisLen устанавливает длину цикла。

  3. Получение серии данных с открытыми (open) и закрытыми (close) ценами. Если используется движущаяся средняя, применяется выбранный тип движущейся средней и гладкая обработка параметров.

  4. Сравнение текущих начальных цен x и начальных цен серии openSeries. Если x больше openSeries, то состояние тренда trendState является многоглавым, в противном случае - пустым.

  5. Долгокондный сигнал при прохождении скользящей средней цены над начальной ценой и короткокондный сигнал при прохождении скользящей средней цены ниже начальной цены.

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

Стратегические преимущества

  1. Используйте две различные серии открытых и высоких цен для определения торговых сигналов, чтобы избежать ограничений одной серии данных.

  2. Использование технологии “движущихся средних” позволяет отфильтровывать краткосрочный рыночный шум и зафиксировать основные тенденции.

  3. Гибкость в настройке типов скользящих средних, приспособление параметров для оптимального эффекта.

  4. Вы можете выбрать использование стоп-лосса для контроля риска и блокировки прибыли.

  5. Есть много возможностей для оптимизации стратегии и параметров для различных сортов и рыночных условий.

Стратегический риск

  1. Сигналы поступают из одного источника, сигналы редки, пропускаются.

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

  3. Неправильные настройки для отслеживания остановки могут привести к преждевременной или слишком большой остановке.

  4. Неправильная настройка параметров может привести к тому, что виртуальные транзакции будут происходить слишком часто, что повлияет на эффективность реального диска.

  5. Различные сорта и рыночные условия требуют корректировки параметров, оптимизация является более сложной.

  6. Можно обогатить источник сигнала, добавив другие показатели суждения или вводя модели машинного обучения. • Настроить типы и параметры скользящих средних для достижения оптимального эффекта сглаживания. • Осторожно установить точку остановки, а также надлежащим образом расширить для получения большей прибыли. • Оптимизировать полное обратное измерение, чтобы гарантировать надежность параметров.

Направление оптимизации стратегии

  1. Добавление других технических показателей, таких как Brin Belt, KD и т.д., обогащает торговый сигнал.

  2. Применение моделей машинного обучения для обработки сигналов.

  3. Оптимизация параметров скользящих средних, чтобы найти оптимальное сочетание параметров.

  4. Оптимизация параметров отслеживания стоп-лосса, балансировка стоп-лосса и получение прибыли.

  5. Добавлена функция оптимизации параметров, которая автоматически ищет оптимальные параметры.

  6. Разработка собственных шаблонов параметров для разных сортов.

  7. Разработать рамки для количественной обратной связи и стратегии быстрого воспроизводства.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2022-10-17 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

//strategy(title = "Open Close Cross Strategy", shorttitle = "OCC Strategy", overlay = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

// 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 )")
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 )")
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
    v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    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) => use ? request.security(syminfo.tickerid, res, exp) : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
//closeSeries = useMA ? reso(variant(basisType, close, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(close, useRes, stratRes)
openSeries  = useMA ? reso(variant(basisType, open, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(open, useRes, stratRes)
x = openSeries[1]
trendState  = x > openSeries ? true : x < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color = x > openSeries ? #006600 : #990000, title = "Bar Colours")
// channel outline
closePlot   = plot(x, title = "Close Line", color = #009900, linewidth = 2, style = line, transp = 90)
openPlot    = plot(openSeries, title = "Open Line", color = #CC0000, linewidth = 2, style = line, transp = 90)
// channel fill
closePlotU  = plot(trendState ? x : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? openSeries : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : x, 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(openSeries, x)
shortCond   = crossunder(openSeries, x)
// entries and base exit
strategy.entry("long", true, when = longCond)
strategy.entry("short", false, 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 ===