Estrategia integral de indicadores técnicos


Fecha de creación: 2023-10-07 15:34:33 Última modificación: 2023-10-07 15:34:33
Copiar: 0 Número de Visitas: 779
1
Seguir
1617
Seguidores

Descripción general

La estrategia utiliza una combinación de indicadores técnicos para evaluar las tendencias de los precios y emitir señales de compra y venta.

Principio de estrategia

La estrategia se basa principalmente en los siguientes indicadores técnicos para juzgar las tendencias de los precios:

  1. Indicador de Super Tendencia ((SuperTrend): según el ATR calculado en el trayecto ascendente y descendente, el precio supera el trayecto ascendente y se queda en el trayecto descendente;

  2. El promedio móvil simple (SMA): el precio sube con el SMA y baja con el SMA.

  3. Indicador de Momentum: el movimiento del precio es positivo para hacer más y negativo para hacer menos;

  4. MACD: DIFF hace más al romper la línea DEA y hace menos al romper la línea DEA;

  5. La fuerza aérea (Bull and Bear): la fuerza aérea es más fuerte que la fuerza aérea, que en cambio es más débil.

  6. RSI: el RSI está en la línea 30 y está en la línea 70

  7. En el caso de que el número de líneas negativas sea N, el número de líneas negativas será N y el número de líneas positivas será N.

  8. CCI: CCI mayor a 100 hace más y menor a 100 hace menos;

  9. DMI: el DMI multicable es mayor que el cable vacío, y viceversa vacío;

  10. Las ondas del mercado: juzgar que los precios están haciendo más en las ondas de subida y más en las ondas de bajada;

  11. Indicador aleatorio: el indicador aleatorio tiene 20 líneas de más y 80 líneas de menos.

El resultado de estos indicadores da un número de puntos de 1 o -1, dependiendo de la dirección hacia arriba o hacia abajo. Sumando los puntos de todos los indicadores, se obtiene el número total de puntos. Cuando el número total de puntos cruza la línea 0 se genera una señal de compra; cuando el número total de puntos cruza la línea 0 se genera una señal de venta.

Análisis de las ventajas

La mayor ventaja de esta estrategia de combinación de múltiples indicadores es su alta fiabilidad, ya que el uso integrado de varios indicadores para determinar la dirección de la tendencia puede reducir eficazmente las señales falsas y hacer que la señal sea más confiable. En comparación con un solo indicador, esta estrategia de combinación tiene una mejor fiabilidad y estabilidad.

Otra ventaja es la flexibilidad y la personalización de la estrategia. Los tipos de indicadores y la configuración de los parámetros se pueden ajustar según los diferentes mercados, lo que hace que la estrategia se adapte mejor a los diferentes entornos. También se puede ajustar el peso del indicador según los resultados de la prueba.

Análisis de riesgos

También hay riesgos en este tipo de estrategias combinadas:

  1. Si la correlación entre los indicadores seleccionados es demasiado alta, existe el riesgo de que se repitan las señales. Esto requiere una combinación de indicadores de menor correlación en función de las diferentes condiciones del mercado.

  2. Si el número de indicadores es demasiado grande y el tiempo de cálculo es demasiado largo, la puntualidad de la señal se verá afectada. Es necesario evaluar la relación entre el número de indicadores y la puntualidad.

  3. La configuración incorrecta de los parámetros de Indicator también puede afectar el efecto de la estrategia, por lo que es necesario hacer un análisis exhaustivo para encontrar los parámetros óptimos.

  4. La eficacia de los indicadores varía según la fase del mercado. La eficacia de los indicadores debe ser revisada constantemente a través de la retroalimentación.

Dirección de optimización

Esta estrategia puede ser optimizada en los siguientes aspectos:

  1. Optimizar la variedad y cantidad de Indicatores para seleccionar la combinación óptima;

  2. Optimizar la configuración de los parámetros de cada indicador;

  3. Ajustar el índice de ponderación de los Indicadores para aumentar el peso de los Indicadores Clave;

  4. Aumentar los filtros de condiciones, como el aumento de la cantidad de transacciones, para evitar falsos brechas;

  5. Utilizando el método de la combinación de modelos, los algoritmos de aprendizaje automático buscan la combinación de estrategias óptima.

Resumir

En resumen, esta estrategia de combinación de múltiples indicadores aprovecha las ventajas de los diferentes indicadores para determinar la dirección de la tendencia, puede reducir las señales falsas y mejorar la fiabilidad de la señal. A través de la optimización de la selección de indicadores, la configuración de parámetros, la distribución de pesas, etc., se puede mejorar la estabilidad de la estrategia.

Código Fuente de la Estrategia
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Super indicator ", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() =>true


hilow = ((high - low)*100)
openclose = ((close - open)*100)
vol1 = (volume / hilow)
spreadvol = (openclose * vol1)
VPT = spreadvol + cum(spreadvol)
window_len = 28

v_len = 14
price_spread = stdev(high-low, window_len)

vp =  spreadvol + cum(spreadvol)
smooth = sma(vp, v_len)
v_spread = stdev(vp - smooth, window_len)
shadow = (vp - smooth) / v_spread * price_spread

out1 = shadow > 0 ? high + shadow : low + shadow

//plot(out, style=line,linewidth=3, color=color)
len=5
vpt=ema(out1,len)


// INPUTS //
st_mult   =3
st_period = 7

// CALCULATIONS //
up_lev = vpt - (st_mult * atr(st_period))
dn_lev = vpt + (st_mult * atr(st_period))

up_trend   = 0.0
up_trend   := close[1] > up_trend[1]   ? max(up_lev, up_trend[1])   : up_lev

down_trend = 0.0
down_trend := close[1] < down_trend[1] ? min(dn_lev, down_trend[1]) : dn_lev

// Calculate trend var
trend10 = 0
trend10 := close > down_trend[1] ? 1: close < up_trend[1] ? -1 : nz(trend10[1], 1)

// Calculate SuperTrend Line
st_line = trend10 ==1 ? up_trend : down_trend

//
src = input(close, title="Source")
//sma
sma20 = sma(src, 20)
smapoint = 0
smapoint := src > sma20 ? smapoint + 1 : smapoint - 1


//AO
ao = sma(hl2,5) - sma(hl2,34)
aopoint = ao > 0 ? 1 : ao < 0 ? -1 : 0
//momentum
mom = src - src[14]
mompoint = mom > 0 ? 1 : mom < 0 ? -1 : 0
//MACD
fast_ma = ema(src, 12)
slow_ma = ema(src, 26)
macd = fast_ma - slow_ma
signal = ema(macd, 9)
hist = macd - signal
histpoint = hist > hist[1] ? 3 : -3

//Bull bear
Length = 30
r1=iff(close[1]<open,max(open-close[1],high-low),high-low)
r2=iff(close[1]>open,max(close[1]-open,high-low),high-low)
bull=iff(close==open,iff(high-close==close-low,iff(close[1]>open,max(high-open,close-low),r1),iff(high-close>close-low,iff(close[1]<open, max(high-close[1],close-low), high-open),r1)),iff(close<open,iff(close[1]<open,max(high-close[1],close-low), max(high-open,close-low)),r1))
bear=iff(close==open,iff(high-close==close-low,iff(close[1]<open,max(open-low,high-close),r2),iff(high-close>close-low,r2,iff(close[1]>open,max(close[1]-low,high-close), open-low))),iff(close<open,r2,iff(close[1]>open,max(close[1]-low,high-close),max(open-low,high-close))))
colors=iff(sma(bull-bear,Length)>0, color.green, color.red)
// barcolor(colors)
bbpoint = sma(bull-bear,Length)>0 ? 1 : -1
//UO
length7 = 7,
length14 = 14,
length28 = 28
average(bp, tr_, length) => sum(bp, length) / sum(tr_, length)
high_ = max(high, src[1])
low_ = min(low, src[1])
bp = src - low_
tr_ = high_ - low_
avg7 = average(bp, tr_, length7)
avg14 = average(bp, tr_, length14)
avg28 = average(bp, tr_, length28)
uoout = 100 * (4*avg7 + 2*avg14 + avg28)/7
uopoint = uoout > 70 ? 1 : uoout < 30 ? -1 : 0
//IC
conversionPeriods = 9
basePeriods = 26
laggingSpan2Periods = 52
displacement = 26
donchian(len) => avg(lowest(len), highest(len))
baseLine = donchian(basePeriods)
icpoint = src > baseLine ? 1 : -1

//HMA
hullma = wma(2*wma(src, 9/2)-wma(src, 21), round(sqrt(21)))
hmapoint = src > hullma ? 2 : -2
//
//
trendDetectionLength =4
float trend = na
float wave = na
float vol = na
mov = close>close[1] ? 1 : close<close[1] ? -1 : 0
trend := (mov != 0) and (mov != mov[1]) ? mov : nz(trend[1])
isTrending = rising(close, trendDetectionLength) or falling(close, trendDetectionLength)
wave := (trend != nz(wave[1])) and isTrending ? trend : nz(wave[1])
vol := wave == wave[1] ? (nz(vol[1])+volume) : volume
up1 = wave == 1 ? vol : 0
dn1 = wave == 1 ? 0 : vol
Weis= up1 > dn1 ? 2 : -2


//

roclen =20
ccilen =21
dilen = 5
dirmov(len) =>
	up = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

f_draw_infopanel(_x, _y, _line, _text, _color)=>
    _rep_text = ""
    for _l = 0 to _line
        _rep_text := _rep_text + "\n"
    _rep_text := _rep_text + _text
    var label _la = na
    label.delete(_la)
    _la := label.new(
         x=_x, y=_y, 
         text=_rep_text, xloc=xloc.bar_time, yloc=yloc.price, 
         color=color.black, style=label.style_labelup, textcolor=_color, size=size.normal)

TD = 0
TS = 0
TD := close > close[4] ? nz(TD[1]) + 1 : 0
TS := close < close[4] ? nz(TS[1]) + 1 : 0
TDUp = TD - valuewhen(TD < TD[1], TD , 1 )
TDDn = TS - valuewhen(TS < TS[1], TS , 1 )
td = TDUp > 0 ? 2 : TDDn > 0 ? -2 : 0
roc = roc(close, roclen)
Roc=roc > 0 ? 1 : -1
cci = cci(close, ccilen)
CCI=cci > 0? 2 : -2
[plus, minus] = dirmov(dilen)
dmi = plus - minus
DMI= dmi >= 0? 2 : -2
//
STT=trend10 == 1 ? 1 : -1
//
periods = 2
smooth1 =  14
price = close
fn(src, length) => 
    MA_s= 0.0
    MA_s:=(src + nz(MA_s[1] * (length-1)))/length
    MA_s
r11 = ema( price, periods ) 
r22 = iff( price > r11, price - r11, 0 ) 
r3 = iff( price < r11, r11 - price, 0 ) 
r4 = fn( r22, smooth1 ) 
r5 = fn( r3, smooth1 ) 
rr = iff( r5 == 0, 100, 100 - ( 100 / ( 1 + ( r4 / r5 ) ) ) ) 

length = 20,fast = 7,slow = 13
//
src10 = rr
er = abs(change(src,length))/sum(abs(change(src10)),length)
dev = er*stdev(src10*2,fast) + (1-er)*stdev(src10*2,slow)
a = 0.
a := bar_index < 9 ? src10 : src10 > a[1] + dev ? src10 : src10 < a[1] - dev ? src10 : a[1]
//

rsi=fixnan(a > a[1] ? 3 : a < a[1] ?-3 : na)
//
totalpoints =rsi+td+STT+Roc+DMI+ CCI+Weis+smapoint  + aopoint + mompoint + histpoint  + bbpoint  + icpoint  + hmapoint
//
piz=input(1)
tt=sma(totalpoints,piz)

//

zero=0
down = crossunder(tt, 0) 
up = crossover(tt, -0) 

//Alerts
/////// Alerts /////
alertcondition(down,title="sell")
alertcondition(up,title="buy")
//
/////////////// Strategy /////////////// 
long = up
short = down

strategy.entry("Long", strategy.long, when = long) 
strategy.entry("Short", strategy.short, when = short)