Isolated Scroll Container

1. Mô Tả Trend Duration Forecast Strategy

Xác định xu hướng qua độ dốc đường Hull Moving Average (HMA), đo thời lượng thực tế của mỗi xu hướng, lưu lại lịch sử thời lượng theo từng hướng, rồi dùng trung bình lịch sử đó để "dự báo" xu hướng hiện tại có thể kéo dài thêm bao lâu.

1.1 Khái Niệm Chỉ Báo

Chỉ báo này dựa trên một ý tưởng đơn giản: xu hướng có xu hướng lặp lại về mặt thời lượng. Nó dùng độ dốc của đường HMA (Hull Moving Average) để xác định đang trong xu hướng tăng hay giảm (dốc lên liên tục N nến = tăng, dốc xuống liên tục N nến = giảm), đo CHÍNH XÁC bao nhiêu nến mỗi xu hướng đã kéo dài trước khi đảo chiều, rồi LƯU LẠI một số lượng mẫu thời lượng gần nhất - RIÊNG cho từng hướng (tăng/giảm không trộn chung).

Mỗi khi một xu hướng MỚI bắt đầu, chỉ báo lập tức hiện ra một "dự báo" = trung bình cộng của các thời lượng xu hướng CÙNG HƯỚNG đã xảy ra trong quá khứ (VD: xu hướng tăng mới bắt đầu → dự báo = trung bình các lần xu hướng TĂNG trước đó, không tính lần bearish vừa kết thúc). Dự báo này được vẽ trực quan bằng một mũi tên kéo dài về phía trước từ điểm bắt đầu xu hướng tới đúng vị trí "nếu xu hướng này dài bằng trung bình lịch sử thì sẽ kết thúc ở đây".

1.2 Chức Năng Chỉ Báo

  • Đường HMA Tô Màu Theo Xu Hướng: đường trung bình động Hull, đổi màu tăng/giảm theo trend hiện tại - đây là đường tham chiếu chính, mọi tính toán khác dựa vào độ dốc của nó.
  • Nhãn Xu Hướng Sống (Real Length): 1 nhãn nổi cho MỖI hướng (tăng/giảm), luôn hiện số nến THỰC TẾ xu hướng cùng hướng gần nhất (dù đã kết thúc hay đang chạy) đã kéo dài.
  • Mũi Tên + Nhãn "Probable Length": khi xu hướng mới bắt đầu, vẽ 1 mũi tên từ điểm khởi đầu, tự động kéo dài mỗi nến tới đúng vị trí dự báo (điểm bắt đầu + trung bình lịch sử cùng hướng), kèm 1 nhãn số hiện đúng con số trung bình đó, đặt tại trung điểm mũi tên.
  • Bảng Lịch Sử Thời Lượng: bảng góc dưới phải liệt kê từng mẫu thời lượng đã lưu (tăng và giảm, tối đa "Trend Sample Size" mẫu mỗi bên) + 1 dòng trung bình cộng ở cuối - kèm tooltip giải thích khi hover từng ô.
  • Không có Alert: chỉ báo không có bất kỳ alertcondition() nào.

1.3 Cách Dùng Chỉ Báo

  • So sánh "Real Length" hiện tại với "Probable Length" dự báo để ước lượng xu hướng đang ở giai đoạn "còn trẻ" hay "đã già" so với thống kê lịch sử của chính cặp tiền/khung thời gian đó - nếu Real Length đã vượt xa Probable Length, xu hướng đang kéo dài BẤT THƯỜNG so với lịch sử, có thể sắp kết thúc.
  • Dùng bảng lịch sử để đánh giá độ ổn định của thị trường: nếu các mẫu thời lượng dao động rất mạnh (VD 5, 40, 8, 35...), giá trị trung bình dự báo sẽ kém tin cậy hơn so với thị trường có thời lượng xu hướng đồng đều.
  • Chấp nhận dự báo "Probable Length" chỉ mang tính TRUNG BÌNH LỊCH SỬ ĐƠN GIẢN, KHÔNG phải mô hình thống kê có cơ sở khoa học - đây là ngoại suy tuyến tính từ quá khứ, không tính đến biến động/khối lượng/bối cảnh vĩ mô hiện tại.
  • Đừng mong đợi dự báo ngay lần đầu chỉ báo chạy: lần xu hướng ĐẦU TIÊN theo mỗi hướng sẽ hiện "Probable Length" là NaN/rỗng vì chưa có mẫu lịch sử nào để tính trung bình - phải chờ ít nhất 1 chu kỳ hoàn chỉnh mỗi hướng.
  • Tăng "Trend Sample Size" để dự báo phản ánh xu hướng dài hạn của thị trường hơn (ít nhạy với vài mẫu bất thường gần đây); giảm để dự báo bám sát "tính khí" gần đây nhất của thị trường.
  • Điều chỉnh "Trend Detection Sensitivity" để cân bằng giữa phản ứng nhanh (giá trị thấp, dễ đổi hướng theo nhiễu ngắn hạn) và ổn định (giá trị cao, chỉ đổi hướng khi có streak dài, ít giả tín hiệu hơn).

1.4 Cách Hoạt Động Của Chỉ Báo

Đầu vào & vai trò

  • length ("Smoothing Length", Số nguyên, mặc định: 50): độ dài chu kỳ HMA. Tăng → HMA mượt hơn, trễ hơn; giảm → phản ứng nhanh hơn, nhiễu hơn.
  • trendLength ("Trend Detection Sensitivity", Số nguyên, mặc định: 3): số nến liên tiếp cần có để công nhận HMA đang "tăng dần đều" (ta.rising) hoặc "giảm dần đều" (ta.falling) - đây là điều kiện xác định trend, không phải so sánh HMA hiện tại với 1 mức cố định.
  • samples ("Trend Sample Size", Số nguyên, mặc định: 10, tối thiểu 2): số thời lượng xu hướng gần nhất được lưu RIÊNG cho mỗi hướng (tăng và giảm có 2 mảng độc lập, không dùng chung).
  • coloUP/coloDN (mặc định: xanh lá #12E49E / cam #EC5610): màu cho toàn bộ hình vẽ theo hướng tăng/giảm.
💡 Lưu ý - Vòng lặp vẽ bảng có thể lỗi khi 2 mảng lệch kích thước: vòng lặp vẽ Bảng Lịch Sử Thời Lượng dùng for i = 0 to bullishCount.size() - 1 làm giới hạn, nhưng bên trong lại đọc CẢ 2 mảng: bullishCount.get(i) VÀ bearishCount.get(i). Vì bullishCount và bearishCount được đẩy dữ liệu LUÂN PHIÊN (mỗi lần đổi hướng chỉ đẩy vào ĐÚNG 1 trong 2 mảng), kích thước 2 mảng có thể chênh nhau (đặc biệt ngay sau khi vừa gắn chỉ báo, khi một hướng còn chưa có mẫu hoàn chỉnh nào). Nếu bearishCount hiện đang CÓ ÍT phần tử hơn bullishCount, lệnh bearishCount.get(i) với i vượt quá kích thước thật sẽ gây lỗi runtime "array index out of bounds" trong Pine Script - có thể khiến bảng (hoặc toàn bộ chỉ báo) báo lỗi thay vì hiển thị bình thường. Đây là hành vi có sẵn của code gốc, dễ gặp nhất ngay sau khi mới thêm chỉ báo vào biểu đồ (trước khi cả 2 hướng đều đã hoàn thành ít nhất 1 chu kỳ xu hướng). Ngoài ra, dòng trung bình cộng ở cuối bảng cho tăng/giảm cũng có thể rơi vào 2 SỐ HÀNG KHÁC NHAU nếu kích thước 2 mảng không bằng nhau tại thời điểm vẽ, khiến chúng không thẳng hàng trên bảng.

Các Khối Logic Chính

📈 Luồng 1: Xác Định Xu Hướng Qua Độ Dốc HMA (chỉ nến đã đóng)

  • hma = ta.hma(close, length) tính mỗi nến. Chỉ khi barstate.isconfirmed: nếu ta.rising(hma, trendLength) đúng → trend := true; nếu ta.falling(hma, trendLength) đúng → trend := false.
  • Quan trọng: đây là 2 lệnh if RIÊNG BIỆT (không phải if/else) - nếu HMA đang đi ngang (không đủ N nến tăng LIÊN TỤC cũng không đủ N nến giảm LIÊN TỤC), CẢ 2 điều kiện đều sai, và trend GIỮ NGUYÊN giá trị của lần cập nhật gần nhất - nghĩa là trend không phải "hướng nến hiện tại" mà là "hướng của lần streak N nến liên tục gần nhất được xác nhận".

🔢 Luồng 2: Đếm Thời Lượng Xu Hướng Hiện Tại (mọi nến)

  • if trend or not trend: TrendCount += 1 - biểu thức này trông như luôn đúng, nhưng thực ra là một cách kiểm tra trend KHÔNG CÒN LÀ na nữa (vì na or not na = na = sai trong Pine) - tức là bộ đếm chỉ bắt đầu chạy SAU KHI trend đã được xác định lần đầu tiên, không tăng khi vẫn còn ở trạng thái chưa xác định.

🔄 Luồng 3: Phát Hiện Đảo Chiều & Khởi Tạo Dự Báo Mới

  • if trend != trend[1]: xoá đường mũi tên + nhãn dự báo cũ, xoá tooltip "vừa phát hiện xu hướng mới" trên cả 2 nhãn TrendUP/TrendDN.
  • Nếu vừa chuyển SANG tăng (trend = true): đẩy TrendCount (thời lượng của xu hướng GIẢM vừa kết thúc) vào mảng bearishCount; tạo nhãn TrendUP MỚI với dự báo = bullishCount.avg() - LƯU Ý: tại thời điểm này bullishCount CHƯA bị thay đổi gì trong nhánh này, nên đây chính xác là trung bình các lần TĂNG trước đó (không lẫn xu hướng vừa kết thúc); đóng băng text của TrendDN (nhãn của xu hướng giảm vừa kết thúc) thành thời lượng CUỐI CÙNG của nó; tạo mũi tên LengthLine (1 nến, sẽ được kéo dài ở Luồng 4) và nhãn rỗng LabelProbLen (sẽ được điền ở Luồng 4).
  • Nhánh else (chuyển sang giảm) đối xứng hoàn toàn.
  • TrendCount := 0: reset bộ đếm cho xu hướng mới bắt đầu.
  • Lưu ý: nếu đây là lần xu hướng ĐẦU TIÊN của một hướng nào đó (mảng cùng hướng vẫn đang RỖNG), array.avg() trên mảng rỗng trả về na → nhãn "Probable Length" hiện giá trị không xác định cho tới khi có ít nhất 1 mẫu lịch sử của hướng đó.

🖊️ Luồng 4: Cập Nhật Nhãn Sống & Kéo Dài Dự Báo (mọi nến)

  • Với hướng ĐANG DIỄN RA: cập nhật text nhãn tương ứng (TrendUP/TrendDN) thành "Real Length: [TrendCount hiện tại]" - con số này tăng dần mỗi nến khi xu hướng còn tiếp diễn.
  • Kéo dài LengthLine tới x1_gốc + trung_bình_lịch_sử_cùng_hướng + 1 - đây chính là vị trí "nếu xu hướng dài bằng trung bình lịch sử thì sẽ kết thúc ở đây".
  • Di chuyển LabelProbLen tới đúng trung điểm của mũi tên, cập nhật text hiện con số trung bình dự báo.
  • Ví dụ: xu hướng tăng bắt đầu tại bar 500, bullishCount.avg()=22 (trung bình 22 nến từ các lần tăng trước). Tại bar 510 (10 nến sau khi bắt đầu): TrendDN không đổi (đang trong xu hướng tăng), TrendUP hiện "Real Length: 10". LengthLine kéo dài tới bar 500+22+1=523. LabelProbLen đặt tại trung điểm (500+523)/2≈511, hiện "Probable Length: 22".

📦 Luồng 5: Giới Hạn FIFO Cho Mảng Mẫu

  • Nếu bullishCount.size() > samples: xoá phần tử ĐẦU MẢNG (cũ nhất, vì push() luôn thêm vào CUỐI mảng) - đối xứng cho bearishCount. Giữ đúng "Trend Sample Size" mẫu gần nhất mỗi hướng.

🎨 Luồng 6: Vẽ Đường HMA & Bảng Lịch Sử

  • Đường HMA vẽ với độ dày 3, màu theo trend hiện tại.
  • Bảng chỉ vẽ tại barstate.islast: liệt kê từng mẫu đã lưu (cột số thứ tự + cột thời lượng tăng + cột thời lượng giảm), mỗi ô có tooltip riêng khi hover, cộng 1 dòng trung bình ở cuối cho mỗi hướng (xem Lưu Ý về nguy cơ lỗi index ở trên).

Đầu ra & vai trò trong sử dụng

  • Đường HMA màu: tham chiếu trend chính, nền tảng cho mọi phép đo còn lại.
  • Nhãn Real Length: đồng hồ đếm sống cho biết xu hướng hiện tại/vừa kết thúc đã/đã kéo dài bao nhiêu nến.
  • Mũi tên + Probable Length: dự báo trực quan dựa trên trung bình lịch sử cùng hướng - so sánh với Real Length để đánh giá xu hướng còn "trẻ" hay đã "quá hạn" so với thống kê.
  • Bảng lịch sử: dữ liệu thô đầy đủ đứng sau các con số trung bình, giúp đánh giá độ tin cậy của dự báo (mẫu đồng đều hay dao động mạnh).
Zoom/Pan Layered Image
Sơ đồ logic chỉ báo Trend Duration Forecast
− +

Chỉ báo trên vừa hoá thành BOT TRADE — chỉ 1 click AI

📊Chỉ báo gốc
→
🤖AI convert 1-click
→
⚙️Bot tự trade 24/7