Strategi akumulasi breakout berdasarkan penyaringan bar yang signifikan


Tanggal Pembuatan: 2024-01-03 16:30:16 Akhirnya memodifikasi: 2024-01-03 16:30:16
menyalin: 0 Jumlah klik: 585
1
fokus pada
1621
Pengikut

Strategi akumulasi breakout berdasarkan penyaringan bar yang signifikan

Ringkasan

Strategi ini memprediksikan tren dengan menilai garis K yang berkedip dan menghasilkan sinyal perdagangan dengan kombinasi sinyal yang pecah. Strategi ini akan memfilter garis K yang terlalu kecil dan hanya menganalisis garis K yang berkedip. Strategi ini dapat menghindari gangguan yang terlalu sering terjadi, sehingga sinyal lebih stabil dan dapat diandalkan.

Prinsip Strategi

  1. Untuk menentukan panjang entitas dari garis K saat ini, jika lebih dari 3 kali rata-rata dari 6 garis K sebelumnya, maka dianggap sebagai garis pilar yang bermakna.

  2. Jika 3 batang berturut-turut dari garis-garis yang berupa tiang adalah garis yang berlawanan, maka sinyal tersebut dianggap sebagai sinyal multihead. Jika 3 batang berturut-turut dari garis-garis yang berupa tiang adalah garis yang berlawanan, maka sinyal tersebut dianggap sebagai sinyal kosong.

  3. Pada saat menilai sinyal, sinyal perdagangan tambahan akan dihasilkan jika harga mencapai titik tinggi atau rendah sebelum terobosan.

  4. Dengan menggunakan SMA rata-rata sebagai filter, hanya membuka posisi ketika harga menembus SMA.

  5. Setelah memegang posisi, jika harga kembali menembus titik masuk atau garis rata-rata SMA, maka posisi kosong.

Analisis Keunggulan

  1. Dengan menggunakan filter pilar makna untuk menilai tren, Anda dapat menyaring gangguan yang tidak perlu dan membuat sinyal lebih jelas.

  2. Kombinasi sinyal tren dan sinyal breakout dapat meningkatkan kualitas sinyal dan mengurangi sinyal palsu.

  3. SMA rata-rata filter menghindari mengejar tinggi dan turun. Membeli di bawah penutupan, menjual di atas penutupan, meningkatkan keandalan sinyal.

  4. Tetapkan kondisi stop loss yang dapat menghentikan stop loss tepat waktu, yang bermanfaat untuk menjaga dana.

Analisis risiko

  1. Strategi ini lebih radikal, menggunakan 3 garis K untuk menilai sinyal, dan dapat salah mengartikan getaran jangka pendek sebagai pembalikan tren.

  2. Data tes tidak mencukupi, dan efek mungkin berbeda antara varietas dan siklus.

  3. Tidak ada kontrol posisi bermalam di atas meja malam, ada risiko posisi bermalam.

Arah optimasi

  1. Parameter untuk pilar-pilar yang memiliki makna dapat dioptimalkan lebih lanjut, seperti jumlah K-line yang dihitung, definisi pilar-pilar yang memiliki makna, dan sebagainya.

  2. Dapat menguji pengaruh parameter siklus yang berbeda pada efek, mencari siklus optimal.

  3. ATR Stop loss dapat ditambahkan untuk mengendalikan risiko.

  4. Logika pengendalian posisi overnight dapat dipertimbangkan.

Meringkaskan

Strategi ini menggunakan penyaringan pilar berartinya dan penilaian tren, dikombinasikan dengan sinyal perdagangan formasi terobosan, dapat secara efektif memfilter terlalu banyak fluktuasi kecil yang tidak perlu, sinyal lebih jelas dan dapat diandalkan. Namun, karena siklus penilaian yang lebih pendek, mungkin ada risiko kesalahan penilaian tertentu. Dapat disempurnakan lebih lanjut melalui pengoptimalan parameter dan metode kontrol angin.

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