
Esta estrategia combina el uso de medias móviles, indicadores de volumen de transacción e indicadores de movimiento de precios para diseñar un conjunto de reglas cuantitativas para identificar el momento en que las acciones entran en la fase de acumulación. En esta fase, las acciones suelen estar en un estado de equilibrio y acumulación de precios, lo que ofrece una buena oportunidad de entrada a precios más bajos.
La estrategia utiliza medias móviles simples de 50, 90 y 200 días para determinar la tendencia de los precios. Sólo se produce una señal de compra cuando el precio está por encima de la línea de 200 días. Esto puede filtrar la incertidumbre de la caída de la gran tendencia.
Además de determinar las grandes tendencias, la estrategia también determina el orden de la línea media a corto plazo para confirmar la tendencia. Concretamente, se determina que la línea de 50 días es más alta que la línea de 90 días.
La estrategia combina el indicador de volumen de transacciones PVT y el indicador de volumen de transacciones MACD para juzgar las características acumulativas sobre la base de que el promedio móvil confirma la tendencia grande y la tendencia corta. La señal de compra se genera solo cuando el PVT se rompe hacia arriba, la línea MACD está por encima de la línea de señal y el volumen de transacciones se amplifica.
En comparación con el uso de una media móvil, esta estrategia, al mismo tiempo que confirma la tendencia, también examina las características del volumen de transacciones. Esto permite determinar con mayor precisión el momento en que las acciones entran en la fase de acumulación, lo que garantiza una ventaja de precio para las entradas.
Mediante el análisis de múltiples marcos de tiempo, esta estrategia combina el juicio de tendencias a medio y largo plazo con el juicio de características a corto plazo, y la coincidencia de marcos de tiempo reduce la incertidumbre causada por el error de juicio de un solo marco de tiempo.
Esta estrategia se basa principalmente en el juicio de la línea media, que se cancela cuando el precio fluctúa fuertemente. En este caso, se debe reducir el tamaño de la posición o cancelar la salida con pérdidas directas.
Además, los juicios en la etapa de acumulación también pueden ser erróneos, perdiendo la oportunidad de revertir. Esto requiere que se confirme el juicio observando más indicadores de características.
Esta estrategia puede introducir algoritmos de aprendizaje automático para realizar juicios automáticos sobre las etapas de acumulación a través de extracción de características y entrenamiento de modelos. Esto puede reducir las limitaciones derivadas de los umbrales de ajuste manual.
Además, la estrategia también puede probar la función breakpoint, que cambia automáticamente diferentes parámetros en diferentes entornos de mercado para que la estrategia sea más robusta.
Esta estrategia utiliza en general un enfoque de caracterización de la acumulación de acciones que coincide con el precio y el volumen de ventas. Al mismo tiempo que se confirma la dirección general, se exploran oportunidades de acumulación a corto plazo.
/*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)