Strategi Brick Momentum

Penulis:ChaoZhang, Tarikh: 2024-02-19 15:32:17
Tag:

img

Strategi ini menilai perubahan momentum pasaran berdasarkan pembentukan bata yang disimulasikan dan panjang atau pendek pada arah bata.

Logika Strategi

Logik teras adalah untuk mensimulasikan pembentukan bata dengan mengira hubungan harga penutupan dan hubungan harga penutupan.

Brick1 dikira dengan: jika harga penutupan melebihi nilai Brick1 sebelumnya + ATR, Brick1 = nilai Brick1 sebelumnya + ATR; jika harga penutupan di bawah nilai Brick1 sebelumnya - ATR, Brick1 adalah nilai Brick1 sebelumnya - ATR; jika tidak, Brick1 mewarisi nilai Brick1 sebelumnya.

Brick2 dikira dengan: jika Brick1 tidak sama dengan nilai Brick1 sebelumnya, maka Brick2 = Brick1 nilai sebelumnya; jika tidak, mewarisi Brick2 nilai sebelumnya.

Ini mensimulasikan pembentukan bata. Apabila Brick1 naik lebih daripada ATR, bata ke atas terbentuk; apabila Brick1 jatuh lebih daripada ATR, bata ke bawah terbentuk. Brick2 hanya merekodkan kedudukan bata sebelumnya.

Apabila Brick1 dan Brick2 melintasi, ia bermakna bata melebar ke atas, dinilai panjang.

Kelebihan

  1. Gunakan ATR untuk menentukan pembentukan bata, mengelakkan saiz bata tetap, boleh menyesuaikan diri secara dinamik dengan turun naik pasaran
  2. Mengenal pasti perubahan momentum melalui persilangan bata
  3. Kesan terhadap penilaian momentum pasaran boleh diselaraskan dengan kitaran ATR yang berbeza
  4. Memandangkan pembentukan dan persilangan bata untuk secara intuitif menentukan trend pasaran

Risiko

  1. Pilihan saiz ATR akan menjejaskan pulangan strategi. ATR yang terlalu kecil mengakibatkan terlalu banyak isyarat yang tidak sah. ATR yang terlalu besar menyebabkan terlalu sedikit batu bata dan potensi kehilangan peluang.
  2. Trend sebenar mungkin tidak mengikuti corak bata. isyarat silang bata boleh ditolak oleh pembalikan pasaran.
  3. Perlu sangat sensitif terhadap kos transaksi. perdagangan kerap berdasarkan batu bata crossover akan sangat mengurangkan keuntungan bersih.

Penyelesaian termasuk pengoptimuman parameter untuk mencari kitaran ATR yang optimum, menyesuaikan strategi kehilangan keuntungan berhenti untuk mengurangkan kerugian daripada isyarat yang tidak sah, meningkatkan jenis transaksi dengan betul untuk mengurangkan kesan kos pada pulangan.

Pengoptimuman

  1. Gabungkan dengan penunjuk lain untuk penapisan isyarat untuk mengelakkan isyarat yang tidak sah, contohnya isyarat jumlah dan turun naik
  2. Tambah penapisan trend, mengeluarkan isyarat hanya dalam arah trend untuk mengelakkan kerugian pembalikan
  3. Mengamalkan optimum parameter sampel penuh semasa tempoh ujian untuk mencari parameter optimum secara automatik

Ringkasan

Strategi ini menilai trend jangka pendek dan momentum di pasaran melalui simulasi silang bata secara dinamik, 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 ////


Lebih lanjut