Identificador de la etapa de acumulación y estrategia de negociación

El autor:¿ Qué pasa?, Fecha: 2024-02-20 11:29:57
Las etiquetas:

img

Resumen general

Esta estrategia combina medias móviles, indicadores de volumen e indicadores de impulso de precios para diseñar un conjunto de reglas cuantitativas para identificar el momento en que las existencias entran en la etapa de acumulación.

Principio de la estrategia

La estrategia utiliza promedios móviles simples de 50 días, 90 días y 200 días para determinar las tendencias de precios.

Además de juzgar la tendencia principal, la estrategia también juzga el orden de las medias móviles a corto plazo para confirmar la tendencia.

Basándose en que el promedio móvil confirma las tendencias principales y a corto plazo, la estrategia combina el indicador de volumen PVT y el indicador MACD para juzgar las características de acumulación.

Ventajas

En comparación con el uso de medias móviles, esta estrategia también comprueba las características del volumen al tiempo que confirma la tendencia, lo que permite determinar con mayor precisión el momento en que las existencias entran en la etapa de acumulación, garantizando así mejores precios de entrada.

Al analizar múltiples marcos de tiempo, esta estrategia combina juicios de tendencia a medio y largo plazo y juicios de características a corto plazo para que coincidan con los marcos de tiempo, lo que puede reducir la incertidumbre por juzgar incorrectamente un único marco de tiempo.

Riesgos y soluciones

Esta estrategia se basa principalmente en juicios de promedio móvil. Cuando los precios fluctúan violentamente, los juicios de promedio móvil fallarán. En este punto, el tamaño de la posición debe reducirse o se debe activar una salida de stop loss.

Además, es posible que se produzcan errores de apreciación en la etapa de acumulación, perdiendo así oportunidades de reversión, lo que requiere la observación de más indicadores característicos para confirmar los juicios.

Ideas de optimización

Los algoritmos de aprendizaje automático pueden introducirse en esta estrategia mediante la extracción de características y el entrenamiento del modelo para lograr un juicio automático de la etapa de acumulación.

Además, esta estrategia también puede probar la funcionalidad de punto de ruptura para cambiar automáticamente los parámetros en diferentes entornos de mercado, lo que hace que la estrategia sea más robusta.

Resumen de las actividades

En resumen, esta estrategia generalmente adopta la idea de coincidir precios y volúmenes para juzgar las características de las etapas de acumulación de existencias.


/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
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/
// © stocktechbot

//@version=5
strategy("Accumulate", overlay = true)
lookback = input(defval = 21, title = 'Lookback')
offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
//SMA Tredline
out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
//sma plot
plot(out, color=color.blue, title="MA200", offset=offset)
plot(outf, color=color.maroon, title="MA50", offset=offset)
plot(outn, color=color.orange, title="MA90", offset=offset)
plot(outt, color=color.olive, title="MA21", offset=offset)

//MarketCap Calculation
//MarketCap = 0.0
//TSO = request.financial(syminfo.tickerid, "TOTAL_SHARES_OUTSTANDING", "FQ", ignore_invalid_symbol = true)


//if str.tostring(TSO) != 'na'
//    if ta.barssince(TSO != TSO[1] and TSO > TSO[1])==0
//        MarketCap := TSO * close
//       
//    if barstate.islast and MarketCap == 0
//        runtime.error("No MarketCap is provided by the data vendor.")
//    
//momlen = 100
//msrc = MarketCap
//mom = msrc - msrc[momlen]
//plotmom = if (mom > mom[1])
//    true
//else
//   false

//OBV with sma on macd
obv = ta.cum(math.sign(ta.change(close)) * volume)
smoothingLength = 5
smoothingLine = ta.sma(obv,5)
[macdLine, signalLine, histLine] = ta.macd(ta.pvt, 12, 26, 9)
sellvolhigh = macdLine < signalLine
buyvolhigh = macdLine > signalLine
//Buy Signal
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
higheshigh = ta.rising(high, 2)
higheslow = ta.rising(low, 2 )
twohunraise = ta.rising(out, 2)
//highvol =  ta.crossover(volume, ta.sma(volume, lookback))
highvol = ta.rising(volume,2)
fourlow = ta.lowest(close, lookback)
fourhig = ta.highest(close, lookback)
change =  (((fourhig - fourlow) / fourlow) * 100) <= 30
green = close > open
allup = false
lineabove = ta.cross(close, ta.sma(close, input(defval = 21, title = 'Entry Line')))
if matwohun and mafentry and higheshigh and twohunraise and buyvolhigh
//if higheshigh and higheslow and highvol
    allup := true

plotshape(allup, style=shape.arrowup,location=location.belowbar, color=color.green, title = "Buy Signal")

barsSinceLastEntry() =>
    strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na
    
//Sell Signal
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
linebreak = ta.sma(close, input(defval = 21, title = 'Exit Line')) > close
lowesthigh = ta.falling(high, 3)
lowestlow = ta.falling(low, 2 )
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
highvole =  ta.crossover(volume, ta.sma(volume, 5))
//fourlow = ta.lowest(close, lookback)
//fourhig = ta.highest(close, lookback)
changed =  (((fourhig - close) / close) * 100) >= 10
red = close < open
atr = ta.atr(14)
//atrsmalen = int(bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) )
atrsmalen = barsSinceLastEntry()
atrsma = false
atrlen = 5
if str.tostring(atrsmalen) != 'NaN' and atrsmalen > 0
    atrlen := atrsmalen

    
atrsma := atr > ta.sma(atr,50)


alldwn = false
if sellvolhigh and lowestlow and (close < close[1] and close < open)
//if higheshigh and higheslow and highvol
    alldwn := true

plotshape(alldwn, style=shape.arrowdown,location=location.abovebar, color=color.red, title = "Sell Signal")


longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (allup)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (alldwn)
    strategy.entry("My Short Entry Id", strategy.short)


Más.