Chiến lược theo dõi xu hướng giá đà sử dụng nhiều chỉ số đà để xác định xu hướng giá, thiết lập các vị trí vào đầu xu hướng và khóa lợi nhuận thông qua cài đặt dừng lợi nhuận và dừng lỗ để theo dõi xu hướng giá.
Chiến lược theo dõi xu hướng giá động lực chủ yếu áp dụng các chỉ số kỹ thuật sau:
Chỉ số ROC: Chỉ số này tính toán tỷ lệ thay đổi tỷ lệ phần trăm giá trong một khoảng thời gian nhất định để xác định đà tăng giá. Khi ROC là dương tính, nó có nghĩa là giá đang tăng. Khi ROC là âm tính, nó có nghĩa là giá đang giảm. Chiến lược sử dụng chỉ số ROC để xác định hướng xu hướng giá.
Chỉ số sức mạnh của bò và gấu: Chỉ số này phản ánh sự so sánh sức mạnh giữa bò và gấu. Sức mạnh của bò > 0 cho thấy sức mạnh của bò lớn hơn sức mạnh của gấu và giá tăng. Chiến lược sử dụng chỉ số này để dự đoán hướng giá bằng cách so sánh sức mạnh của bò và gấu.
Sự khác biệt: Chỉ số này xác định sự đảo ngược xu hướng bằng cách tính toán sự khác biệt về giá và khối lượng.
Kênh Donchian: Chỉ số này xây dựng một kênh sử dụng giá cao nhất và thấp nhất, và ranh giới kênh có thể phục vụ như hỗ trợ và kháng cự.
Đường trung bình động: Chỉ số này làm mịn các biến động giá để xác định hướng xu hướng tổng thể. Chiến lược sử dụng nó để xác định xu hướng giá chung.
Chiến lược xác định xu hướng giá và điểm đảo ngược dựa trên các chỉ số trên, và thiết lập các vị trí dài hoặc ngắn theo tín hiệu chỉ số vào đầu xu hướng. sau đó đóng các vị trí kịp thời dựa trên điểm dừng lợi nhuận và dừng lỗ để nắm bắt xu hướng giá.
Những lợi thế của chiến lược này bao gồm:
Sử dụng nhiều chỉ số để xác định xu hướng làm giảm khả năng đánh giá sai.
Sử dụng các chênh lệch chỉ số cho phép nắm bắt chính xác các điểm đảo ngược xu hướng.
Kết hợp các kênh và đường trung bình động giúp xác định xu hướng tổng thể.
Thiết lập dừng lợi nhuận và dừng lỗ đảm bảo lợi nhuận kịp thời và tránh rút tiền mở rộng.
Các tham số có thể điều chỉnh làm cho chiến lược thích nghi với các giai đoạn và sản phẩm khác nhau.
Logic rõ ràng tạo điều kiện tối ưu hóa hơn nữa.
Những rủi ro tiềm ẩn của chiến lược này bao gồm:
Nhiều chỉ số có thể làm tăng xác suất tín hiệu sai.
Các điểm dừng lỗ được đặt quá nhỏ có thể làm tăng xác suất dừng lỗ, trong khi quá rộng có thể mở rộng mức rút.
Ứng dụng mù trong các giai đoạn thị trường khác nhau có thể dẫn đến sự không thích nghi.
Tài chính đủ để hỗ trợ các đơn vị có vị trí cao là cần thiết để đạt được lợi nhuận dư thừa.
Rủi ro quá phù hợp với backtest tồn tại. hiệu suất giao dịch thực có sự không chắc chắn.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Tối ưu hóa các thông số chỉ số để tìm kết hợp tối ưu cho các giai đoạn và sản phẩm khác nhau.
Đưa ra các thuật toán máy học để tự động tìm các thông số tối ưu.
Xây dựng các cơ chế dừng lỗ thích nghi dựa trên điều kiện thị trường.
Kết hợp các yếu tố tần số cao và các yếu tố cơ bản để cải thiện alpha.
Phát triển các khung thử nghiệm tự động để tối ưu hóa tham số và xác minh hiệu suất.
Đưa ra các mô-đun quản lý rủi ro để kiểm soát kích thước vị trí và giảm rút vốn.
Thêm mô phỏng và giao dịch trực tiếp và thử nghiệm để cải thiện sự ổn định.
Chiến lược này kết hợp nhiều chỉ số động lực để xác định xu hướng giá và sử dụng stop profit/loss để khóa lợi nhuận. Nó có thể nắm bắt hiệu quả xu hướng với sự ổn định mạnh mẽ. Các cải tiến hơn nữa trong điều chỉnh tham số, tối ưu hóa cấu trúc và kiểm soát rủi ro sẽ cải thiện hiệu suất và quản lý rủi ro của nó. Chiến lược cung cấp một giải pháp theo xu hướng đáng tin cậy và dễ sử dụng cho giao dịch định lượng.
/*backtest start: 2023-11-05 00:00:00 end: 2023-11-09 00:00:00 period: 1m basePeriod: 1m 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/ // © mbagheri746 //@version=4 strategy("Bagheri IG Ether v2", overlay=true, margin_long=100, margin_short=100) TP = input(3000, minval = 1 , title ="Take Profit") SL = input(2200, minval = 1 , title ="Stop Loss") //_________________ RoC Definition _________________ rocLength = input(title="ROC Length", type=input.integer, minval=1, defval=186) smoothingLength = input(title="Smoothing Length", type=input.integer, minval=1, defval=50) src = input(title="Source", type=input.source, defval=close) ma = ema(src, smoothingLength) mom = change(ma, rocLength) sroc = nz(ma[rocLength]) == 0 ? 100 : mom == 0 ? 0 : 100 * mom / ma[rocLength] //srocColor = sroc >= 0 ? #0ebb23 : color.red //plot(sroc, title="SROC", linewidth=2, color=srocColor, transp=0) //hline(0, title="Zero Level", linestyle=hline.style_dotted, color=#989898) //_________________ Donchian Channel _________________ length1 = input(53, minval=1, title="Upper Channel") length2 = input(53, minval=1, title="Lower Channel") offset_bar = input(91,minval=0, title ="Offset Bars") upper = highest(length1) lower = lowest(length2) basis = avg(upper, lower) DC_UP_Band = upper[offset_bar] DC_LW_Band = lower[offset_bar] l = plot(DC_LW_Band, style=plot.style_line, linewidth=1, color=color.red) u = plot(DC_UP_Band, style=plot.style_line, linewidth=1, color=color.aqua) fill(l,u,color = color.new(color.aqua,transp = 90)) //_________________ Bears Power _________________ wmaBP_period = input(65,minval=1,title="BearsP WMA Period") line_wma = ema(close, wmaBP_period) BP = low - line_wma //_________________ Balance of Power _________________ ES_BoP=input(15, title="BoP Exponential Smoothing") BOP=(close - open) / (high - low) SBOP = rma(BOP, ES_BoP) //_________________ Alligator _________________ //_________________ CCI _________________ //_________________ Moving Average _________________ sma_period = input(74, minval = 1 , title = "SMA Period") sma_shift = input(37, minval = 1 , title = "SMA Shift") sma_primary = sma(close,sma_period) SMA_sh = sma_primary[sma_shift] plot(SMA_sh, style=plot.style_line, linewidth=2, color=color.yellow) //_________________ Long Entry Conditions _________________// MA_Lcnd = SMA_sh > low and SMA_sh < high ROC_Lcnd = sroc < 0 DC_Lcnd = open < DC_LW_Band BP_Lcnd = BP[1] < BP[0] and BP[1] < BP[2] BOP_Lcnd = SBOP[1] < SBOP[0] //_________________ Short Entry Conditions _________________// MA_Scnd = SMA_sh > low and SMA_sh < high ROC_Scnd = sroc > 0 DC_Scnd = open > DC_UP_Band BP_Scnd = BP[1] > BP[0] and BP[1] > BP[2] BOP_Scnd = SBOP[1] > SBOP[0] //_________________ OPEN POSITION __________________// if strategy.position_size == 0 strategy.entry(id = "BUY", long = true , when = MA_Lcnd and ROC_Lcnd and DC_Lcnd and BP_Lcnd and BOP_Lcnd) strategy.entry(id = "SELL", long = false , when = MA_Scnd and ROC_Scnd and DC_Scnd and BP_Scnd and BOP_Scnd) //_________________ CLOSE POSITION __________________// strategy.exit(id = "CLOSE BUY", from_entry = "BUY", profit = TP , loss = SL) strategy.exit(id = "CLOSE SELL", from_entry = "SELL" , profit = TP , loss = SL) //_________________ TP and SL Plot __________________// currentPL= strategy.openprofit pos_price = strategy.position_avg_price open_pos = strategy.position_size TP_line = (strategy.position_size > 0) ? (pos_price + TP/100) : strategy.position_size < 0 ? (pos_price - TP/100) : 0.0 SL_line = (strategy.position_size > 0) ? (pos_price - SL/100) : strategy.position_size < 0 ? (pos_price + SL/100) : 0.0 // hline(TP_line, title = "Take Profit", color = color.green , linestyle = hline.style_dotted, editable = false) // hline(SL_line, title = "Stop Loss", color = color.red , linestyle = hline.style_dotted, editable = false) Tline = plot(TP_line != 0.0 ? TP_line : na , title="Take Profit", color=color.green, trackprice = true, show_last = 1) Sline = plot(SL_line != 0.0 ? SL_line : na, title="Stop Loss", color=color.red, trackprice = true, show_last = 1) Pline = plot(pos_price != 0.0 ? pos_price : na, title="Stop Loss", color=color.gray, trackprice = true, show_last = 1) fill(Tline , Pline, color = color.new(color.green,transp = 90)) fill(Sline , Pline, color = color.new(color.red,transp = 90)) //_________________ Alert __________________// //alertcondition(condition = , title = "Position Alerts", message = "Bagheri IG Ether\n Symbol: {{ticker}}\n Type: {{strategy.order.id}}") //_________________ Label __________________// inMyPrice = input(title="My Price", type=input.float, defval=0) inLabelStyle = input(title="Label Style", options=["Upper Right", "Lower Right"], defval="Lower Right") posColor = color.new(color.green, 25) negColor = color.new(color.red, 25) dftColor = color.new(color.aqua, 25) posPnL = (strategy.position_size != 0) ? (close * 100 / strategy.position_avg_price - 100) : 0.0 posDir = (strategy.position_size > 0) ? "long" : strategy.position_size < 0 ? "short" : "flat" posCol = (strategy.openprofit > 0) ? posColor : (strategy.openprofit < 0) ? negColor : dftColor myPnL = (inMyPrice != 0) ? (close * 100 / inMyPrice - 100) : 0.0 var label lb = na label.delete(lb) lb := label.new(bar_index, close, color=posCol, style=inLabelStyle=="Lower Right"?label.style_label_upper_left:label.style_label_lower_left, text= "╔═══════╗" +"\n" + "Pos: " +posDir +"\n" + "Pos Price: "+tostring(strategy.position_avg_price) +"\n" + "Pos PnL: " +tostring(posPnL, "0.00") + "%" +"\n" + "Profit: " +tostring(strategy.openprofit, "0.00") + "$" +"\n" + "TP: " +tostring(TP_line, "0.00") +"\n" + "SL: " +tostring(SL_line, "0.00") +"\n" + "╚═══════╝")