Strategi Batu Bata Momentum


Tanggal Pembuatan: 2024-02-19 15:32:17 Akhirnya memodifikasi: 2024-02-19 15:32:17
menyalin: 1 Jumlah klik: 577
1
fokus pada
1617
Pengikut

Strategi Batu Bata Momentum

Strategi ini menilai perubahan dinamika pasar dengan mensimulasikan terbentuknya pilar, dan melakukan lebih banyak shorting sesuai dengan arah pilar.

Prinsip Strategi

Prinsip inti dari strategi ini adalah untuk mensimulasikan pembentukan batu bata dengan menghitung hubungan antara ATR dan harga penutupan. Secara khusus, mendefinisikan dua variabel Brick1 dan Brick2.

Brick1 dihitung sebagai berikut: jika harga penutupan lebih dari nilai Brick1 kemarin + ATR, maka Brick1 adalah nilai Brick1 kemarin + ATR; jika harga penutupan kurang dari nilai Brick1 kemarin - ATR, maka Brick1 adalah nilai Brick1 kemarin - ATR; jika tidak, Brick1 akan mewarisi nilai Brick1 kemarin.

Brick2 dihitung sebagai berikut: jika nilai Brick1 tidak sama dengan nilai Brick1 kemarin, maka Brick2 adalah nilai Brick1 kemarin; jika tidak, wariskan nilai Brick2 kemarin.

Ini mensimulasikan pembentukan brick. Ketika Brick1 naik lebih dari satu ATR, maka terbentuklah sebuah brick up; bila Brick1 turun lebih dari satu ATR, maka terbentuklah sebuah brick down. Brick2 adalah catatan tentang posisi sebuah brick.

Ketika Brick1 dan Brick2 terjadi upward crossing, berarti batang mengembang ke atas dan dinilai sebagai multicap; ketika Brick1 dan Brick2 terjadi downward crossing, berarti batang menyusut ke bawah dan dinilai sebagai kosong.

Keunggulan Strategis

  1. Menggunakan ATR untuk menilai pembentukan kerumunan, menghindari penggunaan kerumunan berukuran tetap, dan beradaptasi secara dinamis terhadap pergerakan pasar
  2. Perbedaan arah polygon dan perubahan momentum diukur dari perpaduan
  3. Sensitivitas terhadap penilaian dinamika pasar dapat disesuaikan dengan siklus ATR yang berbeda
  4. Pembentukan dan persilangan kerucut yang terlihat, intuitif untuk menilai tren pasar

Risiko Strategis

  1. Jika ATR terlalu kecil, maka terlalu banyak lemparan yang terbentuk, menghasilkan lebih banyak sinyal yang tidak valid; jika ATR terlalu besar, maka terlalu sedikit lemparan, mudah untuk melewatkan peluang.
  2. Pergerakan sebenarnya mungkin tidak mengikuti bentuk mata uang kripto, dan sinyal silang mata uang kripto mungkin akan ditolak oleh pembalikan pasar.
  3. Perlu sangat sensitif terhadap biaya transaksi, jika tidak, seringnya transaksi yang saling melintang akan sangat mengurangi laba bersih.

Periode ATR optimal dapat ditemukan dengan mengoptimalkan parameter; menyesuaikan strategi stop loss untuk mengurangi kerugian yang dihasilkan oleh sinyal yang tidak efektif; memperbesar varietas perdagangan yang tepat untuk mengurangi dampak biaya pada keuntungan.

Optimasi Strategi

  1. Dapat digabungkan dengan indikator lain untuk memfilter sinyal, seperti indikator energi kuantitatif, indikator getaran, dan lain-lain, untuk menghindari sinyal yang tidak valid
  2. Menambahkan filter tren, hanya mengirimkan sinyal ke arah tren, menghindari terbalik kerugian
  3. Menggunakan metode optimasi parameter seluruh sampel selama periode pengujian untuk mencari parameter optimal secara otomatis

Meringkaskan

Strategi ini menilai tren dan dinamika jangka pendek di pasar melalui perpaduan simulasi dinamis. Strategi ini memiliki ruang yang lebih besar untuk dioptimalkan, optimalisasi parameter dan pemfilteran sinyal dapat meningkatkan stabilitas lebih lanjut.

Kode Sumber Strategi
/*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 ////