Ý tưởng chính của chiến lược này là đánh giá và theo dõi xu hướng giá bằng cách kết hợp chỉ số tỷ lệ phần trăm và tối ưu hóa tham số.
Chiến lược này sử dụng chỉ số %rank để xác định xu hướng giá. %rank đại diện cho sức mạnh tương đối của giá hiện tại trong khoảng thời gian xem.
Phạm vi giá trị phần trăm xếp hạng là từ 0 đến 100. Khi giá trị phần trăm xếp hạng gần 0, điều đó có nghĩa là giá hiện tại gần với giá thấp nhất trong khoảng thời gian xem và ở trong một khu vực bị đánh giá thấp. Khi gần 100, điều đó có nghĩa là giá hiện tại gần với giá cao nhất trong khoảng thời gian xem và ở trong một khu vực được đánh giá quá cao.
Chiến lược cũng giới thiệu một tham số thang đo như một sự dịch chuyển để di chuyển phạm vi từ 0 đến 100 đến phạm vi thang đo 100+. Hai đường tín hiệu level_1 và level_2 cũng được thiết lập, trong đó level_1 chỉ ra mức dài và level_2 chỉ ra mức ngắn.
Khi chỉ số tỷ lệ phần trăm giá vượt qua level_1 lên, một tín hiệu dài được tạo ra. Khi nó vượt qua level_2 xuống, một tín hiệu ngắn được tạo ra. Các điều kiện thoát là đối diện với các tín hiệu nhập cảnh.
Để giải quyết các rủi ro trên, các tham số như len, quy mô, mức có thể được điều chỉnh để tối ưu hóa.
Có chỗ cho việc tối ưu hóa thêm chiến lược:
Ý tưởng tổng thể của chiến lược là rõ ràng, áp dụng các phương pháp định lượng tối ưu hóa tham số để đánh giá và theo dõi xu hướng giá. Nó có một số giá trị thực tế nhưng vẫn cần thử nghiệm và tối ưu hóa thêm để giảm rủi ro và cải thiện lợi nhuận ổn định.
/*backtest start: 2023-12-02 00:00:00 end: 2024-01-01 00:00:00 period: 4h 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/ // © Alex_Dyuk //@version=4 strategy(title="percentrank", shorttitle="percentrank") src = input(close, title="Source") len = input(title="lookback - Период сравнения", type=input.integer, defval=10, minval=2) scale = input(title="scale offset - смещение шкалы", type=input.integer, defval=50, minval=0, maxval=100) level_1 = input(title="sygnal line 1", type=input.integer, defval=30) level_2 = input(title="sygnal line 2", type=input.integer, defval=-30) prank = percentrank(src,len)-scale plot(prank, style = plot.style_columns) plot(level_2, style = plot.style_line, color = color.red) plot(level_1, style = plot.style_line, color = color.green) longCondition = (crossunder(level_1, prank) == true) if (longCondition) strategy.entry("Long", strategy.long) longExitCondition = (crossover(level_2, prank) == true) if (longExitCondition) strategy.close("Long") shortCondition = (crossover(level_2, prank) == true) if (shortCondition) strategy.entry("Short", strategy.short) shortexitCondition = (crossunder(level_1, prank) == true) if (shortexitCondition) strategy.close("Short")