Stratégie de brique Momentum


Date de création: 2024-02-19 15:32:17 Dernière modification: 2024-02-19 15:32:17
Copier: 1 Nombre de clics: 577
1
Suivre
1617
Abonnés

Stratégie de brique Momentum

Cette stratégie consiste à simuler la formation d’une courbe pour évaluer les variations de la dynamique du marché et à faire plus de blanchiment selon la direction de la courbe.

Principe de stratégie

Le principe central de cette stratégie est de simuler la formation de briques en calculant la relation entre l’ATR et le prix de clôture. Plus précisément, la définition des deux variables Brick1 et Brick2

Brick1 est calculé de la manière suivante: si le prix de clôture est supérieur à la valeur de Brick1 hier + ATR, Brick1 est la valeur de Brick1 hier + ATR; si le prix de clôture est inférieur à la valeur de Brick1 hier - ATR, Brick1 est la valeur de Brick1 hier - ATR; sinon, Brick1 hérite de la valeur de Brick1 hier.

Brick2 est calculé de la manière suivante: si la valeur de Brick1 est différente de celle de Brick1 hier, alors Brick2 est la valeur de Brick1 hier; sinon, hérite de Brick2 hier.

Cela simule la formation d’une brique. Lorsque Brick1 monte au-dessus d’un ATR, il forme une brique vers le haut; lorsque Brick1 descend au-dessus d’un ATR, il forme une brique vers le bas. Brick2 est la position d’un brique enregistrée.

Lorsque Brick1 et Brick2 se croisent vers le haut, cela indique que la tige s’étend vers le haut et est jugée polygonale; lorsque Brick1 et Brick2 se croisent vers le bas, cela indique que la tige se contracte vers le bas et est jugée vide.

Avantages stratégiques

  1. L’ATR est utilisé pour juger de la formation de l’acier, évitant ainsi l’utilisation d’acier de taille fixe, et s’adaptant dynamiquement aux fluctuations du marché.
  2. Déterminer la direction de la polyvalence à travers la croix de l’aiguille et identifier les changements de dynamique
  3. La sensibilité aux jugements sur la dynamique du marché peut être ajustée par différents cycles d’ATR
  4. La visualisation de la formation et de l’intersection des coulisses, pour juger de façon intuitive de la tendance du marché

Risque stratégique

  1. Le choix de la taille d’un ATR affecte le taux de rendement de la stratégie. Si l’ATR est trop petit, il se forme trop d’écrans, produisant plus de signaux inefficaces; si l’ATR est trop grand, il se forme trop peu d’écrans, ce qui facilite la perte d’opportunités.
  2. La tendance réelle peut ne pas suivre le mouvement de la couronne, et les signaux croisés de la couronne peuvent être rejetés par un renversement de marché.
  3. Il est nécessaire d’être très sensible aux coûts de transaction, sinon la fréquence des transactions croisées pourrait réduire considérablement les bénéfices nets.

Il est possible de trouver le cycle ATR optimal en optimisant les paramètres; d’ajuster la stratégie de stop-loss pour réduire les pertes causées par des signaux inefficaces; d’amplifier correctement la variété des transactions pour réduire l’impact des coûts sur les gains.

Optimisation de la stratégie

  1. Le filtrage du signal peut être combiné avec d’autres indicateurs, tels que l’indicateur de quantité d’énergie, l’indicateur de vibration, etc., pour éviter un signal invalide
  2. Ajout d’un filtre de tendance pour émettre des signaux uniquement dans la direction de la tendance et éviter les pertes de retournement
  3. Optimisation des paramètres de l’ensemble de l’échantillon pendant la période de test pour trouver automatiquement les paramètres optimaux

Résumer

Cette stratégie permet de juger de la tendance et de la dynamique à court terme sur le marché par le croisement d’une pile d’analyses dynamiques, de visualiser la forme de l’intuition. La stratégie a une grande marge d’optimisation, l’optimisation des paramètres et le filtrage des signaux peuvent améliorer encore la stabilité.

Code source de la stratégie
/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4


///Component Code Start
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2025, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)



/// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and time >= testPeriodStart and time <= testPeriodStop ? 
   #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
/// Component Code Stop


//Zack_the_Lego (original AUTHOR) made into strategy by mkonsap
strategy("Flex Renko Emulator", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
margin = input(true, title="Margin?")
Margin = margin ? margin : false
res = input(type=input.resolution, defval="D", title="Resolution of ATR")
xATR = atr(14)
//TF = x78tf ? "78" : "39"
BrickSize = security(syminfo.tickerid, res, xATR)

//Brick1 =  close >  nz(Brick1[1]) + BrickSize ? nz(Brick1[1]) + BrickSize : close <
                    //nz(Brick1[1]) - BrickSize ?
                        //nz(Brick1[1]) - BrickSize
                            //: nz(Brick1[1]))


Brick1() =>
    s1 = 0.0
    s1 := close > nz(s1[1]) + BrickSize ? nz(s1[1]) + BrickSize : 
       close < nz(s1[1]) - BrickSize ? nz(s1[1]) - BrickSize : nz(s1[1])
    s1


Brick2() =>
    s2 = 0.0
    Brick1_1 = Brick1()
    s2 := Brick1() != Brick1()[1] ? Brick1_1[1] : nz(s2[1])
    s2

colorer = Brick1() > Brick2() ? color.green : color.red
p1 = plot(Brick1(), color=colorer, linewidth=4, title="Renko")
p2 = plot(Brick2(), color=colorer, linewidth=4, title="Renko")
fill(p1, p2, color=color.purple, transp=50)




mylong = crossover(Brick1(), Brick2())
myshort = crossunder(Brick1(), Brick2())

last_long = float(na)
last_short = float(na)
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(Brick1(), Brick2())
myshort2 = crossunder(Brick1(), Brick2())

last_long2 = float(na)
last_short2 = float(na)
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0


condlongx = in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx = in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossunder(condshortx, 1.9)


// === STRATEGY - LONG POSITION EXECUTION WITH CLOSE ORDERS ===
//enterLong() => crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
//exitLong()  => crossunder(condlongx, 1.9) and testPeriod() and strategy.position_size > 0
//strategy.entry(id = "Long", long = true, when = enterLong())
//strategy.close(id = "Long", when = exitLong())
// === STRATEGY - SHORT POSITION EXECUTION WITH CLOSE ORDER===
//enterShort() => crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0 and Margin
//exitShort() => crossunder(condshortx, 1.9)  and testPeriod() and strategy.position_size < 0
//strategy.entry(id = "Short", long = false, when = enterShort())
//strategy.close(id = "Short", when = exitShort())   
//END


///STRATEGY ONLY LONG AND SHORT/////
if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.close("Long", when=not Margin)

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when=Margin)

/////// END ////