Stratégie de la brique de l'élan

Auteur:ChaoZhang est là., Date: le 19 février 2024 15:32:17
Les étiquettes:

img

La stratégie évalue l'évolution de la dynamique du marché en fonction de la formation de briques simulées et de la longueur ou de la courteur de la direction des briques.

La logique de la stratégie

La logique de base consiste à simuler la formation de briques en calculant l'ATR et la relation de prix de clôture.

Brick1 est calculé par: si le prix de clôture est supérieur à la valeur précédente de Brick1 + ATR, Brick1 = Brick1 valeur précédente + ATR; si le prix de clôture est inférieur à Brick1 précédente - ATR, Brick1 est Brick1 précédente - ATR valeur; sinon, Brick1 hérite de Brick1 valeur précédente.

Brick2 est calculé par: si Brick1 n'est pas égal à la valeur précédente de Brick1, alors Brick2 = Brick1 valeur précédente; sinon, hériter Brick2 valeur précédente.

Cela simule la formation des briques. Lorsque Brick1 s'élève plus qu'un ATR, une brique ascendante se forme; lorsque Brick1 tombe plus qu'un ATR, une brique descendante se forme. Brick2 enregistre simplement la position de la brique précédente.

Quand Brick1 et Brick2 vont vers le haut, cela signifie que la brique s'étend vers le haut, jugée longue.

Avantages

  1. Utiliser l'ATR pour déterminer la formation des briques, éviter la taille fixe des briques, peut s'adapter dynamiquement aux fluctuations du marché
  2. Identifier les changements de momentum par croisement de briques
  3. La sensibilité au jugement de l'élan du marché peut être ajustée par différents cycles ATR
  4. Visualiser la formation et le croisement des briques pour déterminer intuitivement les tendances du marché

Risque

  1. La sélection de la taille de l'ATR affectera les rendements de la stratégie. Trop petit ATR entraîne trop de signaux invalides. Trop grand ATR entraîne trop peu de briques et une perte potentielle d'opportunité.
  2. La tendance réelle peut ne pas suivre le schéma de brique.
  3. Il faut être très sensible aux coûts de transaction. Les échanges fréquents basés sur le croisement de briques réduiront considérablement le bénéfice net.

Les solutions comprennent l'optimisation des paramètres pour trouver le cycle ATR optimal, l'ajustement de la stratégie de perte de stop profit pour réduire les pertes dues à des signaux non valides, l'augmentation appropriée des variétés de transactions pour réduire l'impact des coûts sur les rendements.

Optimisation

  1. Combiner avec d'autres indicateurs de filtrage des signaux pour éviter les signaux non valides, par exemple les indicateurs de volume et de volatilité
  2. Ajouter le filtrage de tendance, émettre des signaux uniquement dans la direction de la tendance pour éviter les pertes d'inversion
  3. Adopter une optimisation complète des paramètres d'échantillon pendant la période d'essai pour trouver automatiquement les paramètres optimaux

Résumé

La stratégie évalue les tendances à court terme et l'élan des marchés grâce à une simulation dynamique du croisement de briques, avec une visualisation intuitive.


/*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 ////


Plus de