Chiến lược này kết hợp theo xu hướng với trailing stop loss và sử dụng logic lợi nhuận để liên tục đi theo xu hướng để kiếm lợi nhuận. Nó sử dụng moving average để xác định hướng xu hướng và tạo ra tín hiệu giao dịch khi giá vượt qua đường MA. Sau khi vào vị trí dài, chiến lược thiết lập stop loss dựa trên giá trị ATR và điều chỉnh nó bằng logic stop loss để theo xu hướng. Khi giá tăng lên một mức độ nhất định, cần lợi nhuận một phần để khóa một số lợi nhuận.
Đặt backtest bắt đầu và dừng thời gian dựa trên nhập người dùng.
Bắt đầu giá dừng dài và ngắn, và tỷ lệ phần trăm.
Nhập dài khi giá phá vỡ trên đường MA.
Tính toán khoảng cách dừng lỗ bằng ATR và đặt giá dừng lỗ.
Khi giá tiếp tục tăng, dừng lỗ lên để khóa thêm lợi nhuận.
Khi giá đạt ngưỡng lợi nhuận, lấy lợi nhuận một phần.
Nhập ngắn khi giá phá vỡ dưới đường MA.
Tính toán khoảng cách dừng lỗ bằng ATR và đặt giá dừng lỗ.
Khi giá tiếp tục giảm, dừng lỗ xuống để khóa thêm lợi nhuận.
Khi giá đạt ngưỡng lợi nhuận, lấy lợi nhuận một phần.
Chế độ dừng lỗ có thể theo xu hướng và thu được nhiều lợi nhuận hơn trong khi bảo vệ lợi nhuận.
Động lực ATR dừng lỗ phản ứng tốt hơn với biến động thị trường so với dừng lỗ cố định.
Lợi nhuận lấy một phần giúp khóa một số lợi nhuận và giảm rủi ro rút vốn.
Logic đơn giản và rõ ràng, dễ hiểu và thực hiện.
Sự đảo ngược xu hướng đột ngột có thể gây ra lỗ lớn với khoảng cách dừng lỗ rộng.
Stop loss dựa trên ATR có thể quá nhạy cảm và bị dừng sớm.
Tỷ lệ lợi nhuận một phần không đúng có thể bỏ lỡ xu hướng hoặc làm tăng lỗ.
Nhiều thông số cần tối ưu hóa, như thời gian ATR, tỷ lệ phần trăm, tỷ lệ lợi nhuận.
Chiến lược chỉ dựa vào MA và ATR, tín hiệu sai có thể xảy ra.
Thêm các chỉ số khác như MACD, KD để lọc các tín hiệu giao dịch và tránh các tín hiệu MA sai.
Hãy xem xét tỷ lệ lợi nhuận động dựa trên sức mạnh xu hướng.
Kiểm tra các khoảng thời gian ATR khác nhau để ổn định tối ưu hoặc sử dụng các chỉ số khác để dừng lỗ.
Giới thiệu máy học để tự động tối ưu hóa các thông số và điều chỉnh chúng một cách năng động.
Sử dụng các mô hình học sâu để phát hiện xu hướng và tạo tín hiệu tự động.
Chiến lược này tích hợp stop loss, dynamic ATR stop loss và partial take profit để theo dõi xu hướng và kiểm soát drawdowns. Nhưng nó có một số hạn chế như phát hiện xu hướng đơn giản và tối ưu hóa tham số khó khăn. Điều này cung cấp hướng dẫn tốt để cải thiện thêm chiến lược bằng cách sử dụng nhiều kỹ thuật và chỉ số hơn để tăng cường sự ổn định và lợi nhuận.
/*backtest start: 2023-09-29 00:00:00 end: 2023-10-29 00:00:00 period: 1h 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/ // © felipefs //@version=4 strategy("Meu Script", overlay=true) plot(ohlc4) //Funçao de Datas testStartYear = input(2018, "Backtest Start Year") testStartMonth = input(6, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(30, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false //Funções de Trailing Stop long_stop_price = 0.0 short_stop_price = 0.0 long_trail_perc = 0 short_trail_perc = 0 long_stop_price := if (strategy.position_size > 0) stopValue = close * (1 - long_trail_perc) max(stopValue, long_stop_price[1]) else 0 short_stop_price := if (strategy.position_size < 0) stopValue = close * (1 + short_trail_perc) min(stopValue, short_stop_price[1]) else 999999 //Função de Debug debug(value) => x = bar_index y = close label.new(x, y, tostring(value)) //Take Profit profit = close * (1 + 0.12) strategy.entry("Long", true) strategy.exit("Take Profit 1 Long", from_entry="Long", limit=profit, qty_percent=50.0) //ATR Stop // xATRTrailingStopLong = 0.0 // xATR = atr(nATRPeriod) // nLossLong = nATRMultipLong * xATR // if (strategy.position_size > 0) // xATRTrailingStopLong := max(nz(xATRTrailingStopLong[1]), close - nLossLong)