Chiến lược này được thiết kế dựa trên các chỉ số kỹ thuật của đường trung bình động và khối lượng giao dịch cho một chiến lược định lượng theo xu hướng dài hạn. Khi giá đóng đứng trên đường trung bình động 20 ngày và khối lượng mua của ngày lớn hơn khối lượng bán và khối lượng giao dịch trung bình trong n ngày qua, thị trường được coi là ở trạng thái tăng và đã đến lúc mua. Khi giá đóng phá vỡ dưới đường sắt dưới và khối lượng bán của ngày lớn hơn khối lượng mua và khối lượng giao dịch trung bình trong n ngày qua, thị trường được coi là ở trạng thái giảm và đã đến lúc bán.
Chiến lược chủ yếu dựa trên hai chỉ số đánh giá:
Đường trung bình động kép: Tính toán đường 20 ngày và đường 60 ngày. Khi đường 20 ngày vượt qua đường 60 ngày, thị trường được coi là xu hướng tăng. Khi đường 20 ngày vượt qua đường 60 ngày, thị trường được coi là xu hướng giảm.
Khối lượng giao dịch: Tính toán khối lượng mua hàng ngày và khối lượng bán hàng. Nếu khối lượng mua lớn hơn khối lượng bán và lớn hơn khối lượng giao dịch trung bình trong n ngày qua, nó được xác định là thị trường tăng. Nếu khối lượng bán lớn hơn khối lượng mua và lớn hơn khối lượng giao dịch trung bình trong n ngày qua, nó được xác định là thị trường giảm.
Chiến lược và logic giao dịch cụ thể là như sau:
Đi dài: Khi giá đóng đứng trên đường trung bình động 20 ngày và khối lượng mua của ngày lớn hơn khối lượng bán và khối lượng giao dịch trung bình trong n ngày qua, thị trường được coi là tăng.
Đi ngắn: Khi giá đóng vỡ dưới đường ray dưới và khối lượng bán hàng trong ngày lớn hơn khối lượng mua và khối lượng giao dịch trung bình trong n ngày qua, thị trường được coi là giảm.
Lấy lợi nhuận và dừng lỗ: Đặt mức lấy lợi nhuận và dừng lỗ hợp lý để khóa lợi nhuận hoặc giảm lỗ. Ví dụ, khi giá tăng 5% so với giá nhập cảnh, lấy lợi nhuận; khi lỗ đạt 10%, dừng lỗ; hoặc khi giá đạt mức cao mới gần đây và sau đó rút lui ở một mức độ nào đó, lấy lợi nhuận.
Chiến lược có những lợi thế sau:
Kết hợp hai đường trung bình động và chỉ số khối lượng giao dịch tránh các điểm mù của phán đoán chỉ số kỹ thuật duy nhất.
Sử dụng Bollinger Bands với các tham số khác nhau xác định giá nhập khẩu chính xác hơn.
Chiến lược lấy lợi nhuận và dừng lỗ là hợp lý, giúp khóa lợi nhuận và kiểm soát rủi ro.
Kết quả backtesting tốt với lợi nhuận ổn định, có thể thực sự được áp dụng cho giao dịch định lượng.
Chiến lược này cũng có một số rủi ro:
Các chiến lược trung bình động kép có xu hướng tạo ra các tín hiệu sai và cần được lọc bằng các chỉ số khối lượng.
Các thiết lập tham số Bollinger Bands không chính xác có thể dẫn đến các mục nhập quá thường xuyên hoặc thưa thớt.
Các điểm lấy lợi nhuận cố định và dừng lỗ không đúng có thể ảnh hưởng đến lợi nhuận chiến lược.
Một lượng lớn dữ liệu lịch sử được yêu cầu để kiểm tra lại, và tổn thất bất ngờ vẫn có thể xảy ra trong giao dịch trực tiếp.
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ố của hệ thống trung bình động để tìm ra sự kết hợp trung bình động tối ưu.
Tối ưu hóa các thông số Bollinger Bands để nhập chính xác hơn.
Điều chỉnh năng động các điểm lấy lợi nhuận và dừng lỗ theo điều kiện thị trường để thiết lập tỷ lệ rủi ro-lợi nhuận hợp lý.
Tăng đánh giá các chỉ số kỹ thuật khác như MACD, KD, vv để cải thiện độ chính xác chiến lược.
Sử dụng các phương pháp học máy để tự động tìm các thông số tối ưu để làm cho các chiến lược mạnh mẽ hơn.
Nhìn chung, đây là một chiến lược giao dịch định lượng rất thực tế với hiệu suất backtesting tốt. Nó dễ thực hiện, với rủi ro có thể kiểm soát được, và là một chiến lược ổn định phù hợp với giao dịch trực tiếp, đáng để học cho các nhà giao dịch định lượng. Tất nhiên, vẫn còn rất nhiều chỗ để tối ưu hóa chiến lược, và tôi mong đợi nhiều chuyên gia giao dịch định lượng cải thiện nó.
/*backtest start: 2023-12-21 00:00:00 end: 2023-12-28 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/ // © KAIST291 //@version=4 strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true) // SETTING // length1=input(1) length3=input(3) length7=input(7) length14=input(14) length20=input(20) length60=input(60) length120=input(120) ma1= sma(close,length1) ma3= sma(close,length3) ma7= sma(close,length7) ma14=sma(close,length14) ma20=sma(close,length20) ma60=sma(close,length60) ma120=sma(close,length120) rsi=rsi(close,14) // BUYING VOLUME AND SELLING VOLUME // BV = iff( (high==low), 0, volume*(close-low)/(high-low)) SV = iff( (high==low), 0, volume*(high-close)/(high-low)) vol = iff(volume > 0, volume, 1) dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100) weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100) //----------------------------------------------------------- Davgvol = sma(volume, dailyLength) Wavgvol = sma(volume, weeklyLength) //----------------------------------------------------------- length = input(20, minval=1) src = input(close, title="Source") mult = input(2.0, minval=0.001, maxval=50, title="StdDev") mult2= input(1.5, minval=0.001, maxval=50, title="exp") mult3= input(1.0, minval=0.001, maxval=50, title="exp1") basis = sma(src, length) dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev dev2= mult2 * stdev(src, length) Supper= basis + dev2 Slower= basis - dev2 dev3= mult3 * stdev(src, length) upper1= basis + dev3 lower1= basis - dev3 offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500) plot(basis, "Basis", color=#FF6D00, offset = offset) p1 = plot(upper, "Upper", color=#2962FF, offset = offset) p2 = plot(lower, "Lower", color=#2962FF, offset = offset) fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95)) //---------------------------------------------------- exit=(close-strategy.position_avg_price / strategy.position_avg_price*100) bull=(close>Supper and BV>SV and BV>Davgvol) bull2=(close>ma20 and BV>SV and BV>Davgvol) bux =(close<Supper and close>Slower and volume<Wavgvol) bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol) hi=highest(exit,10) imInATrade = strategy.position_size != 0 highestPriceAfterEntry = valuewhen(imInATrade, high, 0) // STRATEGY LONG // if (bull and close>ma3 and ma20>ma60 and rsi<70) strategy.entry("Long",strategy.long,0.1) if (strategy.position_avg_price*1.05<close) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (strategy.openprofit < strategy.position_avg_price*0.9-close) strategy.close("Long",0.1) ////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////