Стратегия открытого высокого перекрестка сверх торговли

Автор:Чао Чжан, Дата: 2023-10-18 11:22:57
Тэги:

img

Обзор

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

Логика стратегии

  1. Определить, следует ли использовать альтернативное разрешение, основанное на вводном параметре useRes. Если разрешено, установить разрешение с помощью stratRes.

  2. Решите, использовать ли скользящую среднюю (useMA) на основе входного параметра.

  3. Получить данные серии открытых (открытых) и закрытых (закрытых) цен. Применить выбранный MA с настроенными параметрами, если useMA включен.

  4. Сравните текущую открытую цену x с открытой серией openSeries. Если x больше, чем openSeries, установите trendState на long, в противном случае на short.

  5. Сгенерировать длинный сигнал longCond, когда открытая цена пересекает открытую серию MA. Сгенерировать короткий сигнал shortCond, когда открытая цена пересекает открытую серию MA.

  6. Введите длинные или короткие позиции на основе длинных и коротких сигналов.

Преимущества

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

  2. Методы MA отфильтровывают краткосрочный шум и фокусируются на основной тенденции.

  3. Гибкая конфигурация типов и параметров ОД для оптимального эффекта.

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

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

Риски

  1. Один источник сигнала приводит к дефициту сигналов и потенциально пропущенным сделкам.

  2. Задержка с MA может привести к отсутствию краткосрочных возможностей.

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

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

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

  6. Добавьте больше индикаторов или моделей ML для обогащения источников сигнала. Отметьте типы и параметры MA. Осторожно установите стоп-лосс с некоторым буфером для получения большей прибыли. Тщательно проверьте и оптимизируйте параметры.

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

  1. Включить дополнительные индикаторы, такие как полосы Боллинджера, KD и т. д., чтобы расширить источники сигналов.

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

  3. Оптимизируйте параметры MA, чтобы найти лучшие конфигурации.

  4. Сравните уровни стоп-лосса между риском и получением прибыли.

  5. Добавьте методы оптимизации параметров для автоматического поиска оптимальных настроек.

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

  7. Создать структуры количественного бэкстестинга для быстрой итерации стратегии.

Резюме

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


/*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 ===

Больше