AlexInc's Bar v1.2 Strategi Pengumpulan Breakout Berdasarkan Penapisan Bar Bermakna

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

img

Ringkasan

Strategi ini meramalkan trend dengan menilai bar bermakna garis K, dan menghasilkan isyarat perdagangan yang digabungkan dengan isyarat pecah. Strategi ini menapis K-line yang terlalu kecil dan hanya menganalisis bar bermakna untuk mengelakkan gangguan dari turun naik kecil yang kerap, menjadikan isyarat lebih lancar dan lebih boleh dipercayai.

Logika Strategi

  1. Menghakimi panjang badan entiti K-garis semasa. Jika ia lebih besar daripada 3 kali nilai badan purata 6 K-garis yang lalu, ia dianggap bar bermakna.

  2. Jika terdapat 3 bar berturut-turut dengan badan panjang, ia dinilai sebagai isyarat panjang.

  3. Semasa menilai isyarat, jika harga memecahkan titik tinggi atau rendah sebelumnya, isyarat perdagangan tambahan juga akan dihasilkan.

  4. Gunakan SMA sebagai penapis. Buka kedudukan hanya apabila harga memecahkan SMA.

  5. Selepas mengambil kedudukan, jika harga memecahkan titik kemasukan atau SMA lagi, tutup kedudukan.

Analisis Kelebihan

  1. Menggunakan bar bermakna untuk menilai trend boleh menapis gangguan yang tidak perlu dan membuat isyarat yang lebih jelas.

  2. Menggabungkan isyarat trend dan isyarat pecah meningkatkan kualiti isyarat dan mengurangkan isyarat palsu.

  3. Penapis SMA mengelakkan membeli tinggi dan menjual rendah. Hanya membeli di bawah Close, menjual di atas Close, dengan itu meningkatkan kebolehpercayaan.

  4. Menetapkan syarat mengambil keuntungan dan menghentikan kerugian memudahkan kawalan risiko yang tepat pada masanya.

Analisis Risiko

  1. Strategi agresif ini menilai isyarat dari hanya 3 bar dan mungkin salah menilai turun naik jangka pendek sebagai pembalikan trend.

  2. Data backtesting yang tidak mencukupi.

  3. Tiada kawalan kedudukan semalam, dengan risiko memegang semalam.

Arahan pengoptimuman

  1. Lebih lanjut mengoptimumkan parameter untuk bar bermakna, seperti bilangan bar yang dinilai dan definisi bermakna.

  2. Uji kesan jangka masa yang berbeza untuk mencari parameter optimum.

  3. Tambah stop loss berasaskan ATR untuk mengawal risiko.

  4. Pertimbangkan untuk menambah kawalan kedudukan sepanjang malam.

Ringkasan

Strategi ini menggunakan penapisan bar yang bermakna dan penghakiman trend untuk menghasilkan isyarat perdagangan yang digabungkan dengan pecah. Ia berkesan menapis turun naik kecil yang tidak perlu untuk isyarat yang lebih jelas dan lebih boleh dipercayai. Walau bagaimanapun, kerana kitaran penghakiman yang pendek, terdapat risiko salah penilaian tertentu. Penambahbaikan lanjut boleh dibuat melalui pengoptimuman parameter dan kawalan 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 lanjut