
Chiến lược này chủ yếu dựa trên các chỉ số Brin và RSI để đánh giá tín hiệu giao dịch, thuộc về chiến lược kết hợp điển hình. Nó sử dụng lợi thế của các chỉ số khác nhau để xác định hướng xu hướng thông qua Brin, RSI để phát hiện trường hợp mua quá mức, do đó, nhập vào và thoát khỏi lỗ.
Sử dụng đường trung, đường lên, đường xuống của băng Brin để xác định xu hướng giá cổ phiếu hiện tại. Khi giá phá vỡ đường lên, nó được coi là đi vào thị trường lạc quan, và khi phá vỡ đường xuống, nó được coi là đi vào thị trường giảm giá.
Burin bandwidth (trải cách giữa đường ray trên và đường ray dưới) phản ánh sự biến động của thị trường hiện tại. Khi burin bandwidth tăng lên, nó cho thấy sự biến động tăng lên, và RSI có thể phát hiện tốt hơn khi mua quá mức.
Chỉ số RSI đánh giá quá mua quá bán. RSI cao hơn 70 là vùng mua quá và thấp hơn 30 là vùng bán quá. Tránh vùng mua quá để có được tỷ lệ lợi nhuận rủi ro tốt hơn.
Các tín hiệu giao dịch: (1) Hình ảnh báo hiệu: giá lên đường và RSI không mua quá mức (RSI nhỏ hơn 70) (2) Tín hiệu giảm: Giá giảm xuống đường và RSI không bán quá ((RSI lớn hơn 30)
Tháo lỗ: giao dịch giảm giá sẽ dừng nếu RSI giảm xuống 70; giao dịch giảm giá sẽ dừng nếu RSI tăng lên 30.
Chiến lược này có những ưu điểm sau:
Những lợi thế của việc kết hợp nhiều chỉ số, thông tin toàn diện hơn, tín hiệu đáng tin cậy hơn.
Sử dụng dây chuyền Brin để xác định hướng đi chung, hỗ trợ các sàn lớn, nắm bắt xu hướng.
Chỉ số RSI sẽ đánh giá một số điểm mua quá mức và bán quá mức để tránh rủi ro không cần thiết.
Cơ chế ngăn chặn thiệt hại nghiêm ngặt hơn, giúp giảm thiệt hại.
Chiến lược này cũng có những rủi ro sau:
Các chỉ số RSI và Binance có thể bị lỗi, dẫn đến các tín hiệu giao dịch bị lỗi.
Mặc dù có các biện pháp ngăn chặn, việc thiết lập điểm dừng không đúng cách vẫn có thể gây ra tổn thất lớn.
Việc giao dịch quá thường xuyên sẽ làm tăng phí giao dịch và chi phí trượt.
PARAMETERS không được tối ưu hóa có thể dẫn đến quá phù hợp.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Kiểm tra các kết hợp các tham số chỉ số khác nhau để tìm tham số tối ưu.
Tăng tính linh hoạt cho các phương thức dừng lỗ, chẳng hạn như dừng ADDR / ATR, dừng di chuyển.
Thêm các chiến lược quản lý vị trí, chẳng hạn như vị trí cố định, Martingale, v.v.
Nó được kết hợp với các chỉ số khác để lọc các tín hiệu, chẳng hạn như năng lượng giao dịch.
Sử dụng học máy để tối ưu hóa tham số thích ứng.
Tối ưu hóa thời gian nhập cảnh, nhập cảnh sau khi có tín hiệu xác nhận xu hướng.
Chiến lược này nói chung là một chiến lược kết hợp đa chỉ số điển hình. Nó tích hợp các lợi thế của Bollinger Bands và RSI, trong khi nắm bắt xu hướng, tránh rủi ro bán tháo địa phương.
/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 2h
basePeriod: 15m
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/
// © evillalobos1123
//@version=5
strategy("Villa Dinamic Pivot Supertrend Strategy", overlay=true, calc_on_every_tick = true, default_qty_type = strategy.fixed)
//INPUTS
ema_b = input.bool(false, "Use Simple EMA Filter", group = "Strategy Inputs")
ema_b_ang = input.bool(true, "Use DEMA Angle Filter", group = "Strategy Inputs")
dema_b = input.bool(true, "Use DEMA Filter", group = "Strategy Inputs")
st_sig = input.bool(false, "Take Every Supertrend Signal" , group = "Strategy Inputs")
take_p = input.bool(true, "Stop Loss at Supertrend", group = "Strategy Inputs")
din_tp = input.bool(false, "2 Steps Take Profit", group = "Strategy Inputs")
move_sl = input.bool(true, "Move SL", group = "Strategy Inputs")
sl_atr = input.float(2.5, "Stop Loss ATR Multiplier", group = "Strategy Inputs")
tp_atr = input.float(4, "Take Profit ATR Multiplier", group = "Strategy Inputs")
din_tp_qty = input.int(50, "2 Steps TP qty%", group = "Strategy Inputs")
dema_a_filter = input.float(0, "DEMA Angle Threshold (+ & -)", group = "Strategy Inputs")
dema_a_look = input.int(1, "DEMA Angle Lookback", group = "Strategy Inputs")
dr_test = input.string("Backtest", "Testing", options = ["Backtest", "Forwardtest", "All"], group = "Strategy Inputs")
not_in_trade = strategy.position_size == 0
//Backtesting date range
start_year = input.int(2021, "Backtesting start year", group = "BT Date Range")
start_month = input.int(1, "Backtesting start month", group = "BT Date Range")
start_date = input.int(1, "Backtesting start day", group = "BT Date Range")
end_year = input.int(2021, "Backtesting end year", group = "BT Date Range")
end_month = input.int(12, "Backtesting end month", group = "BT Date Range")
end_date = input.int(31, "Backtesting end day", group = "BT Date Range")
bt_date_range = (time >= timestamp(syminfo.timezone, start_year,
start_month, start_date, 0, 0)) and
(time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0))
//Forward testing date range
start_year_f = input.int(2022, "Forwardtesting start year", group = "FT Date Range")
start_month_f = input.int(1, "Forwardtesting start month", group = "FT Date Range")
start_date_f = input.int(1, "Forwardtesting start day", group = "FT Date Range")
end_year_f = input.int(2022, "Forwardtesting end year", group = "FT Date Range")
end_month_f = input.int(03, "Forwardtesting end month", group = "FT Date Range")
end_date_f = input.int(26, "Forwardtesting end day", group = "FT Date Range")
ft_date_range = (time >= timestamp(syminfo.timezone, start_year_f,
start_month_f, start_date_f, 0, 0)) and
(time < timestamp(syminfo.timezone, end_year_f, end_month_f, end_date_f, 0, 0))
//date condition
date_range_cond = if dr_test == "Backtest"
bt_date_range
else if dr_test == "Forwardtest"
ft_date_range
else
true
//INDICATORS
//PIVOT SUPERTREND
prd = input.int(2, "PVT ST Pivot Point Period", group = "Pivot Supertrend")
Factor=input.float(3, "PVT ST ATR Factor", group = "Pivot Supertrend")
Pd=input.int(9 , "PVT ST ATR Period", group = "Pivot Supertrend")
// get Pivot High/Low
float ph = ta.pivothigh(prd, prd)
float pl = ta.pivotlow(prd, prd)
// calculate the Center line using pivot points
var float center = na
float lastpp = ph ? ph : pl ? pl : na
if lastpp
if na(center)
center := lastpp
else
//weighted calculation
center := (center * 2 + lastpp) / 3
// upper/lower bands calculation
Up = center - (Factor * ta.atr(Pd))
Dn = center + (Factor * ta.atr(Pd))
// get the trend
float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown
// check and plot the signals
bsignal = Trend == 1 and Trend[1] == -1
ssignal = Trend == -1 and Trend[1] == 1
//get S/R levels using Pivot Points
float resistance = na
float support = na
support := pl ? pl : support[1]
resistance := ph ? ph : resistance[1]
//DEMA
dema_ln = input.int(200, "DEMA Len", group = 'D-EMAs')
dema_src = input.source(close, "D-EMAs Source", group = 'D-EMAs')
ema_fd = ta.ema(dema_src, dema_ln)
dema = (2*ema_fd)-(ta.ema(ema_fd,dema_ln))
//EMA
ema1_l = input.int(21, "EMA 1 Len", group = 'D-EMAs')
ema2_l = input.int(50, "EMA 2 Len", group = 'D-EMAs')
ema3_l = input.int(200, "EMA 3 Len", group = 'D-EMAs')
ema1 = ta.ema(dema_src, ema1_l)
ema2 = ta.ema(dema_src, ema2_l)
ema3 = ta.ema(dema_src, ema3_l)
//Supertrend
Periods = input.int(21, "ST ATR Period", group = "Normal Supertrend")
src_st = input.source(hl2, "ST Supertrend Source", group = "Normal Supertrend")
Multiplier = input.float(2.0 , "ST ATR Multiplier", group = "Normal Supertrend")
changeATR= true
atr2 = ta.sma(ta.tr, Periods)
atr3= changeATR ? ta.atr(Periods) : atr2
up=src_st-(Multiplier*atr3)
up1 = nz(up[1],up)
up := close[1] > up1 ? math.max(up,up1) : up
dn=src_st+(Multiplier*atr3)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
buySignal = trend == 1 and trend[1] == -1
sellSignal = trend == -1 and trend[1] == 1
//ATR
atr = ta.atr(14)
///CONDITIONS
//BUY
/// ema simple
ema_cond_b = if ema_b
ema1 > ema2 and ema2 > ema3
else
true
///ema angle
dema_angle_rad = math.atan((dema - dema[dema_a_look])/0.0001)
dema_angle = dema_angle_rad * (180/math.pi)
dema_ang_cond_b = if ema_b_ang
if dema_angle >= dema_a_filter
true
else
false
else
true
///ema distance
dema_cond_b = if dema_b
close > dema
else
true
//supertrends
///if pivot buy sig or (st buy sig and pivot. trend = 1)
pvt_cond_b = bsignal
st_cond_b = if st_sig
buySignal and Trend == 1
else
false
st_entry_cond = pvt_cond_b or st_cond_b
///stop loss tp
sl_b = if take_p
if trend == 1
up
else
close - (atr * sl_atr)
else
close - (atr * sl_atr)
tp_b = if take_p
if trend == 1
close + ((close - up) * (tp_atr / sl_atr))
else
close + (atr * tp_atr)
else
close + (atr * tp_atr)
//position size
init_cap = strategy.equity
pos_size_b = math.round((init_cap * .01) / (close - sl_b))
ent_price = strategy.opentrades.entry_price(strategy.opentrades - 1)
var sl_b_n = 0.0
var tp_b_n = 0.0
longCondition = (ema_cond_b and dema_cond_b and dema_ang_cond_b and st_entry_cond and date_range_cond and not_in_trade)
if (longCondition)
strategy.entry("Long", strategy.long, qty = pos_size_b)
sl_b_n := sl_b
tp_b_n := tp_b
ent_price := strategy.opentrades.entry_price(strategy.opentrades - 1)
if (up[1] < ent_price and up >= ent_price and trend[0] == 1)
if din_tp
strategy.close("Long", qty_percent = din_tp_qty)
if move_sl
sl_b_n := ent_price
strategy.exit("Exit", "Long", stop =sl_b_n, limit = tp_b_n)
//sell
///ema simple
ema_cond_s = if ema_b
ema1 < ema2 and ema2 < ema3
else
true
//ema distance
dema_cond_s = if dema_b
close < dema
else
true
//dema angle
dema_ang_cond_s = if ema_b_ang
if dema_angle <= (dema_a_filter * -1)
true
else
false
else
true
//supertrends
///if pivot buy sig or (st buy sig and pivot. trend = 1)
pvt_cond_s = ssignal
st_cond_s = if st_sig
sellSignal and Trend == -1
else
false
st_entry_cond_s = pvt_cond_s or st_cond_s
///stop loss tp
sl_s = if take_p
if trend == -1
dn
else
close + (atr * sl_atr)
else
close + (atr * sl_atr)
tp_s = if take_p
if trend == -1
close - ((dn - close) * (tp_atr / sl_atr))
else
close - (atr * tp_atr)
else
close - (atr * tp_atr)
shortCondition = (ema_cond_s and dema_cond_s and dema_ang_cond_s and st_entry_cond_s and not_in_trade)
pos_size_s = math.round((init_cap * .01) / (sl_s - close))
var sl_s_n = 0.0
var tp_s_n = 0.0
if (shortCondition)
strategy.entry("Short", strategy.short, qty = pos_size_s)
sl_s_n := sl_s
tp_s_n := tp_s
if (dn[1] > ent_price and dn <= ent_price and trend[0] == -1)
if din_tp
strategy.close("Short", qty_percent = din_tp_qty)
if move_sl
sl_s_n := ent_price
strategy.exit("Exit", "Short", stop = sl_s_n, limit = tp_s_n)