Chiến lược này sử dụng thay đổi tỷ lệ phần trăm giá để thiết lập đường nhập và đường dừng lỗ. Nó đi vào các vị trí khi giá vượt qua đường nhập và ra khỏi các vị trí khi giá giảm xuống dưới đường dừng lỗ. Đặc điểm chính của nó là nó chỉ chịu một đơn vị rủi ro, có nghĩa là các vị trí mới sẽ chỉ được thêm vào sau khi vị trí trước đó đạt được mục tiêu lợi nhuận được đặt trước.
Chiến lược đầu tiên thiết lập giá chuẩn và sử dụng 10% giá đó làm phạm vi giá - giới hạn trên là đường nhập và giới hạn dưới là đường dừng lỗ. Khi giá vượt qua đường nhập, số lượng cố định sẽ được mua. Khi giá giảm xuống dưới đường dừng lỗ, các vị trí sẽ được đóng. Sau khi kiếm lợi nhuận, các đường nhập và dừng lỗ sẽ được điều chỉnh theo tỷ lệ phần trăm để mở rộng phạm vi lợi nhuận. Điều này cho phép chiến lược theo dõi xu hướng chạy.
Một điểm quan trọng khác của chiến lược là nó chỉ có một đơn vị rủi ro. nghĩa là, các vị trí mới sẽ chỉ được thêm vào sau khi vị trí hiện tại đạt được mục tiêu lợi nhuận. Các vị trí mới cũng sẽ theo các đường nhập và dừng lỗ mới. Điều này hạn chế rủi ro.
Chiến lược này kết hợp các lợi thế của việc dừng lại và kích thước vị trí, cho phép kiểm soát rủi ro hiệu quả trong khi có lợi nhuận.
Ngoài ra còn có một số rủi ro:
Những rủi ro này có thể được tránh bằng cách điều chỉnh các thông số như kích thước phạm vi, bộ lọc nhập cảnh vv.
Có chỗ cho việc tối ưu hóa thêm:
Đây là một hệ thống dựa trên phạm vi tỷ lệ phần trăm đơn giản và thực tế. Thông qua điều chỉnh tham số và tối ưu hóa mô hình, chiến lược này có thể trở thành một công cụ theo dõi xu hướng đáng tin cậy, tạo ra hiệu suất vượt trội ổn định cho các nhà đầu tư.
/*backtest start: 2022-11-16 00:00:00 end: 2023-11-22 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © HermanBrummer 4 April 2021 strategy ("The Box Percent Strat", shorttitle="The Box", overlay = true) /// Designed for LONG only on Daily, 2D or 3D Charts /// Uses fixed investment risk amount, meaning you're willing to lose that amount per trade /// Limit buy to not overpay RiskPerTrade = input(10000, "Risk losing this much per trade", tooltip="This calculates how much you will lose based on difference between the entry price and stop loss price") TradeAboveMAFilterPer = input(50, "The System won't trade if price is below this MA") UpBoxSize = (input(10, "Box size in %") * 0.01)+1 // 1.1 == 10% up DnBoxSize = 1-(input(10, "Box size in %") * 0.01) // 0.9 == 10% dn var FirstBar = close > 0 ? close : na var FirstTop = FirstBar * UpBoxSize var FirstBot = FirstBar * DnBoxSize var top = sma(FirstTop, 1) var bot = sma(FirstBot, 1) /// The Box Calcs if high[2] > top top := top * UpBoxSize bot := bot * UpBoxSize if low[1] < bot top := top * DnBoxSize bot := bot * DnBoxSize plot(bot, "Bot", #ff0000) // Green plot(top, "Top", #00ff00) // Red mid = ((top-bot)/2)+bot plot(mid, "Mid", color.gray) TradeAboveMAFilter = sma(close, TradeAboveMAFilterPer) plot(TradeAboveMAFilter, "Trade AboveMAF Filter", color.yellow, 3, style=plot.style_circles) // col = high[1] < top and high >= top ? color.white : na // bgcolor(col) /// Shares RiskRange = close * abs(DnBoxSize - 1) // 0.9 - 1 == 1.10 // 10% abs so you don't get a neg number NB NB Shares = RiskPerTrade / RiskRange //plot(close-RiskRange, "RiskRange", color.fuchsia) Enter = high >= top and close[1] > TradeAboveMAFilter and strategy.opentrades[0] == strategy.opentrades[1] and strategy.opentrades[1] == strategy.opentrades[2] and strategy.opentrades[2] == strategy.opentrades[3] and strategy.opentrades[3] == strategy.opentrades[4] and strategy.opentrades[4] == strategy.opentrades[5] and strategy.opentrades[5] == strategy.opentrades[6] // won't enter if new positon was taken in the last 6 bars // need better code for this. /// Buy & Sell // (new highs) and (Close above moving average filter) and (No new trades were taken receently) if Enter //(high >= top) and (close[1] > TradeAboveMAFilter) and strategy.opentrades[0] == strategy.opentrades[1] strategy.order("En", strategy.long, qty=Shares, limit=top)//, stop=top) //barcolor(strategy.position_size != 0 ? #00ff00 : color.gray) // /// If ONE Position THEN this Stop Because: // if strategy.position_size == 1 // strategy.exit("Ex", "En", stop=bot) /// If it has more than one trad OPEN if strategy.position_size > 0 strategy.exit("Ex", "En", stop=bot[2] ) // puts stop on old bot //plot(strategy.position_avg_price, "Avg Price", color.yellow)