Strategi ini menilai perubahan momentum pasar berdasarkan pembentukan batu bata simulasi dan panjang atau pendek pada arah batu bata.
Logika inti adalah untuk mensimulasikan pembentukan batu bata dengan menghitung hubungan harga ATR dan penutupan. Secara khusus, dua variabel Brick1 dan Brick2 didefinisikan.
Brick1 dihitung dengan: jika harga penutupan melebihi nilai Brick1 sebelumnya + ATR, Brick1 = Brick1 nilai sebelumnya + ATR; jika harga penutupan di bawah Brick1 sebelumnya - ATR, Brick1 adalah Brick1 sebelumnya - nilai ATR; jika tidak, Brick1 mewarisi nilai Brick1 sebelumnya.
Brick2 dihitung dengan: jika Brick1 tidak sama dengan nilai sebelumnya Brick1, maka Brick2 = Brick1 nilai sebelumnya; jika tidak, mewarisi nilai sebelumnya Brick2.
Ini mensimulasikan pembentukan batu bata. Ketika Brick1 naik lebih dari ATR, batu bata ke atas terbentuk; ketika Brick1 jatuh lebih dari ATR, batu bata ke bawah terbentuk. Brick2 hanya mencatat posisi batu bata sebelumnya.
Ketika Brick1 dan Brick2 melintasi, itu berarti batu bata membesar ke atas, dinilai panjang.
Solusi termasuk optimasi parameter untuk menemukan siklus ATR optimal, menyesuaikan strategi stop profit loss untuk mengurangi kerugian dari sinyal yang tidak valid, meningkatkan varietas transaksi dengan benar untuk mengurangi dampak biaya pada pengembalian.
Strategi ini menilai tren jangka pendek dan momentum di pasar melalui simulasi crossover bata secara dinamis, dengan visualisasi intuitif.
/*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 ////