Momentum Brick-Strategie


Erstellungsdatum: 2024-02-19 15:32:17 zuletzt geändert: 2024-02-19 15:32:17
Kopie: 1 Klicks: 577
1
konzentrieren Sie sich auf
1617
Anhänger

Momentum Brick-Strategie

Diese Strategie beurteilt die Veränderungen der Marktdynamik durch die Simulation der Formation von Kurven, wobei die Kurven in der Richtung der Kurve mehr frei gemacht werden.

Strategieprinzip

Der Kern der Strategie besteht darin, die Bildung von Brick zu simulieren, indem die Beziehung zwischen dem ATR und dem Schlusskurs berechnet wird. Insbesondere werden die beiden Variablen Brick1 und Brick2 definiert.

Die Berechnung von Brick1 erfolgt folgendermaßen: Wenn der Schlusskurs Brick1 über dem Wert von Brick1 gestern + ATR liegt, ist Brick1 der Wert von Brick1 gestern + ATR; wenn der Schlusskurs Brick1 unter dem Wert von Brick1 gestern + ATR liegt, ist Brick1 der Wert von Brick1 gestern - ATR; andernfalls erbt Brick1 den Wert von Brick1 gestern.

Die Berechnung von Brick2 erfolgt folgendermaßen: Wenn der Wert von Brick1 nicht der Wert von Brick1 gestern ist, ist Brick2 der Wert von Brick1 gestern; andernfalls erbt Brick2 den Wert von Brick2 gestern.

Dies simuliert die Bildung von Brücken. Wenn Brick1 über einen ATR steigt, entsteht ein Aufwärtsbrücken; wenn Brick1 über einen ATR fällt, entsteht ein Abwärtsbrücken. Brick2 ist die Aufzeichnung der Position eines Brückens.

Wenn Brick1 und Brick2 sich aufwärts kreuzen, erweitert sich der Rumpf aufwärts und wird als mehrköpfig beurteilt. Wenn Brick1 und Brick2 sich nach unten kreuzen, schrumpft der Rumpf nach unten und wird als leerer Kopf beurteilt.

Strategische Vorteile

  1. Die Verwendung von ATRs zur Beurteilung der Zinsbildung, um die Verwendung von Zinssätzen fester Größe zu vermeiden und sich dynamisch an Marktschwankungen anzupassen
  2. Durch die Kreuzung der Zellen zur Bestimmung der Polyfluorrichtung und zur Identifizierung von Bewegungsänderungen
  3. Sensibilität für Markttendenzen kann durch unterschiedliche ATR-Zyklen angepasst werden
  4. Visualisierung von Kegelbildung und Kreuzung, intuitive Beurteilung der Marktentwicklung

Strategisches Risiko

  1. Die Wahl der ATR-Größe beeinflusst die Ertragsrate der Strategie. Wenn die ATR zu klein ist, werden zu viele Würfel gebildet, was zu mehr ungültigen Signalen führt. Wenn die ATR zu groß ist, werden zu wenige Würfel gebildet, was dazu führt, dass die Chancen verpasst werden.
  2. Der tatsächliche Trend folgt möglicherweise nicht der Form des Anschlusses, und das Kreuzungssignal des Anschlusses wird möglicherweise durch eine Marktumkehr abgelehnt.
  3. Die Kosten der Transaktionen müssen sehr sensibel sein, da sonst die Häufigkeit der Transaktionen die Nettoeinnahmen erheblich beeinträchtigen würde.

Die optimale ATR-Periode kann durch Parameteroptimierung gefunden werden. Die Stop-Stop-Strategie kann angepasst werden, um den Verlust durch unwirksame Signale zu verringern. Die Handelsvariante kann entsprechend vergrößert werden, um die Auswirkungen der Kosten auf die Erträge zu verringern.

Strategieoptimierung

  1. Signalfilter können in Kombination mit anderen Indikatoren, wie z. B. Quantenenergie-Indikatoren, Schwingungsindikatoren usw., verwendet werden, um ein ungültiges Signal zu vermeiden
  2. Hinzugefügt wird ein Trendfilter, der nur in Richtung des Trends signalisiert, um einen Rückschlag zu vermeiden.
  3. Automatische Optimierung der Parameter in der gesamten Stichprobe während der Testperiode

Zusammenfassen

Diese Strategie beurteilt kurzfristige Trends und Dynamik in den Märkten durch die Kreuzung von dynamischen Simulationsfeldern und visualisiert die Form intuitiv. Die Strategie hat viel Optimierungsraum, Parameteroptimierung und Signalfilterung können die Stabilität weiter verbessern.

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