Стратегия торговли "Ома" и "Аполлон"

Автор:Чао Чжан, Дата: 2023-11-02 17:09:35
Тэги:

img

Обзор

Эта стратегия сочетает в себе два основных технических индикатора: индикатор Ома и индикатор Аполлон для реализации двойной рельсовой торговли длинными и короткими позициями. Ее основная идея заключается в поиске краткосрочных возможностей отката, когда средне-долгосрочный тренд оценивается как быстрый, чтобы установить длинные позиции. Когда средне-долгосрочный тренд оценивается как медвежий, он ищет возможности в краткосрочных отскоках для установления коротких позиций.

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

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

Далее стратегия использует индикатор Ома для определения краткосрочных возможностей переворота цен. Индикатор Ома включает в себя линии %K и %D, которые являются результатами индикатора RSI, сглаженного простым скользящим средним. Когда %K прорывается ниже %D из зоны перекупленности (выше 80), это указывает на то, что цена переходит от состояния перекупленности к снижению; когда %K прорывается выше %D из зоны перепроданности (ниже 20), это указывает на то, что цена восстанавливается с зоны перепроданности, что представляет собой длительную возможность.

Кроме того, для дальнейшей фильтрации ложных сигналов эта стратегия также включает в себя индикатор Apollo. Индикатор Apollo отображает крайние точки значений %D линии K. Когда %K образует новый минимум, это означает, что сила отскока относительно слаба. Когда он образует новый максимум, это означает, что сила отскока относительно сильна. В сочетании с сигналами от индикатора Oma, это может еще больше улучшить точность входа.

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

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

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

  1. Стратегия сочетает в себе трендовую торговлю и контртендовую торговлю, используя как индикаторы оценки тренда, так и индикаторы обратного движения, формируя стабильную гибридную структуру торговли.

  2. При помощи двойной индикаторной фильтрации соотношение ложного сигнала может быть уменьшено и надежность сигналов улучшена.

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

  4. Результаты стратегии стабильны, с хорошими показателями выигрыша и соотношения риска и прибыли.

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

Риски стратегии

  1. В качестве обратной стратегии возможны последовательные убытки при изменении тренда.

  2. Стратегия требует относительно высокого эмоционального контроля со стороны трейдера, который должен выдержать определенный уровень снижения.

  3. Некоторые параметры, такие как скользящие средние периоды, включают определенную субъективность и должны быть определены с помощью обратного тестирования и оптимизации.

  4. Как индикаторы Ома, так и Аполлон имеют некоторую чувствительность к аномальным колебаниям и могут потерпеть неудачу в экстремальных рыночных условиях.

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

Риски могут быть смягчены путем надлежащей корректировки периода скользящей средней для внедрения фильтрации тренда и добавления стоп-лосса/приобретения прибыли.

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

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

  2. Добавление показателей объема или BV для оценки дивергенции, которые могут помочь проверить надежность сигнала.

  3. Добавьте индексы волатильности, такие как VIX, как индикаторы мониторинга, чтобы уменьшить размер позиции, когда рынок в панике.

  4. Оптимизировать стратегии стоп-лосса/прибыли, например, использовать динамические методы стоп-лосса ATR.

  5. Внедрение алгоритмов машинного обучения для динамической оптимизации параметров.

  6. Добавьте многофакторные модели для улучшения качества сигнала.

Резюме

В целом, это стабильная и эффективная количественная торговая стратегия. Она сочетает в себе суждение о тренде и индикаторы обратного движения и использует двойную верификацию с использованием индикаторов Ома и Аполло, которые могут эффективно выявить возможности краткосрочного переворота цен. По сравнению с использованием чисто тенденционных или обратных систем, эта форма стратегии более надежна с превосходным контролем вывода и является рекомендуемой количественной торговой стратегией. Конечно, пользователям также необходимо знать о связанных рисках и использовать оптимизацию параметров, стоп-лосс / прибыль, идентификацию рыночного режима и т. Д. Для контроля рисков и достижения наилучшей производительности.


/*backtest
start: 2023-10-25 00:00:00
end: 2023-10-28 00:00:00
period: 5m
basePeriod: 1m
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/
// © PtGambler

//@version=5
strategy("2 EMA + Stoch RSI + ATR [Pt]", shorttitle = "2EMA+Stoch+ATR", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500)

// ********************************** Trade Period / Strategy Setting **************************************
startY = input(title='Start Year', defval=2011, group = "Backtesting window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window")
finishY = input(title='Finish Year', defval=2050, group = "Backtesting window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)

// ******************************************************************************************

group_ema = "EMA"
group_stoch = "Stochastic RSI"
group_atr = "ATR Stoploss Finder"

// ----------------------------------------- 2 EMA -------------------------------------

ema1_len = input.int(50, "EMA Length 1", group = group_ema)
ema2_len = input.int(200, "EMA Length 2", group = group_ema)

ema1 = ta.ema(close, ema1_len)
ema2 = ta.ema(close, ema2_len)

plot(ema1, "ema1", color.white, linewidth = 2)
plot(ema2, "ema2", color.orange, linewidth = 2)

ema_bull = ema1 > ema2
ema_bear = ema1 < ema2


// -------------------------------------- Stochastic RSI -----------------------------

smoothK = input.int(3, "K", minval=1, group = group_stoch)
smoothD = input.int(3, "D", minval=1, group = group_stoch)
lengthRSI = input.int(14, "RSI Length", minval=1, group = group_stoch)
lengthStoch = input.int(14, "Stochastic Length", minval=1, group = group_stoch)
src = close
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)

var trigger_stoch_OB = k > 80
var trigger_stoch_OS = k < 20

stoch_crossdown = ta.crossunder(k, d)
stoch_crossup = ta.crossover(k, d)

P_hi = ta.pivothigh(k,1,1)
P_lo = ta.pivotlow(k,1,1)

previous_high = ta.valuewhen(P_hi, k, 1)
previous_low = ta.valuewhen(P_lo, k, 1)
recent_high = ta.valuewhen(P_hi, k, 0)
recent_low = ta.valuewhen(P_lo, k, 0)

// --------------------------------------- ATR stop loss finder ------------------------

length = input.int(title='Length', defval=14, minval=1, group = group_atr)
smoothing = input.string(title='Smoothing', defval='EMA', options=['RMA', 'SMA', 'EMA', 'WMA'], group = group_atr)
m = input.float(0.7, 'Multiplier', step = 0.1, group = group_atr)
src1 = input(high, "Source for upper band", group = group_atr)
src2 = input(low, "Source for lower band", group = group_atr)

showatr = input.bool(true, 'Show ATR Bands', group = group_atr)
collong = input.color(color.purple, 'Long ATR SL', inline='1', group = group_atr)
colshort = input.color(color.purple, 'Short ATR SL', inline='2', group = group_atr)

ma_function(source, length) =>
    if smoothing == 'RMA'
        ta.rma(source, length)
    else
        if smoothing == 'SMA'
            ta.sma(source, length)
        else
            if smoothing == 'EMA'
                ta.ema(source, length)
            else
                ta.wma(source, length)

a = ma_function(ta.tr(true), length) * m
up = ma_function(ta.tr(true), length) * m + src1
down = src2 - ma_function(ta.tr(true), length) * m

p1 = plot(showatr ? up : na, title='ATR Short Stop Loss', color=colshort)
p2 = plot(showatr ? down : na, title='ATR Long Stop Loss', color=collong)

// ******************************* Profit Target / Stop Loss *********************************************

RR = input.float(2.0, "Reward to Risk ratio (X times SL)", step = 0.1, group = "Profit Target")

var L_PT = 0.0
var S_PT = 0.0
var L_SL = 0.0
var S_SL = 0.0

BSLE = ta.barssince(strategy.opentrades.entry_bar_index(0) == bar_index)

if strategy.position_size > 0 and BSLE == 1
    L_PT := close + (close-down)*RR
    L_SL := L_SL[1]
    S_PT := close - (up - close)*RR
    S_SL := up
else if strategy.position_size < 0 and BSLE == 1
    S_PT := close - (up - close)*RR
    S_SL := S_SL[1]
    L_PT := close + (close-down)*RR
    L_SL := down
else if strategy.position_size != 0
    L_PT := L_PT[1] 
    S_PT := S_PT[1]
else
    L_PT := close + (close-down)*RR
    L_SL := down
    S_PT := close - (up - close)*RR
    S_SL := up

entry_line = plot(strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr)

L_PT_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr)
S_PT_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr)

L_SL_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr)

fill(L_PT_line, entry_line, color = color.new(color.green,90))
fill(S_PT_line, entry_line, color = color.new(color.green,90))
fill(L_SL_line, entry_line, color = color.new(color.red,90))
fill(S_SL_line, entry_line, color = color.new(color.red,90))


// ---------------------------------- strategy setup ------------------------------------------------------

var L_entry_trigger1 = false
var S_entry_trigger1 = false

L_entry_trigger1 := ema_bull and close < ema1 and k < 20 and strategy.position_size == 0
S_entry_trigger1 := ema_bear and close > ema1 and k > 80 and strategy.position_size == 0

L_entry1 = L_entry_trigger1[1] and stoch_crossup and recent_low > previous_low
S_entry1 = S_entry_trigger1[1] and stoch_crossdown and recent_high < previous_high

//debugging
plot(L_entry_trigger1[1]?1:0, "L Entry Trigger")
plot(stoch_crossup?1:0, "Stoch Cross Up")
plot(recent_low > previous_low?1:0, "Higher low")

plot(S_entry_trigger1[1]?1:0, "S Entry Trigger")
plot(stoch_crossdown?1:0, "Stoch Cross down")
plot(recent_high < previous_high?1:0, "Lower high")

if L_entry1
    strategy.entry("Long", strategy.long)

if S_entry1
    strategy.entry("Short", strategy.short)

strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit")
strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit")

//resetting triggers
L_entry_trigger1 := L_entry_trigger1[1] ? L_entry1 or ema_bear or S_entry1 ? false : true : L_entry_trigger1
S_entry_trigger1 := S_entry_trigger1[1] ? S_entry1 or ema_bull or L_entry1 ? false : true : S_entry_trigger1

//Trigger zones
bgcolor(L_entry_trigger1 ? color.new(color.green ,90) : na)
bgcolor(S_entry_trigger1 ? color.new(color.red,90) : na)

Больше