
A estratégia combina os dois principais indicadores tecnológicos, o índice de Omaha e o índice de Apollo, para realizar a negociação de binários de binários. Sua idéia básica é encontrar oportunidades de reversão de preços de linhas curtas quando a tendência de linhas médias longas é julgada como hiperactiva, criando hiperactividade; quando a tendência de linhas médias longas é julgada como hiperactiva, procurando oportunidades de rebote de preços de linhas curtas, criando hiperactividade.
A estratégia usa duas médias móveis de 50 e 200 dias para determinar a tendência da linha média longa, com a linha de 50 dias acima da linha de 200 dias indicando uma tendência de múltiplas cabeças e, ao contrário, uma tendência de cabeças vazias.
Em seguida, a estratégia usa o indicador de OMA para localizar oportunidades de reversão de preços de linhas curtas. O indicador de OMA, que inclui a linha% K e a linha% D, respectivamente, é o resultado do indicador de RSI, que foi processado com um simples deslizamento de média móvel. Quando a linha% K desce da zona de superavalia (superior a 80), a quebra da linha% D é um momento de escolha de cabeça vazia, indicando que o preço passou da situação de superavalia para uma queda de rebote; quando a linha% K sobe da zona de superavalia (inferior a 20), a quebra da linha% D é um momento de escolha de cabeça múltipla.
Além disso, a estratégia também introduziu o indicador Apollo para filtrar ainda mais as oportunidades de falsos relatos. O indicador Apollo mostra informações sobre os pontos de extremo para o valor da linha K% D. Quando a linha% K forma novos baixos, significa uma baixa resistência; quando novos altos se formam, significa uma forte resistência. Combinado com o sinal do indicador Oma, isso pode melhorar ainda mais a precisão da entrada.
Especificamente, em uma tendência multi-cabeça, a estratégia verifica novas informações de pontos altos para confirmar a força de um rebote quando o indicador da OMC mostra uma oportunidade multi-cabeça abaixo da zona de superalimento e, ao mesmo tempo, verifica novas informações de pontos baixos para confirmar o enfraquecimento da força de um rebote.
Através do processo descrito acima, a estratégia aproveita as vantagens do discernimento de tendências de linhas médias e longas e dos indicadores de inversão de linhas curtas, construindo um sistema de negociação binário e estável.
A estratégia combina o discernimento de tendências e indicadores de reversão, combinando os benefícios de negociação de tendências e negociação de contracorrentes, formando uma estrutura de negociação mista estável.
A dupla filtragem de indicadores reduz a taxa de falsidade e aumenta a confiabilidade do sinal.
Os parâmetros da estratégia são simples, fáceis de entender e otimizar, adequados para a quantificação de transações.
A estratégia funciona de forma robusta, com melhores taxas de vitória e lucro-lucro.
O uso de uma dupla rota multi-espaço permite a obtenção de oportunidades de negociação contínuas, não se limitando a uma única direção.
Como uma estratégia de inversão, quando a tendência muda, pode ocorrer uma série de perdas consecutivas.
A estratégia exige um alto nível de controle emocional dos traders e exige uma certa taxa de retração.
Alguns parâmetros, como o período de média móvel, possuem certa subjetividade, e é necessário determinar o parâmetro apropriado por meio de otimização de feedback.
Tanto o índice Oma quanto o índice Apollo são sensíveis a variações anormais e podem falhar em situações extremas.
A estratégia é mais adequada para um mercado de liquidação turbulento, e pode ter um impacto negativo em situações de tendência.
Pode-se introduzir filtragem de tendências através de um ajuste adequado do ciclo da média móvel, e adicionar uma estratégia de stop loss para evitar riscos. Quando o mercado entra em uma tendência óbvia, pode-se considerar suspender a estratégia e evitar a negociação nesse ambiente.
Teste diferentes combinações de parâmetros para obter melhores configurações de parâmetros. Por exemplo, você pode tentar usar indicadores como a média móvel suave da EWMA.
A adição de indicadores como Volume ou BV para julgar o desvio pode verificar ainda mais a confiabilidade do sinal.
Adicionar índices de pânico como o VIX como indicadores de monitoramento para reduzir as posições em situações de pânico no mercado.
Optimizar as estratégias de stop loss, por exemplo, usando stop loss dinâmico, como o stop loss ATR.
Introdução de algoritmos de aprendizado de máquina para otimizar dinamicamente a configuração de parâmetros.
Adição de modelos multifatores para melhorar a qualidade do sinal.
A estratégia é, em geral, uma estratégia de negociação quantitativa estável e eficiente. Combina o julgamento da tendência e o indicador de reversão, usando o método de verificação dupla do indicador de Omaha e do indicador Apollo, para detectar efetivamente oportunidades de reversão de preços de curta linha. Em comparação com o uso do sistema de tendência ou do sistema de reversão, a forma da estratégia é mais robusta e o controle de retirada é melhor. É uma estratégia de negociação quantitativa recomendada.
/*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)