Golden Cross dengan Bollinger Bands Strategi Momentum

Penulis:ChaoZhang, Tarikh: 2023-11-21 12:01:25
Tag:

img

Ringkasan

Strategi ini menggabungkan purata bergerak, pita Bollinger dan penunjuk harga purata berwajaran volum (VWAP). Ia memasuki kedudukan panjang apabila salib emas terbentuk dan purata bergerak pantas memecahkan di atas yang perlahan. Strategi ini juga menggunakan saluran pita Bollinger dan hanya mempertimbangkan untuk memasuki apabila harga menyentuh pita bawah, dengan itu mengelakkan kemasukan dan keluar yang kerap di tengah-tengah turun naik pasaran.

Logika Strategi

Logik teras bergantung pada purata bergerak untuk menentukan arah trend, dan pita Bollinger untuk mencari julat turun naik untuk isyarat pembelian.

  1. Membina sistem salib emas menggunakan EMA 50 hari dan EMA 200 hari. Trend menaik dikenal pasti apabila EMA cepat melintasi di atas EMA perlahan.

  2. Apabila harga di atas VWAP, ia menunjukkan harga berada dalam fasa menaik yang memihak kepada kedudukan panjang.

  3. Apabila harga hanya menyentuh atau memecahkan band bawah Bollinger, ia menunjukkan harga mungkin berada berhampiran titik kebangkitan sehingga memberikan peluang yang baik.

  4. Keluar dari kedudukan panjang dengan keuntungan apabila harga melebihi band atas Bollinger.

Dengan menggabungkan peraturan ini, strategi ini dapat mencari entri panjang yang sesuai dalam pasaran lembu dan menetapkan stop loss / mengambil keuntungan untuk memastikan pulangan.

Kelebihan

  • Sistem salib emas menentukan arah trend utama, mengelakkan kemenangan dan kerugian kecil di tengah penyatuan.

  • VWAP mengukur arah gelombang harga untuk isyarat pembelian yang lebih tepat.

  • Band Bollinger menambah daya tahan dengan mencari beli sambil menetapkan stop loss / keuntungan mengambil kunci dalam keuntungan.

  • Pelbagai penanda pengesahan meningkatkan kebolehpercayaan.

Risiko dan Penyelesaian

  • Salib emas mungkin memberi isyarat palsu. fine tune tempoh MA dan menambah pengesahan lain.

  • Parameter Bollinger yang tidak betul boleh membuat strategi tidak berkesan.

  • Sempadan stop loss yang terlalu luas gagal untuk mengehadkan kerugian secara berkesan.

Arahan pengoptimuman

  • Mengoptimumkan gabungan MA dengan menguji parameter yang berbeza untuk mencari yang terbaik.

  • Uji tempoh Bollinger dan set parameter untuk lebar jalur dan turun naik yang lebih baik.

  • Uji dan sesuaikan julat kehilangan berhenti untuk mengimbangi kawalan risiko dan mengelakkan pemicu awal.

Kesimpulan

Strategi ini mencapai keseimbangan antara mencari peluang dan mengawal risiko dengan mengintegrasikan analisis MA, Bollinger dan VWAP untuk entri.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mohanee

//@version=4
strategy(title="VWAP and BB strategy [$$]", overlay=true,pyramiding=2, default_qty_value=1, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)


fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 6, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2020, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
DST = 1 //day light saving for usa
//--- Europe
London = iff(DST==0,"0000-0900","0100-1000")
//--- America
NewYork = iff(DST==0,"0400-1300","0500-1400")
//--- Pacific
Sydney = iff(DST==0,"1300-2200","1400-2300")
//--- Asia
Tokyo = iff(DST==0,"1500-2400","1600-0100")

//-- Time In Range
timeinrange(res, sess) => time(res, sess) != 0

london = timeinrange(timeframe.period, London)
newyork = timeinrange(timeframe.period, NewYork)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate 


is_price_dipped_bb(pds,source1) =>
    t_bbDipped=false
    for i=1 to pds
        t_bbDipped:=  (t_bbDipped   or  close[i]<source1) ? true : false
        if t_bbDipped==true
            break
        else
            continue
            
    t_bbDipped


is_bb_per_dipped(pds,bbrSrc) =>
    t_bbDipped=false
    for i=1 to pds
        t_bbDipped:=  (t_bbDipped   or  bbrSrc[i]<=0) ? true : false
        if t_bbDipped==true
            break
        else
            continue
            
    t_bbDipped
    

// variables  BEGIN
shortEMA = input(50, title="fast EMA", minval=1)
longEMA = input(200, title="slow EMA", minval=1)

//BB

smaLength = input(7, title="BB SMA Length", minval=1)
bbsrc = input(close, title="BB Source")

strategyCalcOption = input(title="strategy to use", type=input.string, options=["BB", "BB_percentageB"],      defval="BB")



//addOnDivergence = input(true,title="Add to existing on Divergence")
//exitOption = input(title="exit on RSI or BB", type=input.string, options=["RSI", "BB"],      defval="BB")

//bbSource = input(title="BB  source", type=input.string, options=["close", "vwap"],      defval="close")
     
//vwap_res = input(title="VWAP Resolution", type=input.resolution, defval="session")
stopLoss = input(title="Stop Loss%", defval=1, minval=1)

//variables  END

longEMAval= ema(close, longEMA)
shortEMAval= ema(close, shortEMA)
ema200val = ema(close, 200)


vwapVal=vwap(close)



// Drawings

//plot emas
plot(shortEMAval, color = color.green, linewidth = 1, transp=0)
plot(longEMAval, color = color.orange, linewidth = 1, transp=0)
plot(ema200val, color = color.purple, linewidth = 2, style=plot.style_line ,transp=0)



//bollinger calculation 
mult = input(2.0, minval=0.001, maxval=50, title="StdDev")
basis = sma(bbsrc, smaLength)
dev = mult * stdev(bbsrc, smaLength)
upperBand = basis + dev
lowerBand = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)

bbr = (bbsrc - lowerBand)/(upperBand - lowerBand) 
//bollinger calculation 

//plot bb
//plot(basis, "Basis", color=#872323, offset = offset)
p1 = plot(upperBand, "Upper", color=color.teal, offset = offset)
p2 = plot(lowerBand, "Lower", color=color.teal, offset = offset)
fill(p1, p2, title = "Background", color=#198787, transp=95)


plot(vwapVal, color = color.purple, linewidth = 2, transp=0)


// Colour background

//barcolor(shortEMAval>longEMAval and close<=lowerBand ? color.yellow: na)
  

//longCondition=  shortEMAval > longEMAval and  close>open and  close>vwapVal
longCondition=  ( shortEMAval > longEMAval  and close>open and close>vwapVal and close<upperBand ) //and time_cond //     and  close>=vwapVal 



//Entry
strategy.entry(id="long", comment="VB LE" , long=true,  when= longCondition and ( strategyCalcOption=="BB"? is_price_dipped_bb(10,lowerBand) : is_bb_per_dipped(10,bbr)  )   and strategy.position_size<1 )   //is_price_dipped_bb(10,lowerBand))  //and strategy.position_size<1       is_bb_per_dipped(15,bbr) 


//add to the existing position
strategy.entry(id="long", comment="Add" , long=true,  when=strategy.position_size>=1 and close<strategy.position_avg_price and close>vwapVal) //and time_cond)

barcolor(strategy.position_size>=1  ? color.blue: na)



strategy.close(id="long", comment="TP Exit",   when=crossover(close,upperBand) )

//stoploss
stopLossVal =   strategy.position_avg_price * (1-(stopLoss*0.01) )
//strategy.close(id="long", comment="SL Exit",   when= close < stopLossVal)

//strategy.risk.max_intraday_loss(stopLoss, strategy.percent_of_equity)

Lebih lanjut