Cette stratégie combine des moyennes mobiles, des indicateurs de volume et des indicateurs de dynamique des prix pour concevoir un ensemble de règles quantitatives permettant d'identifier le moment où les stocks entrent dans la phase d'accumulation.
La stratégie utilise des moyennes mobiles simples de 50 jours, 90 jours et 200 jours pour déterminer les tendances des prix. Les signaux d'achat ne sont générés que lorsque les prix sont au-dessus de la ligne de 200 jours.
En plus de juger de la tendance majeure, la stratégie juge également l'ordre des moyennes mobiles à court terme pour confirmer la tendance.
Sur la base du fait que la moyenne mobile confirme les tendances majeures et à court terme, la stratégie combine l'indicateur de volume PVT et l'indicateur MACD pour juger des caractéristiques d'accumulation.
Comparée à l'utilisation des seules moyennes mobiles, cette stratégie vérifie également les caractéristiques du volume tout en confirmant la tendance.
En analysant plusieurs délais, cette stratégie combine des jugements de tendance à moyen et à long terme et des jugements de caractéristiques à court terme pour correspondre aux délais, ce qui peut réduire l'incertitude liée à un jugement incorrect d'un seul délai.
Cette stratégie repose principalement sur des jugements de moyenne mobile. Lorsque les prix fluctuent violemment, les jugements de moyenne mobile échoueront. À ce stade, la taille de la position doit être réduite ou une sortie stop loss doit être déclenchée.
En outre, il est possible d'avoir des erreurs de jugement au stade de l'accumulation, ce qui fait manquer des occasions d'inversion, ce qui nécessite d'observer davantage d'indicateurs caractéristiques pour confirmer les jugements.
Des algorithmes d'apprentissage automatique peuvent être introduits dans cette stratégie en extraisant des caractéristiques et en formant des modèles pour obtenir un jugement automatique de l'étape d'accumulation.
En outre, cette stratégie peut également essayer la fonctionnalité de point de rupture pour changer automatiquement les paramètres dans différents environnements de marché, rendant la stratégie plus robuste.
En résumé, cette stratégie adopte généralement l'idée de l'appariement des prix et des volumes pour juger des caractéristiques des étapes d'accumulation des stocks. Tout en confirmant la direction principale, elle creuse des opportunités d'accumulation à court terme.
/*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)