
A estratégia de negociação de força de pressão bidirecional é uma estratégia de acompanhamento de tendências que combina indicadores aleatórios e indicadores de volume de transação. A estratégia usa principalmente as linhas K e D dos indicadores aleatórios e os indicadores de volume de transação para gerar sinais de compra e venda, auxiliados por forcas de ouro e forcas mortas de linha uniforme para gerar sinais adicionais.
Os principais sinais de compra são:
A linha K e a linha D quebram simultaneamente a zona de oversold (por exemplo, 20) e produzem uma cruz para cima, e a linha K e a linha D estão simultaneamente em uma tendência ascendente
O volume de negócios é superior a um determinado limite (por exemplo, 1,4 vezes o volume de negócios médio)
Preço de fechamento acima do preço de abertura (linha K branca)
Os sinais de compra adicionais podem vir de:
Forca de ouro de linha média: atravessa a linha de EMA lenta na linha de EMA rápida, com as duas linhas médias subindo ao mesmo tempo
A linha K e a linha D entram simultaneamente na zona de superalimento a partir de níveis baixos (por exemplo, subindo de 20 abaixo para o intervalo de 20 a 80)
A principal lógica de desencadeamento do sinal de venda é:
As linhas K e D entram simultaneamente na zona de superalimento (por exemplo, 80)
Fork de linha média: linha rápida EMA abaixo da linha lenta EMA
A linha K atravessa a linha D e a linha K e a linha D estão em uma tendência descendente
Configure uma determinada porcentagem do preço de compra (por exemplo, 6%) como uma linha de stop-loss, e se o preço cair abaixo dessa linha, o stop-loss será acionado.
Um único indicador aleatório pode produzir uma grande quantidade de falsos sinais. A estratégia usa uma combinação de dois indicadores aleatórios, linha K e linha D (a média móvel da linha K), para filtrar eficazmente os falsos sinais e garantir a confiabilidade do sinal.
A adição de condições de volume de transação como critério de julgamento auxiliar, exigindo que o volume de transação precise exceder um determinado nível, filtrando assim os pontos de compra e venda não-trendentos de baixa quantidade, reduzindo o risco de posição coberta.
A estratégia agrupa vários sinais de compra e venda, como indicadores aleatórios, indicadores de volume de transação e indicadores de linha média, que precisam ser acionados simultaneamente para produzir um verdadeiro sinal de negociação. A sobreposição de vários indicadores pode aumentar a confiabilidade do sinal.
Adicionar regras de mediana de julgamento, por exemplo, só considerar um sinal de compra quando a média cresce rapidamente e lentamente. Isso pode evitar a compra contrária ou o topo, julgar a tendência a partir de um grande período de tempo.
A estratégia contém um design de sinal de stop-loss, que é automaticamente interrompido se o preço cair em uma determinada proporção do tempo de compra. Isso permite controlar efetivamente a perda máxima de uma única transação.
A estratégia inclui vários parâmetros, como parâmetros de indicador aleatório, parâmetros de linha média, parâmetros de volume de transação, etc. Esses parâmetros precisam ser otimizados para diferentes variedades, e a configuração inadequada pode levar a resultados pouco favoráveis.
Ao definir o ponto de parada, é necessário considerar a possibilidade de um salto no preço. Se o ponto de parada estiver muito próximo do preço de compra, o salto no preço pode levar a uma parada desnecessária.
Para variedades com pouca mobilidade, a regra de volume de interação pode filtrar o excesso de sinais. Nesse caso, é necessário reduzir os limites das condições de volume de interação.
Pode ocorrer uma inconsistência de sequência entre os diferentes indicadores de período, o que pode afetar a precisão do sinal. É necessário verificar a consistência da sequência de pontos do sinal.
A estratégia pode ser melhorada em vários aspectos:
Parâmetros de otimização para melhorar a estabilidade
Adição de parâmetros de ajuste dinâmico de métodos de aprendizagem de máquina
Optimizar a estratégia de stop loss para reduzir o stop loss
Adição de mais filtros e menos transações
Tente estratégias de monopólio ou de suspensão para aumentar a taxa de retorno
Os principais parâmetros podem ser otimizados por métodos mais sistemáticos, como algoritmos genéticos, garantindo que os parâmetros obtenham um desempenho estável em diferentes ciclos de mercado.
Pode-se treinar modelos para avaliar o estado do mercado em tempo real e, de acordo com isso, ajustar os parâmetros da estratégia para a otimização dinâmica dos parâmetros.
É possível estudar melhores estratégias de stop loss, reduzindo o máximo possível o stop loss desnecessário e aumentando a margem de lucro, mantendo o controle do risco.
Fortalecer adequadamente as condições de filtragem para reduzir o número de transações, reduzir o impacto dos custos de transação e aumentar o retorno de cada transação.
Dependendo das características do mercado, pode-se projetar uma estratégia única ou uma estratégia de parada móvel, garantindo a parada de perdas e maximizando os lucros.
A estratégia leva em consideração vários aspectos, como o julgamento de tendências, controle de risco e frequência de negociação. A vantagem central é que os indicadores binários aleatórios combinam o julgamento de tendências de indicadores de volume de transação e o mecanismo de parada de controle de risco. O mecanismo de parada pode ser otimizado em termos de aumento da estabilidade dos parâmetros, ajuste dinâmico dos parâmetros e redução da taxa de parada, o que permite que a estratégia obtenha ganhos estáveis em mais ambientes de mercado.
/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
// SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]
// Script created by Sergio Waldoke (BETA VERSION v0.5, fine tuning PENDING)
// Stochastic process is the main source of signals, reinforced on buying by Volume. Also by Golden Cross.
// Selling is determined by K and D entering overselling zone or EMA's Death Cross signal, the first occurring,
// and some other signals combined.
// Buy Long when you see a long buy arrow.
// Sell when you see a close arrow.
// This is a version to be tuned and improved, but already showing excelent results after tune some parameters
// according to the kind of market.
// Strategy ready for doing backtests.
// SVE SYSTEM DESIGN:
// Buy Signal Trigger:
// - Both Stoch <= 20 crossing up and both growing and green candle and Vol/sma vol >= 1.40 Avg Vol
// or
// - Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
// both prior Stoch crossing up
// or
// [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
// - Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle
// Exit position:
// - Both Stoch <= 20 and Both Stoch were > 20 during position
// or
// - CrossingUnder(Fast EMA, Medium EMA)
// or [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
// - CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line
//calc_on_every_tick=true,
//calc_on_order_fills=true, (affects historical calculation, triggers in middle of the bar, may be better for automatic orders)
strategy("SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]", shorttitle="SW SVE", overlay=true, max_bars_back=5000,
default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency="USD",
commission_type=strategy.commission.percent, commission_value=0.25)
//Strategy Parameters
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear = input(defval = 2018, title = "From Year", minval = 2009, maxval = 2200)
ToDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToYear = input(defval = 2030, title = "To Year", minval = 2009, maxval = 2200)
//Indicator Parameters
//Original defaults for 4HS: 14, 3, 80, 20, 14, 23, 40, 20, 40, 3:
stoch_k = input(title="Stoch K", defval=14, minval=1)
stoch_d = input(title="Stoch D", defval=3, minval=1)
over_buying = input(title="Stoch Overbuying Zone", defval=80, minval=0, maxval=100)
over_selling = input(title="Stoch Overselling Zone", defval=20, minval=0, maxval=100)
fast_ema_periods = input(title="Fast EMA (Death Cross)", defval=14, minval=1, maxval=600)
slow_ema_periods = input(title="Slow EMA (Death Cross)", defval=23, minval=1, maxval=600)
trend_ema_periods = input(title="Slowest EMA (Trend Test)", defval=40, minval=1, maxval=600)
volume_periods = input(title="Volume Periods", defval=20, minval=1, maxval=600)
volume_factor = input(title="Min Volume/Media Increase (%)", defval=80, minval=-100) / 100 + 1
threshold_sl_perc = input(title="[Sell Trigger] Stop Loss Threshold %", defval=6.0, type=float, minval=0, maxval=100)
//before_buy = input(title="# Growing Before Buy", defval=2, minval=1)
//before_sell = input(title="# Decreasing Before Sell", defval=1, minval=1)
//stepsignal = input(title="Show White Steps", type=bool, defval=true)
//steps_base = input(title="White Steps Base", defval=242, minval=0)
//Signals
fast_ema = ema(close, fast_ema_periods)
slow_ema = ema(close, slow_ema_periods)
trend_ema = ema(close, trend_ema_periods)
k = stoch(close, high, low, stoch_k)
d = sma(k, stoch_d)
vol_ma = sma(volume, volume_periods)
//REVIEW CONSTANT 1.75:
in_middle_zone(a) => a > over_selling * 1.75 and a < over_buying
growing(a) => a > a[1]
was_in_middle_zone = k == d
was_in_middle_zone := was_in_middle_zone[1] or in_middle_zone(k) and in_middle_zone(d)
//Buy Signal Trigger:
//- Both Stoch <= 20 crossing up and both growing and
// green candle and Vol/sma vol >= 1.40 Avg Vol
buy = k <= over_selling and d <= over_selling and crossover(k, d) and growing(k) and growing(d) and
close > open and volume/vol_ma >= volume_factor
//or
//- Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
// both prior Stoch crossing up
buy := buy or (growing(k) and growing(d) and volume/vol_ma >= volume_factor and close > open and
crossover(k[1], d[1]) )
//Worse:
// (crossover(k[1], d[1]) or (crossover(k, d) and k[1] <= over_selling and d[1] <= over_selling) ) )
//or
// [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
//- Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle
buy := buy or (crossover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and close > open)
//Debug:
//d1 = close > open ? 400 : 0
//plot(d1+5200, color=white, linewidth = 3, style = stepline)
//Exit position:
//- Both Stoch <= 20 and Both Stoch were > 20 during position
sell = k <= over_selling and d <= over_selling and was_in_middle_zone
// or
//- CrossingUnder(Fast EMA, Medium EMA)
sell := sell or crossunder(fast_ema, slow_ema)
// or [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
//- CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line
sell := sell or (crossunder(k, d) and k[1] >= over_buying and d[1] >= over_buying and
not growing(k) and not growing(d) and k <= over_buying)
color = buy ? green : red
bought_price = close
bought_price := nz(bought_price[1])
already_bought = false
already_bought := nz(already_bought[1], false)
//Date Ranges
buy := buy and not already_bought
//d1 = buy ? 400 : 0
//plot(d1+6500, color=white, linewidth = 3, style = stepline)
was_in_middle_zone := (not buy and was_in_middle_zone) or (in_middle_zone(k) and in_middle_zone(d))
already_bought := already_bought[1] or buy
bought_price := buy ? close * (1 - threshold_sl_perc/100) : bought_price[1]
trigger_SL = close < bought_price[0]
sell := sell or trigger_SL
sell := sell and
already_bought and not buy and (was_in_middle_zone or trigger_SL)
//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
already_bought := already_bought[0] and not sell
bought_price := sell ? 0 : bought_price[0]
//plot((was_in_middle_zone?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
was_in_middle_zone := not sell and was_in_middle_zone
//Plot signals
plot(fast_ema, title="Fast EMA", color=red, linewidth = 4)
plot(slow_ema, title="Slow EMA", color=blue, linewidth = 4)
plot(trend_ema, title="Trend EMA", color=yellow, linewidth = 4)
//Stop Loss
plot(bought_price, color=gray, linewidth=2, style=cross, join=true, title="Stop Loss")
//Y = stepsignal ? lowest(40) : na
//Y = steps_base
//plot(mysignal+Y, title="Steps", color=white, linewidth = 3, style = stepline)
//Unit steps - for debugging
//plot(mysteps+Y, title="Steps2", color=yellow, linewidth = 3, style = stepline)
//Bought or not - for debugging
//plot((already_bought?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
plotshape(buy, title="Buy arrows", style=shape.arrowup, location=location.belowbar, color=color, text="Buy", textcolor=color, size=size.huge, transp=30)
plotshape(sell, title="Sell arrows", style=shape.arrowdown, location=location.abovebar, color=color, text="Sell", textcolor=color, size=size.huge, transp=30)
//if n>2000
strategy.entry("buy", strategy.long, when=buy)
strategy.close_all(when=sell)
//plot(strategy.equity, title="Equity", color=white, linewidth = 4, style = line)
//AlertS trigger
//msg = "[SW Magic Signals EMA] BUY/SELL Signal has been triggered." + "(" + tostring(fastema) + ", " + tostring(slowema) + ") on " + tickerid + ", " + period + "."
msg = "SW SVE BUY/SELL Signal has been triggered. (#, #) on EXCH:PAIR, period: #."
alertcondition(buy or sell, title="SW SVE (BUY/SELL SIGNAL)", message=msg)
alertcondition(buy, title="SW SVE (BUY SIGNAL)", message=msg)
alertcondition(sell, title="SW SVE (SELL SIGNAL)", message=msg)