Stratégie d'accumulation de cassures basée sur un filtrage de barres significatif


Date de création: 2024-01-03 16:30:16 Dernière modification: 2024-01-03 16:30:16
Copier: 0 Nombre de clics: 585
1
Suivre
1621
Abonnés

Stratégie d’accumulation de cassures basée sur un filtrage de barres significatif

Aperçu

La stratégie permet de prédire la tendance en déterminant le pivot de la ligne K et en combinant les signaux de rupture pour émettre un signal de transaction. La stratégie filtre les K trop petits et analyse uniquement les pivots de la ligne K, ce qui permet d’éviter les perturbations causées par des baisses trop fréquentes, ce qui rend le signal plus stable et plus fiable.

Principe de stratégie

  1. Le corps de la longueur de l’entité de la ligne K actuelle est considéré comme un corps de colonne significatif si il est plus grand que la moyenne des 6 corps de lignes K précédents de 3 fois.

  2. Si les trois lignes de colonne significative de la colonne sont en ligne droite, on considère qu’il s’agit d’un signal à plusieurs têtes. Si les trois lignes de colonne significative de la colonne sont en ligne négative, on considère qu’il s’agit d’un signal à tête vide.

  3. En même temps que le signal de jugement, un signal de transaction supplémentaire est généré si le prix atteint un sommet ou une baisse avant de franchir le seuil.

  4. Utilisez la moyenne SMA comme filtre et ne placez votre position que si le prix dépasse la moyenne SMA.

  5. Après la tenue d’une position, la position est levée si le prix franchit à nouveau le point d’entrée ou la moyenne SMA.

Analyse des avantages

  1. Le filtrage de la tendance par les colonnes de signification permet d’éliminer les interférences inutiles et de rendre le signal plus clair.

  2. La combinaison de signaux de tendance et de signaux de rupture améliore la qualité du signal et réduit les faux signaux.

  3. Le filtrage de la moyenne moyenne des valeurs moyennes permet d’éviter de suivre les hautes et les basses. L’achat en dessous de la clôture et la vente au-dessus de la clôture augmentent la fiabilité du signal.

  4. La mise en place d’un arrêt-stop permet de mettre fin aux pertes en temps opportun, ce qui est bénéfique pour la conservation des fonds.

Analyse des risques

  1. Cette stratégie est plus radicale et utilise des signaux de jugement de 3 lignes K, ce qui peut conduire à confondre une oscillation à court terme avec un renversement de tendance.

  2. Les données de test sont insuffisantes et les résultats peuvent varier selon les variétés et les cycles.

  3. Il n’y a pas de contrôle des positions de nuit sur le disque, il existe un risque de positions de nuit.

Direction d’optimisation

  1. Les paramètres de la colonne de la colonne de signification peuvent être encore optimisés, comme le nombre de lignes K jugées, la définition de la colonne de signification de la colonne, etc.

  2. Il est possible de tester l’effet de différents paramètres de cycle pour trouver le cycle optimal.

  3. L’arrêt ATR peut être ajouté pour contrôler le risque.

  4. Logique de contrôle de position de nuit peut être envisagée.

Résumer

Cette stratégie utilise le filtrage des courbes et des tendances de la colonne de signification, combinée à la formation de signaux de transaction de rupture, pour filtrer efficacement les petites fluctuations inutiles, le signal est plus clair et plus fiable. Cependant, en raison de la courte période de jugement, il peut y avoir un certain risque d’erreur de jugement.

Code source de la stratégie
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//AlexInc
//2018

// закрытие - вычислить и в течение скольки-то баров его добиваться
// если нет, то по первому противоположному
// по стоп-лоссу в любом случае - стоп вычислить

//@version=2
strategy(title = "AlexInc's Bar v1.2", shorttitle = "AlexInc Bar 1.2", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
tryprofitbars = input(6, defval = 6, minval = 1, maxval = 100, title = "Number of candles to take profit anyway")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")

useSMAfilter = input(false, defval = true, title = "Use SMA filter")
SMAlimit = input(10, defval = 10, minval = 1, maxval = 30, title = "SMA filter limit")
bodysizeMlt = input(3, defval = 3, minval = 1, maxval = 10, title = "Body Size Multiplier")
meanfulbardiv = input(3, title = "Meanful Bar size Divider")

showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//SMA #
index = 0
index := barstate.isfirst ==true ? 0 : nz(index[1])+1

buyindex = 0
buyindex := barstate.isfirst ==true ? 0 : buyindex[1]

sellindex = 0
sellindex := barstate.isfirst ==true ? 0 : sellindex[1]

//predictprofit = barstate.isfirst ==true ? 0 : predictprofit[1]

smafilter = sma(close, SMAlimit)

//Body
body = abs(close - open)
range = abs(high - low)
abody = sma(body, 6)

max3 = 0
if body >= body[1] and body >= body[2]
    max3 := body
else
    if body[1] >= body and body[1] >= body[2]
        max3 := body[1]
    else 
        if body[2] >= body and body[2] >= body[1]
            max3 := body[2]

prevmax3 = 0
prevmax3 := nz(max3[1])


bar = close > open ? 1 : close < open ? -1 : 0
firstbullishopen = 0
firstbullishopen := bar == 1 and bar[1] != 1 ? open : nz(firstbullishopen[1])
firstbearishopen = 0
firstbearishopen := bar == -1 and bar[1] != -1 ? open : nz(firstbearishopen[1])

meanfulbar = body > abody / meanfulbardiv

meanfulbearish = 0
meanfulbearish := nz(meanfulbearish[1])

meanfulbullish = 0
meanfulbullish := nz(meanfulbullish[1])

if meanfulbar
    if bar == 1
        meanfulbullish := 1 + meanfulbullish
        meanfulbearish := 0
    else
        if bar == -1
            meanfulbearish := 1 + meanfulbearish
            meanfulbullish := 0


plot(min(low, high)-10, style=circles, color = meanfulbar ? yellow:black, linewidth=3)

//Signals
up1 = (meanfulbearish >= 3) and (close < firstbullishopen or 1) and (strategy.position_size == 0 or close < strategy.position_avg_price) and body > abody / 5 and (useSMAfilter == false or close < smafilter)
if up1 == true
	predictprofit = sma(body, 3)
up2 = sma(bar, 1) == -1 and body > prevmax3 * bodysizeMlt and (strategy.position_size == 0 or close < strategy.position_avg_price) and body > abody / 5 and (useSMAfilter == false or close < smafilter)
if up2 == true
	predictprofit = body * 0.5
plot(min(low, high), style=circles, color = up1?blue:up2?green:gray, linewidth=3)

dn1 = (meanfulbullish >= 3) and (close > firstbearishopen or 1)  and (strategy.position_size == 0 or close > strategy.position_avg_price) and body > abody / 5 and (useSMAfilter==false or close > smafilter)
if dn1 ==true 
	predictprofit = sma(body, 3)
dn2 = sma(bar, 1) == 1 and body > prevmax3 * bodysizeMlt and (strategy.position_size == 0 or close > strategy.position_avg_price) and body > abody / 5 and (useSMAfilter==false or close > smafilter)
if dn2 ==true	
	predictprofit = body * 0.5
plot(max(low, high), style=circles, color = dn1?blue:dn2?green:gray, linewidth=3)


exit = (((strategy.position_size > 0 and bar == 1 ) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2 )
// or index >= buyindex (or sellindex) + tryprofitbars


//Arrows
col = exit ? black : up1 or dn1 ? blue : up2 or dn2 ? red : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)


//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
		buyindex = index
		sellindex = index
	if strategy.position_size == 0
		buyindex = index
		
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot )

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
		buyindex = index
		sellindex = index
	if strategy.position_size == 0
		sellindex = index
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot )
    
if  exit
    strategy.close_all()