Uma estratégia de negociação quantitativa usando múltiplos indicadores técnicos


Data de criação: 2024-01-26 16:19:47 última modificação: 2024-01-26 16:19:47
cópia: 0 Cliques: 693
1
focar em
1617
Seguidores

Uma estratégia de negociação quantitativa usando múltiplos indicadores técnicos

Visão geral

A estratégia é uma estratégia de quantificação de negociação usando vários indicadores técnicos. Usam-se vários indicadores, como EMA, SuperTrend, RSI e MACD, para formar um sinal de negociação.

Princípio da estratégia

A lógica de negociação central da estratégia baseia-se nos seguintes aspectos:

  1. EMA de linha média cruzada: calcula a linha rápida EMA1 e a linha lenta EMA2, gerando um sinal de compra quando a linha rápida atravessa a linha lenta e um sinal de venda quando a linha rápida atravessa a linha lenta.

  2. Linha média VWMA: Calcule a linha média VWMA, que é considerada um sinal de compra quando a linha média é atravessada acima do preço de fechamento e um sinal de venda quando a linha média é atravessada abaixo.

  3. Indicador de SuperTrend: calcula os altos e baixos da SuperTrend com base nos parâmetros ATR e multiplicador e determina a direção da tendência. Produz um sinal de compra em uma tendência ascendente e um sinal de venda em uma tendência descendente.

  4. Indicador RSI: para calcular o indicador RSI, o RSI é considerado um sinal de venda quando está acima da linha de compra e um sinal de compra quando está abaixo da zona de venda.

  5. Indicador MACD: Calcule a linha rápida, a linha lenta e a linha de sinal do MACD, gerando um sinal de compra ao atravessar a linha de sinal na linha rápida e um sinal de venda ao atravessar a linha de sinal abaixo da linha rápida.

Depois de obter os sinais de negociação de vários dos indicadores acima, a estratégia usa a lógica de AND AND para julgar, ou seja, os sinais de compra e venda finais são gerados quando vários indicadores emitem sinais ao mesmo tempo.

Vantagens estratégicas

A estratégia integra vários indicadores para avaliar o mercado e pode ser eficaz na redução de falsos sinais. Os principais benefícios incluem:

  1. A utilização de múltiplos indicadores para filtragem de composição pode reduzir os sinais errados causados por um único indicador.

  2. A combinação de indicadores de tendência e oscilação permite obter lucros adicionais em situações de tendência.

  3. A aplicação de uma lógica de stop-loss perfeita permite um controlo eficaz da perda máxima de uma única transação.

  4. A lógica de duplicação de apostas permite que os perdedores obtenham uma oportunidade de retorno através da adição de posições.

Risco estratégico

A estratégia tem os seguintes riscos:

  1. O portfólio de múltiplos indicadores pode ser muito conservador e perder algumas oportunidades de negociação. Pode ser apropriadamente simplificado.

  2. A lógica de duplicação de posicionamento pode levar à expansão dos prejuízos. Deverá ser razoavelmente estabelecido um limite de posicionamento.

  3. A configuração incorreta da posição de parada pode causar perda desnecessária. A posição de parada adaptável deve ser personalizada.

  4. A configuração inadequada dos parâmetros do indicador pode resultar em excesso de sinais errados. Os parâmetros devem ser otimizados para obter a melhor combinação de parâmetros.

Direção de otimização da estratégia

A estratégia pode ser melhorada em alguns aspectos:

  1. Avaliar a eficácia dos indicadores de diferentes combinações de parâmetros, escolher o peso do indicador.

  2. Teste diferentes configurações de parâmetros do indicador.

  3. Adição de lógica de stop loss adaptativa.

  4. Adesão ao mecanismo de gestão de posições dinâmicas.

  5. Otimizar parâmetros e modelos usando métodos de aprendizagem de máquina.

Resumir

A estratégia geral é uma estratégia de negociação quantitativa muito prática. Combina os benefícios de vários indicadores técnicos clássicos para efetivamente julgar o mercado. A estratégia pode obter melhores resultados de negociação por meio de otimização de parâmetros e repetição de modelos.

Código-fonte da estratégia
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy(title='Pinku Buy', overlay=true)

fromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
fromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
fromYear = input.int(defval=2021, title='From Year', minval=1970)
thruMonth = input.int(defval=1, title='Thru Month', minval=1, maxval=12)
thruDay = input.int(defval=1, title='Thru Day', minval=1, maxval=31)
thruYear = input.int(defval=2112, title='Thru Year', minval=1970)

showDate = input(defval=true, title='Show Date Range')

start = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59)
window() => true
// ema crossover
length1 = input.int(10)
length2 = input.int(20)
ema1 = ta.ema(close , length1)
ema2 = ta.ema(close , length2)
//vwap 
VWAP = ta.vwap(hlc3)
plot(VWAP, color=color.new(color.red, 0), linewidth=3)
buy_1 = close > VWAP
sell_1 = close < VWAP
//vwma 
len = input.int(20, 'VWMA_len', minval=1)
ma = ta.vwma(close, len)
plot(ma, color=color.new(color.navy, 0), linewidth=2)
buy_2 = close > ma
sell_2 = close < ma
//super trend 
//inputs 
Periods = input(title='STR Period', defval=22)
Source = input(hl2, title='Source')
Multiplier = input.float(title='STR Multiplier', step=0.1, defval=5.0)



//Compute ATR Levels 
atr = ta.atr(Periods)


//Creating Upper Channel 

up = Source - Multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up

//Creating Down Channel 
dn = Source + Multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn


//Compute the Trend Stream +1/-1 
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend

//Create Stoploss for Longs 
upPlot = plot(trend == 1 ? up : na, title='Up Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.green, 0))
//buy_a = close > upPlot 
//Buy Signal 
buy_3 = trend == 1 and trend[1] == -1

plotshape(buy_3 ? up : na, title='Go Long', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.green, 0))

dnPlot = plot(trend == 1 ? na : dn, title='Down Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0))
//sell_a = close < dnPlot 
//Sell Signal 
sell_3 = trend == -1 and trend[1] == 1

plotshape(sell_3 ? dn : na, title='Go Short', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(color.red, 0))
// //paraboloic sar 
// start = input(0.02)
// increment = input(0.02)
// maximum = input(0.2, 'Max Value')
// out = ta.sar(start, increment, maximum)


buy_4 = ema1 > ema2
//buy_4 = buy1 and not buy1[1] 
//plotshape(buy_4 , color = color.green , text = "Buy" , location = location.belowbar , textcolor = color.white , style = shape.labelup , size = size.small) 
sell_4 = close < ema2
//sell_4 = sell1 and not sell1[1] 
//plotshape(sell_4, color = color.red , text = "Sell" , location = location.abovebar , textcolor = color.white , style = shape.labeldown , size = size.small) 
plot(ema1, 'ema1', color=color.new(color.green, 0), linewidth=2)
plot(ema2, 'ema2', color=color.new(color.red, 0), linewidth=2)

// rsi
lenr = input(14, title='Rsi Period')
rs = ta.rsi(close, lenr)

over_sold = input(44)
over_bought = input(56)

buy_5 = rs > over_bought 
sell_5 = rs < over_sold 
// macd
slow_len_macd = input.int(12)
fast_len_macd = input.int(26)
signal_len_macd = input.int(9)

ema3 = ta.ema(close , slow_len_macd)
ema4 = ta.ema(close , fast_len_macd)
ema5 = ta.ema(close , signal_len_macd)

buy_6 = ema5 > ema4
sell_6 = ema5 < ema4

// adx
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
//plot(sig, color=color.red, title="ADX")
adx_Greater_than = input.int(25)

signal = sig > adx_Greater_than 
// volume ema 
volume_ema = input.int(10)

vema = ta.ema(volume,volume_ema)

signal_2 = volume > vema



//define buy sell 
g = buy_1 and buy_2 and buy_4 and trend == 1 and buy_5 and buy_6 and signal and signal_2 and window()
r = sell_1 and sell_2 and sell_4 and trend == -1 and sell_5 and sell_6 and signal and signal_2 and window()

rg = 0
rg := r ? 1 : g ? 2 : nz(rg[1])

buy11 = 0
buy11 := r ? 0 : g ? 1 : nz(buy11[1])
sell11 = 0
sell11 := r ? 1 : g ? 0 : nz(sell11[1])

buy = buy11 and not buy11[1]
sell = sell11 and not sell11[1]
multiple_signals = input(true)

if multiple_signals
    buy := g and not g[1] and  window()
    sell := r and not r[1] and  window()
    sell
else
    buy := buy and window()
    sell := sell and window()
    sell



//plotshape(long  , color = color.green , text = "Buy" , location = location.belowbar , textcolor = color.white , style = shape.labelup , size = size.small) 
//plotshape(short   , color = color.red , text = "Sell" , location = location.abovebar , textcolor = color.white , style = shape.labeldown , size = size.small) 
Stop = input(0.5, title='StopLoss') / 100

ProfitPerc = input(defval=1.5, title='Profit') / 100

rev = input(1024,title = "Reverse Limit")

Averaging_position_ = input(true , title = "Averaging position ? ")

qn = 1
qn := nz(qn[1])


long_short = 0
long_last = buy and (nz(long_short[1]) == 0 or nz(long_short[1]) == -1)
short_last = sell and (nz(long_short[1]) == 0 or nz(long_short[1]) == 1)
long_short := long_last ? 1 : short_last ? -1 : long_short[1]

long_entered = false
long_entered := long_entered[1]

short_entered = false
short_entered := short_entered[1]


longPrice = ta.valuewhen(long_last, close, 0)
shortPrice = ta.valuewhen(short_last, close, 0)


longStop = longPrice * (1 - Stop)
shortStop = shortPrice * (1 + Stop)
longTake = longPrice * (1 + ProfitPerc)
shortTake = shortPrice * (1 - ProfitPerc)
plot(long_short == 1 ? longStop : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Fixed SL')
plot(long_short == -1 ? shortStop : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Short Fixed SL')
plot(long_short == 1 ? longTake : na, style=plot.style_linebr, color=color.new(color.navy, 0), linewidth=1, title='Long Fixed TP')


plot(long_short == -1 ? shortTake : na, style=plot.style_linebr, color=color.new(color.navy, 0), linewidth=1, title='Short Fixed TP')


longBar1 = ta.barssince(long_last)
longBar2 = longBar1 >= 1 ? true : false
shortBar1 = ta.barssince(short_last)
shortBar2 = shortBar1 >= 1 ? true : false

longSLhit = long_short == 1 and longBar2 and low < longStop

if long_entered and sell
    longSLhit := true
    longSLhit

plotshape(longSLhit and not(sell and not short_entered and long_entered), style=shape.labelup, location=location.belowbar, color=color.new(color.gray, 0), size=size.tiny, title='Stop Loss', text='Long SL', textcolor=color.new(color.white, 0))
shortSLhit = long_short == -1 and shortBar2 and high > shortStop


if short_entered and buy
    shortSLhit := true
    shortSLhit

plotshape(shortSLhit and not(buy and not long_entered and short_entered), style=shape.labeldown, location=location.abovebar, color=color.new(color.gray, 0), size=size.tiny, title='Stop Loss', text='Short SL', textcolor=color.new(color.white, 0))


longTPhit = long_short == 1 and longBar2 and high > longTake
plotshape(longTPhit, style=shape.labeldown, location=location.abovebar, color=color.new(color.navy, 0), size=size.tiny, title='Target', text='Long TP', textcolor=color.new(color.white, 0))
shortTPhit = long_short == -1 and shortBar2 and low < shortTake
plotshape(shortTPhit, style=shape.labelup, location=location.belowbar, color=color.new(color.navy, 0), size=size.tiny, title='Target', text='Short TP', textcolor=color.new(color.white, 0))

long_short := (long_short == 1 or long_short == 0) and longBar2 and (longSLhit or longTPhit) ? 0 : (long_short == -1 or long_short == 0) and shortBar2 and (shortSLhit or shortTPhit) ? 0 : long_short

if(shortSLhit or longSLhit or (long_entered[1] and sell) or (short_entered[1] and buy ))
    qn := qn*2
 
if(longTPhit or shortTPhit or qn > rev)
    qn := 1
    
if Averaging_position_
    qn := 1
 
plotshape(buy and not long_entered, color=color.new(color.green, 0), style=shape.labelup, text='Buy', textcolor=color.new(color.white, 0), location=location.belowbar)
plotshape(sell and not short_entered, color=color.new(color.red, 0), style=shape.labeldown, text='Sell', textcolor=color.new(color.white, 0), location=location.abovebar)


// plotshape(buy and not(long_entered) and (short_entered), color = color.green , style = shape.labelup , text = "FA Buy" , textcolor = color.white , location = location.belowbar) 
// plotshape(sell and not(short_entered)  and (long_entered), color = color.red , style = shape.labeldown , text = "FA Sell" , textcolor = color.white , location = location.abovebar) 


// alertcondition(condition=buy and  not(long_entered)  and (short_entered), title="Fully Algo Buy") 
// alertcondition(condition=sell and  not(short_entered)  and (long_entered), title="Fully Algo sell") 

alertcondition(condition=buy and not long_entered, title='Buy')
alertcondition(condition=sell and not short_entered, title='Sell')

if long_last
    long_entered := true
    short_entered := false
    short_entered
if short_last
    short_entered := true
    long_entered := false
    long_entered

alertcondition(condition=longSLhit and not(sell and not short_entered and long_entered), title='Long SL')
alertcondition(condition=shortSLhit and not(buy and not long_entered and short_entered), title='Short SL')

alertcondition(condition=longTPhit, title='Long TP')
alertcondition(condition=shortTPhit, title='Short TP')

if longSLhit or longTPhit
    long_entered := false
    long_entered

if shortSLhit or shortTPhit
    short_entered := false
    short_entered

// if buy
//     strategy.entry('buy', strategy.long)
//     strategy.exit('exit', 'buy', limit=longTake, stop=longStop)


// if sell
//     strategy.entry('sell', strategy.short)
//     strategy.exit('exit', 'sell', limit=shortTake, stop=shortStop)
if(buy)
    strategy.entry("buy",strategy.long,qty = qn)
    strategy.exit("Stop","buy",limit = longTake,stop = longStop)
 
if(sell)
    strategy.entry("sell",strategy.short,qty = qn)
    strategy.exit("Stop","sell",limit = shortTake,stop = shortStop)
 
strategy.close("buy",when =  longTPhit or sell or longSLhit, comment = "Target")
strategy.close("sell",when =  shortSLhit or shortTPhit or buy , comment = "Stop Loss")
 
strategy.cancel("buy",when =  longTPhit or sell or longSLhit)
strategy.cancel("sell",when =  shortSLhit or shortTPhit or buy )