Chiến lược Supertrend Advance là một phiên bản được tối ưu hóa và nâng cấp dựa trên chỉ số Supertrend cổ điển. Nó kết hợp hành động giá, biến động và nhiều chỉ số kỹ thuật để cải thiện chất lượng tín hiệu, giảm tiếng ồn và nắm bắt chính xác hơn những thay đổi trong xu hướng thị trường.
Cốt lõi của Chiến lược Supertrend Advance là đường Supertrend. Nó được tính dựa trên phạm vi trung bình thực sự và đà giá để xác định hướng xu hướng tiềm năng và các điểm uốn cong. Khi giá trên đường Supertrend, nó chỉ ra xu hướng tăng. Ngược lại, khi dưới đường, nó báo hiệu xu hướng giảm.
Không giống như chỉ số Supertrend truyền thống chủ yếu xem xét giá đóng cửa và ATR, chiến lược Advance cũng kết hợp các chiều như khối lượng giao dịch, dao động động lực và thậm chí dữ liệu cơ bản để xác nhận độ tin cậy của tín hiệu.
Những lợi thế chính của Chiến lược Supertrend Advance bao gồm:
Xác định xu hướng chính xác hơn và lọc breakout sai. Bằng cách chờ xác nhận từ nhiều chỉ số, chiến lược cải thiện đáng kể độ chính xác.
Giảm nhiễu âm thanh. Sự kết hợp của các bộ lọc lọc dữ liệu thị trường không quan trọng quá mức, làm cho các phán đoán rõ ràng hơn.
Quản lý rủi ro được cải thiện. Các tín hiệu giao dịch rõ ràng giúp lập kế hoạch dừng lỗ và thu lợi nhuận hiệu quả hơn.
Sự linh hoạt: Ngoài việc xác định xu hướng, chiến lược cũng có thể kết hợp với các công cụ kỹ thuật khác để tạo ra các hệ thống giao dịch toàn diện.
Chiến lược Supertrend Advance cũng có những rủi ro lớn sau:
Các rủi ro thiết lập tham số: Sự kết hợp các tham số không chính xác có thể làm cho chiến lược không hiệu quả hoặc kích hoạt quá nhiều tín hiệu sai.
Không có chiến lược nào có thể tránh hoàn toàn nguy cơ sai đánh giá. Khi xu hướng thay đổi bất ngờ, có thể phải chịu tổn thất.
Rủi ro tối ưu hóa quá mức: Khi các thông số được trang bị quá nhiều cho dữ liệu lịch sử, chiến lược có thể không thích nghi với các điều kiện thị trường thay đổi.
Rủi ro chi phí giao dịch: Khi tần suất giao dịch tăng lên, chi phí như hoa hồng và trượt cũng tăng đáng kể.
Các giải pháp tương ứng:
Tối ưu hóa các thiết lập tham số và thường xuyên kiểm tra độ bền.
Thiết lập dừng lỗ và lấy lợi nhuận để giới hạn mỗi lỗ giao dịch.
Tránh tối ưu hóa quá mức để duy trì khả năng khái quát hóa.
Tính toán rủi ro/lợi nhuận của tín hiệu và quản lý chi phí giao dịch.
Chiến lược Supertrend Advance có thể được tối ưu hóa trong các khía cạnh sau:
Điều chỉnh các tham số dựa trên các thị trường khác nhau để phù hợp hơn với đặc điểm của họ. ví dụ, giảm độ dài chu kỳ cho các thị trường biến động.
Thêm các cơ chế lọc thích nghi vào các chỉ báo tự động hoặc vô hiệu hóa các bộ lọc trong một số trạng thái thị trường nhất định.
Khám phá các phương pháp học máy để tối ưu hóa các tham số một cách năng động bằng cách sử dụng mạng thần kinh.
Kết hợp dữ liệu tâm lý và phân tích tin tức để cải thiện hiệu suất bằng cách sử dụng dữ liệu không cấu trúc.
Thêm khả năng kích thước vị trí để tăng lợi nhuận khi tỷ lệ thắng rất cao.
Bằng cách giới thiệu nhiều bộ lọc và chỉ số xác nhận, Chiến lược Supertrend Advance tối ưu hóa chỉ số Supertrend cổ điển để đánh giá xu hướng chính xác hơn và cải thiện chất lượng tín hiệu. So với các chỉ số duy nhất, chiến lược đa chiều này cung cấp các giải pháp giao dịch mạnh mẽ, toàn diện và hiệu quả hơn. Tuy nhiên, các rủi ro như điều chỉnh tham số không chính xác và lỗi đánh giá cũng nên được bảo vệ bằng cách áp dụng các biện pháp kiểm soát rủi ro thích hợp. Với việc tối ưu hóa hơn và tích hợp với các công cụ khác, Chiến lược Supertrend Advance có tiềm năng ứng dụng to lớn.
/*backtest start: 2023-12-31 00:00:00 end: 2024-01-07 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © JS_TechTrading //@version=5 strategy("Supertrend advance", overlay=true,default_qty_type =strategy.percent_of_equity,default_qty_value = 1,process_orders_on_close = false) // group string//// var string group_text000="Choose Strategy" var string group_text0="Supertrend Settings" var string group_text0000="Ema Settings" var string group_text00="Rsi Settings" var string group_text1="Backtest Period" var string group_text2="Trade Direction" var string group_text3="Quantity Settings" var string group_text4="Sl/Tp Settings" var string group_text5="Enable/Disable Condition Filter" var string group_macd="Macd Set" var group_cci="Cci Set" var string group_text6="Choose Sl/Tp" var string group_text7="Percentage Sl/Tp" var string group_text9="Atr SL/Tp" var string group_text8='Swing Hl & Supertrend Sl/Tp' // filter enable and disbale on_ma =input.bool(true,"Ema Condition On/Off",group=group_text5,inline = "CL") en_rsi = input.bool(true,"Rsi Condition On/Off",group = group_text5,inline = "CL") en_macd=input.bool(true,title ="Enable Macd Condition",group =group_text5,inline = "CS") en_cci=input.bool(true,title ="Enable/Disable CCi Filter",group =group_text5,inline = "CS") //////////////////// option_ch=input.string('Pullback',title = "Type Of Stratgey",options =['Pullback','Simple'],group = "Choose Strategy Type") // option for stop loss and take profit option_ts=input.string("Percentage","Chosse Type Of Sl/tp",["Percentage","Supertrend","Swinghl","Atr"],group=group_text6) //atr period input supertrend atrPeriod = input(10, "ATR Length",group = group_text0) factor = input.float(3.0, "Factor", step = 0.01,group=group_text0) [supertrend, direction] = ta.supertrend(factor, atrPeriod) bodyMiddle = plot((open + close) / 2, display=display.none) upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(direction < 0? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 90), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 90), fillgaps=false) long=direction < 0 ? supertrend : na short=direction < 0? na : supertrend longpos=false shortpos=false longpos :=long?true :short?false:longpos[1] shortpos:=short?true:long?false:shortpos[1] fin_pullbuy= (ta.crossunder(low[1],long) and long and high>high[1]) fin_pullsell=(ta.crossover(high[1],short) and short and low<low[1]) //Ema 1 ma_len= input.int(200, minval=1, title="Ema Length",group = group_text0000) ma_src = input.source(close, title="Ema Source",group = group_text0000) ma_out = ta.ema(ma_src, ma_len) ma_buy=on_ma?close>ma_out?true:false:true ma_sell=on_ma?close<ma_out?true:false:true // rsi indicator and condition // Get user input rsiSource = input(title='RSI Source', defval=close,group = group_text00) rsiLength = input(title='RSI Length', defval=14,group = group_text00) rsiOverbought = input(title='RSI BUY Level', defval=50,group = group_text00) rsiOversold = input(title='RSI SELL Level', defval=50,group = group_text00) // Get RSI value rsiValue = ta.rsi(rsiSource, rsiLength) rsi_buy=en_rsi?rsiValue>=rsiOverbought ?true:false:true rsi_sell=en_rsi?rsiValue<=rsiOversold?true:false:true // Getting inputs macd fast_length = input(title="Fast Length", defval=12,group =group_macd) slow_length = input(title="Slow Length", defval=26,group =group_macd) macd_src = input(title="Source", defval=close,group =group_macd) signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9,group =group_macd) [macdLine, signalLine, histLine] = ta.macd(macd_src, fast_length ,slow_length,signal_length) buy_macd=en_macd?macdLine>0?true:false:true sell_macd=en_macd?macdLine<0?true:false:true // CCI indicator length_cci = input.int(20, minval=1,group = group_cci) src_cci = input(hlc3, title="Source",group = group_cci) cci_gr=input.int(200,title = "CCi > Input",group = group_cci,tooltip ="CCi iS Greater thn 100 buy") cci_ls=input.int(-200,title = "CCi < -Input",group = group_cci,tooltip ="CCi iS Less thn -100 Sell") ma = ta.sma(src_cci, length_cci) cci = (src_cci - ma) / (0.015 * ta.dev(src_cci, length_cci)) //cci buy and sell buy_cci=en_cci?cci>cci_gr?true:false:true sell_cci=en_cci?cci<cci_ls?true:false:true // final condition buy_cond=option_ch=='Simple'?long and not(longpos[1]) and rsi_buy and ma_buy and buy_macd and buy_cci:option_ch=='Pullback'?fin_pullbuy and rsi_buy and ma_buy and buy_macd and buy_cci:na sell_cond=option_ch=='Simple'?short and not(shortpos[1]) and rsi_sell and ma_sell and sell_macd and sell_cci:option_ch=='Pullback'?fin_pullsell and rsi_sell and ma_sell and sell_macd and sell_cci:na //backtest engine start = input(timestamp('2005-01-01'), title='Start calculations from',group=group_text1) end=input(timestamp('2045-03-01'), title='End calculations',group=group_text1) time_cond = true // Make input option to configure trade direction tradeDirection = input.string(title='Trade Direction', options=['Long', 'Short', 'Both'], defval='Both',group = group_text2) // Translate input into trading conditions longOK = (tradeDirection == "Long") or (tradeDirection == "Both") shortOK = (tradeDirection == "Short") or (tradeDirection == "Both") // quantity qty_new=input.float(1.0,step =0.10,title ="Quantity",group =group_text3) // supertrend and swing high and low tpnewf = input.float(title="take profit swinghl||supertrend ", step=0.1, defval=1.5, group=group_text8) hiLen = input.int(title='Highest High Lookback', defval=6, minval=2, group=group_text8) loLen = input.int(title='Lowest Low Lookback', defval=6, minval=2, group=group_text8) globl = option_ts=="Swinghl"? nz(ta.lowest(low, loLen),low[1]):option_ts=="Supertrend"?nz(supertrend,low[1]):na globl2=option_ts=="Swinghl"? nz(ta.highest(high, hiLen),high[1]) :option_ts=="Supertrend"?nz(supertrend,high[1]):na var store = float(na) var store2=float(na) // strategy start if buy_cond and longOK and time_cond and strategy.position_size==0 strategy.entry("enter long",direction = strategy.long,qty =qty_new) store:=globl if sell_cond and shortOK and time_cond and strategy.position_size==0 strategy.entry("enter short",direction =strategy.short,qty =qty_new) store2:=globl2 //stop loss and take profit enable_trail=input.bool(false,"Enable Trail",group =group_text7) stopPer = input.float(1.0,step=0.10,title='Stop Loss %',group=group_text7)* 0.01 takePer = input.float(2.0,step=0.10, title='Take Profit %',group=group_text7)* 0.01 //TRAILING STOP CODE trailStop = input.float(title='Trailing Stop (%)', minval=0.0, step=0.1, defval=1,group=group_text7) * 0.01 longStopPrice = 0.0 shortStopPrice = 0.0 longStopPrice := if strategy.position_size > 0 stopValue = close * (1 - trailStop) math.max(stopValue, longStopPrice[1]) else 0 shortStopPrice := if strategy.position_size < 0 stopValue = close * (1 + trailStop) math.min(stopValue, shortStopPrice[1]) else 999999 // Determine where you've entered and in what direction longStop = 0.0 shortStop =0.0 shortTake =0.0 longTake = 0.0 if (option_ts=="Percentage" ) // Determine where you've entered and in what direction longStop := strategy.position_avg_price * (1 - stopPer) shortStop := strategy.position_avg_price * (1 + stopPer) shortTake := strategy.position_avg_price * (1 - takePer) longTake := strategy.position_avg_price * (1 + takePer) if enable_trail and (option_ts=="Percentage" ) longStop := longStopPrice shortStop := shortStopPrice //single take profit exit position if strategy.position_size > 0 and option_ts=="Percentage" strategy.exit(id='Close Long',from_entry = "enter long", stop=longStop, limit=longTake) if strategy.position_size < 0 and option_ts=="Percentage" strategy.exit(id='Close Short',from_entry = "enter short", stop=shortStop, limit=shortTake) //PLOT FIXED SLTP LINE plot(strategy.position_size > 0 and option_ts=="Percentage" ? longStop : na, style=plot.style_linebr, color=enable_trail?na:color.new(#c0ff52, 0), linewidth=1, title='Long Fixed SL') plot(strategy.position_size < 0 and option_ts=="Percentage"? shortStop : na, style=plot.style_linebr, color=enable_trail?na:color.new(#5269ff, 0), linewidth=1, title='Short Fixed SL') plot(strategy.position_size > 0 and option_ts=="Percentage"? longTake : na, style=plot.style_linebr, color=color.new(#5e6192, 0), linewidth=1, title='Long Take Profit') plot(strategy.position_size < 0 and option_ts=="Percentage"? shortTake : na, style=plot.style_linebr, color=color.new(#dcb53d, 0), linewidth=1, title='Short Take Profit') //PLOT TSL LINES plot(series=strategy.position_size > 0 and option_ts=="Percentage" and enable_trail ? longStopPrice : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title='Long Trail Stop', offset=1) plot(series=strategy.position_size < 0 and option_ts=="Percentage" and enable_trail ? shortStopPrice : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title='Short Trail Stop', offset=1) // swing high and low //take profit takeProfit_buy = strategy.position_avg_price - ((store - strategy.position_avg_price) * tpnewf) takeProfit_sell = strategy.position_avg_price - ((store2 - strategy.position_avg_price) * tpnewf) // Submit stops based on highest high and lowest low if strategy.position_size >= 0 and (option_ts=="Swinghl" or option_ts=="Supertrend") strategy.exit(id='XL HH',from_entry = "enter long", stop=store,limit=takeProfit_buy,comment ="Long Exit") if strategy.position_size <= 0 and (option_ts=="Swinghl" or option_ts=="Supertrend") strategy.exit(id='XS LL',from_entry = "enter short", stop=store2,limit=takeProfit_sell,comment = "Short Exit") // plot take profit plot(series=strategy.position_size < 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? takeProfit_sell : na, style=plot.style_circles, color=color.orange, linewidth=1, title="take profit sell") plot(series=strategy.position_size > 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? takeProfit_buy: na, style=plot.style_circles, color=color.blue, linewidth=1, title="take profit buy") // Plot stop Loss for visual confirmation plot(series=strategy.position_size > 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? store : na, style=plot.style_circles, color=color.new(color.green, 0), linewidth=1, title='Lowest Low Stop') plot(series=strategy.position_size < 0 and (option_ts=="Swinghl" or option_ts=="Supertrend")? store2 : na, style=plot.style_circles, color=color.new(color.red, 0), linewidth=1, title='Highest High Stop') // atr enable_atrtrail=input.bool(false,"Enable Atr Trail",group = group_text9) atrLength = input(title='ATR Length', defval=14,group =group_text9) slATRMult = input.float(title='Stop loss ATR multiplier',step=0.1, defval=2.0,group =group_text9) tpATRMult = input.float(title='Take profit multiplier',step=0.1, defval=1.5,group =group_text9) lookback = input.int(title='How Far To Look Back For High/Lows', defval=7, minval=1,group =group_text9) atr = ta.atr(atrLength) lowestLow = ta.lowest(low, lookback) highestHigh = ta.highest(high, lookback) longStopa = (enable_atrtrail ? lowestLow : close) - atr * slATRMult shortStopa = (enable_atrtrail ? highestHigh : close) + atr * slATRMult atr_l=0.0 atr_s=0.0 atr_l:=nz(strategy.position_avg_price-(atr[1] * slATRMult),strategy.position_avg_price-(1 * slATRMult)) atr_s:=nz(strategy.position_avg_price+ (atr[1] * slATRMult),strategy.position_avg_price-(1 * slATRMult)) stoploss_l = ta.valuewhen(strategy.position_size != 0 and strategy.position_size[1] == 0,atr_l, 0) stoploss_s = ta.valuewhen(strategy.position_size != 0 and strategy.position_size[1] == 0,atr_s, 0) takeprofit_l = strategy.position_avg_price - ((stoploss_l - strategy.position_avg_price) * tpATRMult) takeprofit_s = strategy.position_avg_price - ((stoploss_s - strategy.position_avg_price) * tpATRMult) // Submit stops based on highest high and lowest low if strategy.position_size > 0 and (option_ts=="Atr") strategy.exit(id='Xl', stop= enable_atrtrail?longStopa:stoploss_l,limit=takeprofit_l ,comment ="Long Exit") if strategy.position_size < 0 and (option_ts=="Atr") strategy.exit(id='XH', stop=enable_atrtrail?shortStopa:stoploss_s,limit=takeprofit_s,comment = "Short Exit") // // plot take profit plot(series=strategy.position_size > 0 and (option_ts=="Atr")? takeprofit_l : na, style=plot.style_circles, color=color.orange, linewidth=1, title="take profit sell") plot(series=strategy.position_size < 0 and (option_ts=="Atr")? takeprofit_s: na, style=plot.style_circles, color=color.blue, linewidth=1, title="take profit buy") // Plot stop Loss for visual confirmation plot(series=strategy.position_size >0 and (option_ts=="Atr") and not enable_atrtrail? stoploss_l : na, style=plot.style_circles, color=color.new(color.green, 0), linewidth=1, title='Lowest Low Stop') plot(series=strategy.position_size < 0 and (option_ts=="Atr") and not enable_atrtrail? stoploss_s : na, style=plot.style_circles, color=color.new(color.red, 0), linewidth=1, title='Highest High Stop') //PLOT TSL LINES plot(series=strategy.position_size >0 and option_ts=="Atr" and enable_atrtrail ? longStopa : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title='Long Trail Stop', offset=1) plot(series=strategy.position_size < 0 and (option_ts=="Atr") and enable_atrtrail? shortStopa : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='short Trail Stop', offset=1)