Xin chào mọi người, tôi là một lập trình viên Python nặng mang học máy đến TradingView. Chiến lược Bitcoin Long 15 phút này được tạo ra bằng cách sử dụng thư viện học máy và 1 năm dữ liệu lịch sử trong Python. Mỗi tham số được tối ưu hóa để mang đến cho bạn các tín hiệu mua và bán Bitcoin có lợi nhuận cao nhất trên biểu đồ 15 phút. Dữ liệu Bitcoin lịch sử được thu thập từ Binance API, trong trường hợp bạn muốn biết sàn giao dịch tốt nhất để sử dụng chiến lược dài này. Đây là một chiến lược Bollinger Band và RSI đơn giản với hai phiên bản được bao gồm trong cài đặt tradingview. Phiên bản đầu tiên có tỷ lệ Sharpe là 7.5 đáng kinh ngạc, và phiên bản thứ hai bao gồm các vị trí dừng lỗ tốt nhất và lấy lợi nhuận với tỷ lệ Sharpe là 2.5. Hãy để tôi nói thêm một chút về cách hoạt động của chiến lược Trading.
P.S. Bạn luôn có thể tạo kim tự tháp cho chiến lược này để đạt được nhiều lợi nhuận hơn! Tôi chỉ không thêm kim tự tháp khi tạo chiến lược của mình bởi vì tôi muốn cho bạn thấy tỷ lệ chiến thắng/mất thực sự dựa trên mua một lần và bán một lần. Tôi cảm thấy như khi tạo một chiến lược bao gồm kim tự tháp ngay lập tức giả mạo tỷ lệ thắng. Đây là cách của tôi để minh bạch với tất cả các bạn.
backtest
/*backtest start: 2022-04-24 00:00:00 end: 2022-05-23 23:59: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/ // © Bunghole //@version=4 strategy(overlay=true, shorttitle="Flawless Victory Strategy", default_qty_type = strategy.percent_of_equity, initial_capital = 100000, default_qty_value = 100, pyramiding = 0, title="Flawless Victory Strategy", currency = 'USD') ////////// ** Inputs ** ////////// // Stoploss and Profits Inputs v1 = input(true, title="Version 1 - Doesn't Use SL/TP") v2 = input(false, title="Version 2 - Uses SL/TP") v3 = input(false, title="Version 3 - Uses SL/TP") v2stoploss_input = input(6.604, title='Stop Loss %', type=input.float, minval=0.01)/100 v2takeprofit_input = input(2.328, title='Take Profit %', type=input.float, minval=0.01)/100 v2stoploss_level = strategy.position_avg_price * (1 - v2stoploss_input) v2takeprofit_level = strategy.position_avg_price * (1 + v2takeprofit_input) v3stoploss_input = input(8.882, title='Stop Loss %', type=input.float, minval=0.01)/100 v3takeprofit_input = input(2.317, title='Take Profit %', type=input.float, minval=0.01)/100 v3stoploss_level = strategy.position_avg_price * (1 - v3stoploss_input) v3takeprofit_level = strategy.position_avg_price * (1 + v3takeprofit_input) plot(v2 and v2stoploss_input and v2stoploss_level ? v2stoploss_level: na, color=color.red, style=plot.style_linebr, linewidth=2, title="v2 Stoploss") plot(v2 and v2takeprofit_input ? v2takeprofit_level: na, color=color.green, style=plot.style_linebr, linewidth=2, title="v2 Profit") plot(v3 and v3stoploss_input and v3stoploss_level ? v3stoploss_level: na, color=color.red, style=plot.style_linebr, linewidth=2, title="v3 Stoploss") plot(v3 and v3takeprofit_input ? v3takeprofit_level: na, color=color.green, style=plot.style_linebr, linewidth=2, title="v3 Profit") ////////// ** Indicators ** ////////// // RSI len = 14 src = close up = rma(max(change(src), 0), len) down = rma(-min(change(src), 0), len) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - 100 / (1 + up / down) // MFI MFIlength = 14 MFIsrc = hlc3 MFIupper = sum(volume * (change(MFIsrc) <= 0 ? 0 : MFIsrc), MFIlength) MFIlower = sum(volume * (change(MFIsrc) >= 0 ? 0 : MFIsrc), MFIlength) _rsi(MFIupper, MFIlower) => if MFIlower == 0 100 if MFIupper == 0 0 100.0 - (100.0 / (1.0 + MFIupper / MFIlower)) mfi = _rsi(MFIupper, MFIlower) // v1 Bollinger Bands length1 = 20 src1 = close mult1 = 1.0 basis1 = sma(src1, length1) dev1 = mult1 * stdev(src1, length1) upper1 = basis1 + dev1 lower1 = basis1 - dev1 // v2 Bollinger Bands length2 = 17 src2 = close mult2 = 1.0 basis2 = sma(src2, length2) dev2 = mult2 * stdev(src2, length2) upper2 = basis2 + dev2 lower2 = basis2 - dev2 ////////// ** Triggers and Guards ** ////////// // v1 Strategy Parameters RSILowerLevel1 = 42 RSIUpperLevel1 = 70 BBBuyTrigger1 = src1 < lower1 BBSellTrigger1 = src1 > upper1 rsiBuyGuard1 = rsi > RSILowerLevel1 rsiSellGuard1 = rsi > RSIUpperLevel1 // v2 Strategy Parameters RSILowerLevel2 = 42 RSIUpperLevel2 = 76 BBBuyTrigger2 = src2 < lower2 BBSellTrigger2 = src2 > upper2 rsiBuyGuard2 = rsi > RSILowerLevel2 rsiSellGuard2 = rsi > RSIUpperLevel2 // v3 Strategy Parameters MFILowerLevel3 = 60 RSIUpperLevel3 = 65 MFIUpperLevel3 = 64 BBBuyTrigger3 = src1 < lower1 BBSellTrigger3 = src1 > upper1 mfiBuyGuard3 = mfi < MFILowerLevel3 rsiSellGuard3 = rsi > RSIUpperLevel3 mfiSellGuard3 = mfi > MFIUpperLevel3 //////////** Strategy Signals ** ////////// // v1 Signals Buy_1 = BBBuyTrigger1 and rsiBuyGuard1 Sell_1 = BBSellTrigger1 and rsiSellGuard1 if v1 == true strategy.entry("Long", strategy.long, when = Buy_1, alert_message = "v1 - Buy Signal!") strategy.entry("Sell", when = Sell_1, alert_message = "v1 - Sell Signal!") // v2 Signals Buy_2 = BBBuyTrigger2 and rsiBuyGuard2 Sell_2 = BBSellTrigger2 and rsiSellGuard2 if v2 == true strategy.entry("Long", strategy.long, when = Buy_2, alert_message = "v2 - Buy Signal!") strategy.entry("Sell", when = Sell_2, alert_message = "v2 - Sell Signal!") strategy.exit("Stoploss/TP", "Long", stop = v2stoploss_level, limit = v2takeprofit_level) // v3 Signals Buy_3 = BBBuyTrigger3 and mfiBuyGuard3 Sell_3 = BBSellTrigger3 and rsiSellGuard3 and mfiSellGuard3 if v3 == true strategy.entry("Long", strategy.long, when = Buy_3, alert_message = "v2 - Buy Signal!") strategy.entry("Sell", when = Sell_3, alert_message = "v2 - Sell Signal!") strategy.exit("Stoploss/TP", "Long", stop = v3stoploss_level, limit = v3takeprofit_level)