AlexInc's Bar v1.2 Breakout Akumulasi Strategi Berdasarkan Berarti Bar Filtering

Penulis:ChaoZhang, Tanggal: 2024-01-03 16:30:16
Tag:

img

Gambaran umum

Strategi ini memprediksi tren dengan menilai meaningful bar dari K-line, dan menghasilkan sinyal perdagangan dikombinasikan dengan sinyal breakout.

Logika Strategi

  1. Hukum panjang badan entitas dari garis K saat ini. Jika lebih besar dari 3 kali nilai rata-rata tubuh dari 6 garis K sebelumnya, itu dianggap sebagai bar yang berarti.

  2. Jika ada 3 bar berturut-turut dengan tubuh panjang, itu dinilai sebagai sinyal panjang. Jika ada 3 bar berturut-turut dengan tubuh pendek, itu dinilai sebagai sinyal pendek.

  3. Saat menilai sinyal, jika harga menembus titik tertinggi atau terendah sebelumnya, sinyal perdagangan tambahan juga akan dihasilkan.

  4. Gunakan SMA sebagai filter. Buka posisi hanya ketika harga menerobos SMA.

  5. Setelah mengambil posisi, jika harga menembus titik masuk atau SMA lagi, tutup posisi.

Analisis Keuntungan

  1. Menggunakan "bar yang berarti" untuk menilai tren dapat menyaring gangguan yang tidak perlu dan membuat sinyal yang lebih jelas.

  2. Menggabungkan sinyal tren dan sinyal breakout meningkatkan kualitas sinyal dan mengurangi sinyal palsu.

  3. Filter SMA menghindari membeli tinggi dan menjual rendah. Hanya membeli di bawah Close, menjual di atas Close, sehingga meningkatkan keandalan.

  4. Menetapkan kondisi profit taking dan stop loss memudahkan pengendalian risiko yang tepat waktu.

Analisis Risiko

  1. Strategi agresif ini menilai sinyal dari hanya 3 bar dan mungkin salah menilai fluktuasi jangka pendek sebagai pembalikan tren.

  2. Data backtesting yang tidak cukup. Hasilnya mungkin bervariasi antara produk dan kerangka waktu.

  3. Tidak ada kontrol posisi overnight, dengan risiko memegang overnight.

Arahan Optimasi

  1. Lebih lanjut mengoptimalkan parameter untuk meaningful bars, seperti jumlah bar yang dinilai dan definisi meaningful.

  2. Uji dampak dari kerangka waktu yang berbeda untuk menemukan parameter optimal.

  3. Tambahkan stop loss berbasis ATR untuk mengendalikan risiko.

  4. Pertimbangkan untuk menambahkan kontrol posisi sepanjang malam.

Ringkasan

Strategi ini menggunakan penyaringan bar yang berarti dan penilaian tren untuk menghasilkan sinyal perdagangan yang dikombinasikan dengan breakout. Ini secara efektif menyaring fluktuasi kecil yang tidak perlu untuk sinyal yang lebih jelas dan lebih dapat diandalkan. Namun, karena siklus penilaian yang pendek, ada risiko penilaian yang salah. Peningkatan lebih lanjut dapat dilakukan melalui optimasi parameter dan pengendalian risiko.


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//AlexInc
//2018

// закрытие - вычислить и в течение скольки-то баров его добиваться
// если нет, то по первому противоположному
// по стоп-лоссу в любом случае - стоп вычислить

//@version=2
strategy(title = "AlexInc's Bar v1.2", shorttitle = "AlexInc Bar 1.2", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
tryprofitbars = input(6, defval = 6, minval = 1, maxval = 100, title = "Number of candles to take profit anyway")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")

useSMAfilter = input(false, defval = true, title = "Use SMA filter")
SMAlimit = input(10, defval = 10, minval = 1, maxval = 30, title = "SMA filter limit")
bodysizeMlt = input(3, defval = 3, minval = 1, maxval = 10, title = "Body Size Multiplier")
meanfulbardiv = input(3, title = "Meanful Bar size Divider")

showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//SMA #
index = 0
index := barstate.isfirst ==true ? 0 : nz(index[1])+1

buyindex = 0
buyindex := barstate.isfirst ==true ? 0 : buyindex[1]

sellindex = 0
sellindex := barstate.isfirst ==true ? 0 : sellindex[1]

//predictprofit = barstate.isfirst ==true ? 0 : predictprofit[1]

smafilter = sma(close, SMAlimit)

//Body
body = abs(close - open)
range = abs(high - low)
abody = sma(body, 6)

max3 = 0
if body >= body[1] and body >= body[2]
    max3 := body
else
    if body[1] >= body and body[1] >= body[2]
        max3 := body[1]
    else 
        if body[2] >= body and body[2] >= body[1]
            max3 := body[2]

prevmax3 = 0
prevmax3 := nz(max3[1])


bar = close > open ? 1 : close < open ? -1 : 0
firstbullishopen = 0
firstbullishopen := bar == 1 and bar[1] != 1 ? open : nz(firstbullishopen[1])
firstbearishopen = 0
firstbearishopen := bar == -1 and bar[1] != -1 ? open : nz(firstbearishopen[1])

meanfulbar = body > abody / meanfulbardiv

meanfulbearish = 0
meanfulbearish := nz(meanfulbearish[1])

meanfulbullish = 0
meanfulbullish := nz(meanfulbullish[1])

if meanfulbar
    if bar == 1
        meanfulbullish := 1 + meanfulbullish
        meanfulbearish := 0
    else
        if bar == -1
            meanfulbearish := 1 + meanfulbearish
            meanfulbullish := 0


plot(min(low, high)-10, style=circles, color = meanfulbar ? yellow:black, linewidth=3)

//Signals
up1 = (meanfulbearish >= 3) and (close < firstbullishopen or 1) and (strategy.position_size == 0 or close < strategy.position_avg_price) and body > abody / 5 and (useSMAfilter == false or close < smafilter)
if up1 == true
	predictprofit = sma(body, 3)
up2 = sma(bar, 1) == -1 and body > prevmax3 * bodysizeMlt and (strategy.position_size == 0 or close < strategy.position_avg_price) and body > abody / 5 and (useSMAfilter == false or close < smafilter)
if up2 == true
	predictprofit = body * 0.5
plot(min(low, high), style=circles, color = up1?blue:up2?green:gray, linewidth=3)

dn1 = (meanfulbullish >= 3) and (close > firstbearishopen or 1)  and (strategy.position_size == 0 or close > strategy.position_avg_price) and body > abody / 5 and (useSMAfilter==false or close > smafilter)
if dn1 ==true 
	predictprofit = sma(body, 3)
dn2 = sma(bar, 1) == 1 and body > prevmax3 * bodysizeMlt and (strategy.position_size == 0 or close > strategy.position_avg_price) and body > abody / 5 and (useSMAfilter==false or close > smafilter)
if dn2 ==true	
	predictprofit = body * 0.5
plot(max(low, high), style=circles, color = dn1?blue:dn2?green:gray, linewidth=3)


exit = (((strategy.position_size > 0 and bar == 1 ) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2 )
// or index >= buyindex (or sellindex) + tryprofitbars


//Arrows
col = exit ? black : up1 or dn1 ? blue : up2 or dn2 ? red : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)


//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
		buyindex = index
		sellindex = index
	if strategy.position_size == 0
		buyindex = index
		
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot )

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
		buyindex = index
		sellindex = index
	if strategy.position_size == 0
		sellindex = index
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot )
    
if  exit
    strategy.close_all()

Lebih banyak