Strategi Momentum Brick

Penulis:ChaoZhangTanggal: 2024-02-19 15:32:17
Tag:

img

Strategi ini menilai perubahan momentum pasar berdasarkan pembentukan batu bata simulasi dan panjang atau pendek pada arah batu bata.

Logika Strategi

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.

Keuntungan

  1. Menggunakan ATR untuk menentukan pembentukan batu bata, menghindari ukuran batu bata tetap, dapat beradaptasi secara dinamis dengan fluktuasi pasar
  2. Mengidentifikasi perubahan momentum melalui silang batu bata
  3. Sensitivitas terhadap penilaian momentum pasar dapat disesuaikan dengan siklus ATR yang berbeda
  4. Visualisasikan pembentukan dan persilangan batu bata untuk secara intuitif menentukan tren pasar

Risiko

  1. Pemilihan ukuran ATR akan mempengaruhi strategi pengembalian. ATR yang terlalu kecil menghasilkan terlalu banyak sinyal yang tidak valid. ATR yang terlalu besar menyebabkan terlalu sedikit batu bata dan potensi kehilangan kesempatan.
  2. Tren yang sebenarnya mungkin tidak mengikuti pola bata. sinyal silang bata dapat dibatalkan oleh pembalikan pasar.
  3. Perlu sangat sensitif terhadap biaya transaksi. perdagangan sering berdasarkan batu bata crossover akan sangat mengurangi laba bersih.

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.

Optimalisasi

  1. Gabungkan dengan indikator lain untuk penyaringan sinyal untuk menghindari sinyal yang tidak valid, misalnya indikator volume dan volatilitas
  2. Tambahkan penyaringan tren, mengeluarkan sinyal hanya dalam arah tren untuk menghindari kerugian pembalikan
  3. Mengadopsi optimasi parameter sampel penuh selama periode pengujian untuk menemukan parameter optimal secara otomatis

Ringkasan

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


Lebih banyak