Strategi Bata Momentum


Tarikh penciptaan: 2024-02-19 15:32:17 Akhirnya diubah suai: 2024-02-19 15:32:17
Salin: 1 Bilangan klik: 577
1
fokus pada
1617
Pengikut

Strategi Bata Momentum

Strategi ini menilai perubahan dinamik pasaran dengan mensimulasikan pembentukan tiub dan melakukan lebih banyak blanja mengikut arah tiub.

Prinsip Strategi

Prinsip utama strategi ini adalah untuk mensimulasikan pembentukan batu bata dengan mengira hubungan antara ATR dan harga penutupan. Secara khusus, menentukan dua pembolehubah Brick1 dan Brick2.

Brick1 dikira dengan cara ini: jika harga penutupan melebihi nilai Brick1 semalam + ATR, maka Brick1 adalah nilai Brick1 semalam + ATR; jika harga penutupan lebih rendah daripada nilai Brick1 semalam - ATR, maka Brick1 adalah nilai Brick1 semalam - ATR; jika tidak, Brick1 mewarisi nilai Brick1 semalam.

Brick2 dikira dengan cara ini: jika nilai Brick1 tidak sama dengan nilai Brick1 semalam, maka Brick2 adalah nilai Brick1 semalam; jika tidak, waris nilai Brick2 semalam.

Ini mensimulasikan pembentukan kerucut. Apabila Brick1 naik melebihi satu ATR, ia membentuk kerucut ke atas; apabila Brick1 turun melebihi satu ATR, ia membentuk kerucut ke bawah. Brick2 adalah untuk mencatat kedudukan kerucut.

Apabila Brick1 dan Brick2 berlaku bersilang ke atas, menunjukkan pelombong meluas ke atas, diadili sebagai multicap; apabila Brick1 dan Brick2 berlaku bersilang ke bawah, menunjukkan pelombong menyusut ke bawah, diadili sebagai kosong.

Kelebihan Strategik

  1. Menggunakan ATR untuk menilai pembentukan titisan, mengelakkan penggunaan titisan bersaiz tetap, dan menyesuaikan diri secara dinamik dengan turun naik pasaran
  2. Untuk menilai arah polygonal melalui perpaduan gelung, untuk mengenal pasti perubahan momentum
  3. Sensitiviti kepada penilaian pergerakan pasaran boleh disesuaikan dengan kitaran ATR yang berbeza
  4. Keadaan pembentukan dan persilangan kerucut yang dapat dilihat, menilai pergerakan pasaran secara intuitif

Risiko Strategik

  1. Ukuran ATR yang dipilih akan mempengaruhi kadar keuntungan strategi. Jika ATR terlalu kecil, terlalu banyak gout akan terbentuk dan menghasilkan lebih banyak isyarat tidak sah; jika ATR terlalu besar, terlalu sedikit gout, mudah untuk kehilangan peluang.
  2. Pergerakan sebenar mungkin tidak mengikut bentuk lembu, dan isyarat silang lembu mungkin ditolak oleh pembalikan pasaran.
  3. Perlu sangat sensitif terhadap kos urus niaga, jika tidak, pertukaran yang kerap akan mengurangkan keuntungan bersih.

Anda boleh mencari kitaran ATR yang optimum dengan mengoptimumkan parameter; menyesuaikan strategi stop loss untuk mengurangkan kerugian yang disebabkan oleh isyarat yang tidak berkesan; memperbesar varieti perdagangan dengan sewajarnya untuk mengurangkan kesan kos terhadap keuntungan.

Pengoptimuman Strategi

  1. Isyarat penapisan boleh digabungkan dengan indikator lain, seperti indikator tenaga kuantitatif, indikator getaran, dan lain-lain, untuk mengelakkan isyarat tidak sah
  2. Menambah penapis trend, memberi isyarat hanya ke arah trend, mengelakkan kehilangan pembalikan
  3. Menggunakan kaedah pengoptimuman parameter sampel keseluruhan dalam tempoh ujian untuk mencari parameter optimum secara automatik

ringkaskan

Strategi ini menilai trend dan momentum jangka pendek di pasaran melalui persilangan paip simulasi dinamik, untuk memvisualisasikan bentuk secara langsung. Strategi mempunyai ruang pengoptimuman yang besar, pengoptimuman parameter dan penapisan isyarat dapat meningkatkan kestabilan lebih lanjut.

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