
Эта стратегия, объединяющая два основных технических показателя - индекс Омма и индекс Аполлона, позволяет осуществлять многополые двусторонние сделки. Основная идея заключается в том, чтобы искать возможности для входа в короткую линию, когда средне-длинная тенденция считается многополой, и создавать многополой, и искать возможности для входа в короткую линию, когда средне-длинная тенденция считается воздушной.
Эта стратегия использует два движущихся средних, 50-дневную и 200-дневную, для определения средне-длинной линии, где 50-дневная линия выше 200-дневной линии указывает на многоголовый тренд, а наоборот, на воздушный тренд.
Затем стратегия использует индикатор Омма для определения возможности реверса цены на коротких линиях. Индикатор Омма включает в себя %K-линию и %D-линию, которые являются результатом RSI-индикатора, обработанного простым сглаживанием скользящих средних.
Кроме того, для дальнейшей фильтрации возможности ложных сообщений в стратегии также введены индикаторы Аполлона. Индикатор Аполлона показывает информацию о предельных точках значений K-линии % D. Когда % K-линия образует новые низкие точки, это означает слабую резистентность; когда образуется новая высокая точка, это означает сильную резистентность.
В частности, при многооборотном тренде стратегия проверяет новую высокую информацию для подтверждения силы отскока, когда индикатор ОМК показывает, что в зоне перепродажи формируется многооборотное место, а при конъюнктурном тренде стратегия проверяет новую низкую информацию для подтверждения ослабления силы отскока, когда индикатор ОМК показывает, что в зоне перекупа формируется конъюнктурное место.
С помощью вышеупомянутого процесса стратегия использует преимущества средне-длиннолинейного трендового суждения и коротколинейного инверсионного индикатора, чтобы создать устойчивую многополюсную двойную торговую систему.
Эта стратегия объединяет тенденционное суждение и обратный индикатор, а также преимущества трендового и контртрейдинга, чтобы создать стабильную смешанную торговую структуру.
С помощью фильтрации двойных показателей можно уменьшить долю ложных сообщений и повысить надежность сигнала.
Параметры стратегии просты, легко понятны и оптимизируются, и подходят для количественной торговли.
Стратегия работает стабильно, имеет хорошие показатели успешности и прибыльности.
Применение многополосного двустороннего подхода позволяет получать постоянные возможности для торговли, а не ограничиваться одним направлением.
В качестве стратегии обратного характера, когда тенденция меняется, может быть создана серия последовательных потерь.
Стратегия требует большого количества эмоционального контроля от трейдеров и требует определенной доли отмены.
Некоторые параметры, такие как циклы скользящих средних, имеют определенную субъективность и требуют определения подходящих параметров путем оптимизации обратной связи.
Указатели Омма и Аполлон имеют определенную чувствительность к аномальным колебаниям, которые в крайних случаях могут привести к сбоям.
Эта стратегия лучше подходит для нестабильной консолидированной рыночной среды, и ее эффективность может быть снижена при явных тенденциях.
Можно избежать риска, введя фильтрацию тренда с помощью соответствующей корректировки цикла движущихся средних, а также включив стратегию остановки убытков. Когда рынок входит в явную тенденцию, можно рассмотреть возможность приостановить стратегию и избежать торговли в этой среде.
Тестируйте различные комбинации параметров, чтобы получить лучшую параметровую настройку. Например, можно попробовать использовать такие показатели, как плавная подвижная средняя EWMA.
Добавление таких показателей, как Volume или BV, для определения отклонения, может дополнительно подтвердить надежность сигнала.
Присоединение панических индексов, таких как VIX, в качестве мониторинговых показателей для снижения позиций в случае паники на рынке.
Оптимизация стратегий остановки убытков, например, использование динамических методов остановки убытков, таких как остановка ATR.
Внедрение алгоритмов машинного обучения для динамической оптимизации параметров.
Включение многофакторной модели улучшает качество сигнала.
Эта стратегия в целом является стабильной и эффективной количественной торговой стратегией. Она объединяет тенденции и обратные показатели, используя метод двойной проверки показателей Омма и Аполлона, чтобы эффективно выявлять возможности для коротких ценовых обратных линий. Эта стратегия более устойчива, чем использование одной тенденционной системы или обратной системы.
/*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)