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