
La estrategia combina los dos indicadores tecnológicos principales, el índice Omaha y el índice Apollo, para lograr un comercio de dos vías múltiples. Su idea básica es buscar oportunidades de rebote en el precio de la línea corta cuando la tendencia de la línea media larga se determina como de cabeza alta y establecer cabeza baja cuando la tendencia de la línea media larga se determina como de cabeza baja.
La estrategia utiliza dos promedios móviles de 50 y 200 días para determinar la tendencia de la línea media larga, la línea de 50 días por encima de la línea de 200 días indica una tendencia de múltiples cabezas, por el contrario, una tendencia de cabeza vacía.
Luego, la estrategia utiliza el indicador de Omma para ubicar oportunidades de reversión de precios de la línea corta. El indicador de Omma incluye la línea% K y la línea% D, respectivamente, que son el resultado de un indicador RSI tratado con un suavizado promedio móvil simple. Cuando la línea% K desciende desde la zona de sobreventa (por encima de 80) y rompe la línea% D, indica que el precio ha pasado de la zona de sobreventa a la rebote, y es una oportunidad de elección de la cabeza; cuando el% K sube desde la zona de sobreventa (por debajo de 20) y rompe la línea% D, indica que el precio ha rebotado desde la zona de sobreventa, y es una oportunidad de elección de la cabeza.
Además, para filtrar aún más las oportunidades de errores, la estrategia también introdujo el indicador Apolo. El indicador Apolo muestra información sobre el punto máximo del valor de la línea K% D. Cuando la línea% K forma nuevos puntos bajos, significa una resistencia más débil; cuando se forman nuevos puntos altos, significa una resistencia más fuerte. Combinado con la señal del indicador Oma, esto puede mejorar aún más la precisión de la entrada.
Concretamente, en una tendencia de varios extremos, la estrategia comprueba la fuerza de un rebote al mismo tiempo que se examina la nueva información de los picos cuando el indicador de la OMR muestra que se forman oportunidades de varios extremos debajo de la zona de venta por encima; en una tendencia de los extremos, la estrategia comprueba la fuerza de un rebote al mismo tiempo que se examina la nueva información de los puntos bajos cuando el indicador de la OMR muestra que se forman oportunidades de varios extremos debajo de la zona de compra por encima.
A través de los procesos mencionados, la estrategia aprovecha las ventajas del juicio de tendencia de la línea media-larga y el indicador de reversión de la línea corta, para construir un sistema de comercio de dos vías estable y plurivolar.
La estrategia combina un juicio de tendencia y un indicador de reversión, combinando las ventajas de la negociación de tendencia y la negociación de contratiempo, para formar un marco de negociación de mezcla estable.
Mediante el filtro de doble indicador, se puede reducir el porcentaje de falsos informes y mejorar la fiabilidad de la señal.
Los parámetros de la estrategia son simples, fáciles de entender y optimizar, adecuados para la transacción cuantitativa.
La estrategia funciona bien, con una mejor tasa de ganancias y pérdidas.
La adopción de un método de doble vía multiespacial permite obtener oportunidades de negociación continuas y no limitadas a una sola dirección.
Como estrategia de inversión, cuando la tendencia cambia, puede producirse una serie de pérdidas consecutivas.
La estrategia requiere un alto control de las emociones de los comerciantes y requiere un cierto porcentaje de retiro.
Algunos parámetros, como el ciclo de las medias móviles, tienen cierta subjetividad, por lo que es necesario determinar el parámetro adecuado mediante la optimización de la retroalimentación.
Tanto el índice Oma como el índice Apollo son sensibles a las fluctuaciones anormales y pueden fallar en situaciones extremas.
La estrategia es más adecuada para un contexto de mercado de liquidación de la volatilidad, y la eficacia puede ser rebajada en situaciones de tendencia evidente.
Se puede evitar el riesgo introduciendo filtros de tendencia y agregando estrategias de stop loss para evitar el riesgo al ajustar adecuadamente el ciclo de las medias móviles. Cuando el mercado entra en una tendencia evidente, se puede considerar suspender la estrategia para evitar la negociación en ese entorno.
Prueba diferentes combinaciones de parámetros para obtener una mejor configuración de parámetros. Por ejemplo, puedes intentar usar indicadores como las medias móviles lisas de EWMA.
Añadir indicadores como Volumen o BV para juzgar la desviación puede verificar aún más la fiabilidad de la señal.
Incorporar índices de pánico como el VIX como indicadores de monitoreo para reducir posiciones en momentos de pánico en el mercado.
Optimización de las estrategias de stop loss, por ejemplo, mediante la adopción de métodos de stop loss dinámicos como el stop loss ATR.
Introducir algoritmos de aprendizaje automático para optimizar dinámicamente la configuración de los parámetros.
La inclusión de modelos multifactoriales para mejorar la calidad de la señal.
La estrategia en general es una estrategia de comercio cuantitativo estable y eficiente. Combina el juicio de la tendencia y el indicador de reversión, utiliza el índice de Omaha y el indicador Apollo de doble verificación, para detectar eficazmente las oportunidades de reversión de precios de la línea corta. En comparación con el uso de un sistema de tendencia o de reversión, la forma de la estrategia es más robusta, el control de retiro es mejor, y es una estrategia de comercio cuantitativa recomendable.
/*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)