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.
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.
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.
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.
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.
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)