Identifiant de l'étape d'accumulation et stratégie de négociation

Auteur:ChaoZhang est là., Date: 2024-02-20 11h29 et 57 min
Les étiquettes:

img

Résumé

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.

Principe de stratégie

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.

Les avantages

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.

Risques et solutions

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.

Idées d'optimisation

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.

Résumé

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)


Plus de