Golden Cross với Bollinger Bands Momentum Strategy

Tác giả:ChaoZhang, Ngày: 2023-11-21 12:01:25
Tags:

img

Tổng quan

Chiến lược này kết hợp trung bình chuyển động, băng Bollinger và chỉ số giá trung bình trọng số (VWAP). Nó đi vào các vị trí dài khi hình thành chéo vàng và trung bình chuyển động nhanh phá vỡ trên mức chậm. Chiến lược cũng sử dụng kênh băng Bollinger và chỉ xem xét vào khi giá chạm vào dải dưới, do đó tránh nhiều lần vào và ra trong bối cảnh biến động của thị trường.

Chiến lược logic

Logic cốt lõi dựa trên các đường trung bình động để xác định hướng xu hướng và các dải Bollinger để xác định phạm vi biến động cho tín hiệu mua.

  1. Xây dựng hệ thống đường chéo vàng bằng cách sử dụng đường EMA 50 ngày và đường EMA 200 ngày.

  2. Khi giá trên VWAP, nó cho thấy giá đang trong giai đoạn tăng mà ủng hộ các vị trí dài.

  3. Khi giá chỉ chạm hoặc phá vỡ dải Bollinger dưới, nó cho thấy giá có thể gần điểm hồi phục do đó cung cấp một cơ hội tốt.

  4. Ra khỏi các vị trí dài với lợi nhuận khi giá vượt quá dải Bollinger trên.

Bằng cách kết hợp các quy tắc này, chiến lược có thể xác định vị trí đầu vào dài phù hợp trong thị trường tăng và đặt dừng lỗ / lợi nhuận để đảm bảo lợi nhuận.

Ưu điểm

  • Hệ thống chéo vàng xác định hướng xu hướng chính, tránh những chiến thắng và thua lỗ nhỏ trong bối cảnh hợp nhất.

  • VWAP đo hướng sóng giá để có tín hiệu mua chính xác hơn.

  • Các băng tần Bollinger tăng khả năng phục hồi bằng cách xác định vị trí mua trong khi thiết lập dừng lỗ / lợi nhuận lấy khóa trong lợi nhuận.

  • Nhiều chỉ số xác nhận tăng độ tin cậy.

Rủi ro và giải pháp

  • Chữ thập vàng có thể đưa ra tín hiệu sai.

  • Các thông số Bollinger không đúng có thể làm cho chiến lược không hiệu quả tối ưu hóa thời gian và lệch chuẩn.

  • Một ngưỡng dừng lỗ quá rộng không hạn chế hiệu quả lỗ.

Hướng dẫn tối ưu hóa

  • Tối ưu hóa sự kết hợp MA bằng cách thử nghiệm các thông số khác nhau để tìm ra tốt nhất.

  • Kiểm tra thời gian Bollinger và các thiết lập tham số để có băng thông và biến động tốt hơn.

  • Kiểm tra và điều chỉnh phạm vi mất mát dừng để cân bằng kiểm soát rủi ro và tránh kích hoạt sớm.

Kết luận

Chiến lược này tạo ra sự cân bằng giữa phát hiện cơ hội và kiểm soát rủi ro bằng cách tích hợp phân tích MA, Bollinger và VWAP cho các mục.


/*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)

Thêm nữa