Este artigo detalha uma estratégia de negociação de quantificação combinando o indicador de Stoch com a linha de equilíbrio da EMA. Esta estratégia gera um sinal de negociação com base no valor do indicador de Stoch e usa o sinal da EMA, exceto no sentido da direção principal.
Princípios estratégicos
A estratégia opera principalmente através das seguintes ferramentas e lógica:
Calcular um indicador de Stoch composto por valores K e D, cujos valores K refletem mudanças rápidas de preços e os valores D são processados de forma suave;
Configurar uma zona de super-compra e super-venda do indicador de Stoch, gerando um sinal de negociação com base no tamanho relativo dos valores K e D;
Calcular o EMA médio de um determinado período para determinar a direção dominante dos preços;
A negociação só é realizada quando o sinal do indicador de Stoch coincide com a direção da linha média do EMA;
Estabeleça posições de multi-cabeças ou de cabeças vazias de acordo com o sinal e defina um ponto de parada de perda.
Desta forma, o indicador Stoch capta as oportunidades de sobrevenda nas zonas de sobrevenda e elimina os sinais irracionais da EMA, que se combinam para formar uma estratégia de estabilização.
A vantagem estratégica
A principal vantagem desta estratégia é que os indicadores são complementares, com Stoch a julgar sobrecompras e a EMA a julgar a direção da tendência, em combinação com a redução de erros de negociação.
Em segundo lugar, os valores de K e D são ajustáveis e podem ser adaptados para a otimização de parâmetros de diferentes variedades.
Por fim, a configuração de stop-loss também permite que cada transação seja clara quanto ao risco de ganhos e benefícios, ajudando na gestão de fundos.
C. Riscos potenciais
Mas a estratégia também tem os seguintes problemas potenciais:
Em primeiro lugar, tanto o Stoch quanto o EMA podem estar atrasados, o que pode levar a perdas de melhores momentos de negociação.
Em segundo lugar, um stop-loss muito pequeno pode produzir um stop-loss muito ineficaz.
Finalmente, a otimização de múltiplos parâmetros requer muito trabalho para evitar a sobreajuste.
Quatro conteúdos, resumo
Este artigo detalha uma estratégia de negociação quantitativa que combina Stoch e EMA. Pode identificar oportunidades de reversão de zona de sobrevenda e filtrar os sinais de invalidez através do EMA. A estratégia pode obter ganhos estáveis por meio da otimização de parâmetros, mas também deve ter cuidado para evitar e controlar o surgimento dos problemas acima.
/*backtest
start: 2023-08-15 00:00:00
end: 2023-08-26 00:00:00
period: 1h
basePeriod: 15m
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/
//@version=5
strategy(title="EMA Stoch Strategy For ProfitView", overlay=true, calc_on_every_tick=true, process_orders_on_close=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1, initial_capital=1000)
// take profit e stop loss
TakeProfitPercent = input.float(defval = 0.0, title="Take Profit (%) [0 = Disabled]",minval = 0, step=.25,group='TP / SL')
StopLossPercent = input.float(defval = 0.0, title="Stop Loss (%) [0 = Disabled]",minval = 0, step=.25,group='TP / SL')
// Stoch
smoothK = input.int(1, title="K Smoothing", minval=1,group='Stochastic')
periodD = input.int(3, title="D Smoothing", minval=1,group='Stochastic')
lenghtRSI= input.int(14, "RSI Length", minval=1)
lenghtStoch = input.int(14, "Stochastic Length", minval=1)
src = input(close, title="RSI Source")
rsi1 = ta.rsi(src, lenghtRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lenghtStoch), smoothK)
d = ta.sma(k, periodD)
plot(k, title="K", color=#2962FF)
plot(d, title="D", color=#FF6D00)
// bgcolor(color=color.from_gradient(k, 0, 100, color.new(#2962FF, 100), color.new(#2962FF, 95)), title="K BG")
// bgcolor(color=color.from_gradient(d, 0, 100, color.new(#FF6D00, 100), color.new(#FF6D00, 95)), title="D BG")
// ema
src1= input(close,title='Source EMA ',group='EMA')
len1= input(200,title='Length EMA ',group='EMA')
ema1= ta.ema(src1,len1)
plot(ema1,title='EMA',color= color.blue ,linewidth=2)
// signals
LongVal= input(20,title='Stoch below/cross this value for Long signals',group='Signal Options')
scegliLong= input.string('Stoch Below Value', options= ['Stoch Below Value' , 'K&D Cross Below Value' , 'Stoch CrossUp the Value'] , title='Long Signal Type')
long1= scegliLong == 'Stoch Below Value' ? k < LongVal and d < LongVal and close > ema1 : na
long2= scegliLong == 'K&D Cross Below Value' ? ta.cross(k,d) and k < LongVal and d < LongVal and close > ema1 : na
long3= scegliLong == 'Stoch CrossUp the Value' ? ta.crossover(k,LongVal) and close > ema1 : na
shortVal= input(80,title='Stoch above/cross this value for Short signals',group='Signal Options')
scegliShort= input.string('Stoch Above Value', options= ['Stoch Above Value' , 'K&D Cross Above Value' , 'Stoch CrossDown the Value'] , title='Short Signal Type' )
short1= scegliShort == 'Stoch Above Value' ? k > shortVal and d > shortVal and close < ema1 : na
short2= scegliShort == 'K&D Cross Above Value' ? ta.cross(k,d) and k > shortVal and d > shortVal and close < ema1 : na
short3= scegliShort == 'Stoch CrossDown the Value' ? ta.crossunder(k,shortVal) and close < ema1 : na
// Strategy Backtest Limiting Algorithm/
i_startTime = input(defval = timestamp("01 Jan 2014 00:00 +0000"), title = "Backtesting Start Time", inline="timestart", group='Backtesting')
i_endTime = input(defval = timestamp("01 Jan 2100 23:59 +0000"), title = "Backtesting End Time", inline="timeend", group='Backtesting')
timeCond = true
pv_ex = input.string("deribit-testnet", title="Exchange", group='PV Settings')
pv_sym = input.string("btc-perpetual", title="Symbol", group='PV Settings')
pv_acc = input.string("", title="Account", group='PV Settings')
pv_alert_long = input.string("", title="PV Alert Name Longs", group='PV Settings')
pv_alert_short = input.string("", title="PV Alert Name Shorts", group='PV Settings')
pv_alert_cancel = input.string("", title="PV Alert Name TP/SL", group='PV Settings')
profit_abs = (close * (TakeProfitPercent / 100))
stop_abs = (close * (StopLossPercent / 100))
ProfitTarget = TakeProfitPercent > 0 ? profit_abs / syminfo.mintick : na
LossTarget = StopLossPercent > 0 ? stop_abs / syminfo.mintick : na
// Make sure we are within the bar range, Set up entries and exit conditions
var entryprice = 0.0
var profitprice = 0.0
var stopprice = 0.0
exsym = pv_ex == "" ? "" : "ex=" + pv_ex + ","
exsym := pv_sym == "" ? exsym : exsym + "sym=" + pv_sym
if ((long1 or long2 or long3) and timeCond and strategy.position_size <= 0)
strategy.entry("Long", strategy.long, when=barstate.isconfirmed)
entryprice := close
profitprice := entryprice+profit_abs
stopprice := entryprice-stop_abs
tpsl_str = TakeProfitPercent > 0 ? ",mytp=" + str.tostring(profitprice) : ""
tpsl_str := StopLossPercent > 0 ? tpsl_str + ",mysl=" + str.tostring(stopprice) : tpsl_str
alert(pv_alert_long + "(" + exsym + ",acc=" + pv_acc + tpsl_str + ")", alert.freq_once_per_bar_close)
if ((short1 or short2 or short3) and timeCond and strategy.position_size >= 0)
strategy.entry("Short", strategy.short, when=barstate.isconfirmed)
entryprice := close
profitprice := entryprice-profit_abs
stopprice := entryprice+stop_abs
tpsl_str = TakeProfitPercent > 0 ? ",mytp=" + str.tostring(profitprice) : ""
tpsl_str := StopLossPercent > 0 ? tpsl_str + ",mysl=" + str.tostring(stopprice) : tpsl_str
alert(pv_alert_short + "(" + exsym + ",acc=" + pv_acc + tpsl_str + ")", alert.freq_once_per_bar_close)
tpsl_hit_long = (strategy.position_size[1] > 0 and ((TakeProfitPercent > 0 and high > profitprice[1]) or (StopLossPercent > 0 and low < stopprice[1])))
tpsl_hit_short = (strategy.position_size[1] < 0 and ((TakeProfitPercent > 0 and low < profitprice[1]) or (StopLossPercent > 0 and high > stopprice[1])))
if (tpsl_hit_long or tpsl_hit_short)
alert(pv_alert_cancel + "(" + exsym + ",acc=" + pv_acc + ")", alert.freq_once_per_bar)
strategy.exit("Exit Long (TP/SL)", from_entry = "Long" , profit = ProfitTarget, loss = LossTarget)
strategy.exit("Exit Short (TP/SL)", from_entry = "Short", profit = ProfitTarget, loss = LossTarget)
plot(entryprice, title="Entry Price", color=strategy.opentrades > 0 ? color.gray : color.new(color.gray, 100))
plot(profitprice, title="Profit Price", color=strategy.opentrades > 0 and TakeProfitPercent > 0 ? color.green : color.new(color.green, 100))
plot(stopprice, title="Stop Price", color=strategy.opentrades > 0 and StopLossPercent > 0? color.red : color.new(color.red, 100))