OptiNod Academy
Look-ahead và repainting — Kiểm chứng thời điểm có thể biết tín hiệu
Phân biệt nến chưa xác nhận, dữ liệu khung lớn và vẽ lùi; ghi thời điểm biết tín hiệu để kiểm tra thông tin tương lai có bị dùng sớm hay không.
Khi nhìn một mũi tên, hãy ghi cả vị trí nó được vẽ lẫn thời điểm đầu tiên bạn có thể biết nó tồn tại.
Mở lại biểu đồ và thấy mũi tên ở đúng đáy không có nghĩa là ngay lúc đáy hình thành bạn đã có thể giao dịch theo nó. Điều kiện tạm thời giữa nến, pivot được xác nhận sau vài nến và dữ liệu chỉ có khi khung lớn đóng đều có thời điểm thông tin trở nên khả dụng khác nhau.
Repainting là khái niệm rộng về sự khác nhau giữa cách tính hoặc hiển thị trong lịch sử và hành vi realtime. Nó bao gồm cả việc giá trị nến chưa đóng thay đổi bình thường; không phải mọi repainting đều là gian dối hay dùng tương lai. Look-ahead bias là trường hợp quyết định quá khứ dùng thông tin chưa có tại thời điểm quyết định. Phân biệt hai vấn đề này giúp biết phần nào cần sửa và phần nào cần được mô tả rõ như điều kiện sử dụng. Phân loại repainting của TradingView
Trong phép kiểm chứng này, theo dõi thời điểm có thông tin trước khi đánh giá lợi nhuận. Lưu bản mã nguồn, toàn bộ tham số, mã giao dịch đầy đủ và sàn, khung thời gian, loại biểu đồ, phiên và phạm vi lịch sử. Sau đó so bản ghi realtime với cùng đoạn biểu đồ được tải lại dưới cùng điều kiện.

Tín hiệu trên nến đang chạy có thể chứa giá trị chưa xác nhận
Trong một nến đang hình thành, giá cao, thấp và giá hiện tại còn cập nhật. Dấu hiệu xuất hiện khi giá thỏa điều kiện có thể biến mất trước lúc đóng nến. Nếu phép tính dùng giá thực sự nhận được lúc ấy, hiện tượng đó là điều kiện thay đổi, chưa phải nhìn trước tương lai. OHLC sau khi đóng nến không lưu lại mọi trạng thái ở giữa.
Chỉ báo chạy theo các cập nhật realtime, còn chiến lược mặc định tính khi nến đóng. Bật calc_on_every_tick cho chiến lược cho phép tính trên các cập nhật trong nến realtime, nhưng dữ liệu OHLC lịch sử không khôi phục lại mọi tick đã xảy ra. Mô hình thực thi Pine
Một thiết kế giao dịch giữa nến vẫn có thể là chủ ý hợp lệ. Câu hỏi là backtest chỉ dùng nến đã đóng kiểm chứng được bao nhiêu phần của thiết kế ấy. Nếu chọn giao dịch theo nến xác nhận, tách thời điểm dấu hiệu xuất hiện tạm thời khỏi thời điểm nó còn tồn tại khi đóng nến, rồi quy định rõ trạng thái nào được dùng để đặt lệnh.
Ví dụ 1 · Giá hiện tại và giá đóng nến đã xác nhận (Pine v6)
Không có tham số đầu vào. Trên nến 5 phút thông thường, so đường màu hổ phách Current close với các điểm xanh Confirmed close. Đường giá hiện tại thay đổi theo cập nhật của nến đang mở; các điểm được thiết kế để xuất hiện khi nến biểu đồ đóng. Nến lịch sử đã xác nhận nên hai giá trị trùng nhau. Cần ghi lại cập nhật thực tế để thấy biến động giữa nến.
//@version=6
indicator("OptiNod - Open bar and confirmed close", overlay=true)
// Layout: Minimal Overlay. Educational indicator; no orders or alerts.
float confirmedClose = barstate.isconfirmed ? close : na
plot(close, "Current close", color=#f59e0b, linewidth=2)
plot(confirmedClose, "Confirmed close", color=#10b981, linewidth=2, style=plot.style_circles)lookahead_off không tự bảo đảm dữ liệu khung lớn đã xác nhận
Khi dùng request.security() để lấy dữ liệu khung thời gian cao hơn, HTF, phải phân biệt việc nến trên biểu đồ đóng với việc nến HTF đóng. Một nến 5 phút có thể đã xác nhận trong khi nến 1 giờ chứa nó vẫn đang chạy.
Dùng lookahead_on với biểu thức của nến HTF hiện tại có thể đưa giá trị cuối cùng của HTF về đầu khoảng HTF trên dữ liệu lịch sử. Khi ấy thông tin chưa có đã bị dùng sớm. Thiết lập mặc định lookahead_off ngăn kiểu đưa trước giá trị lịch sử đó, nhưng không làm giá trị HTF đang chạy trong realtime trở nên cố định. Kết quả vẫn có thể thay đổi sau khi tải lại. Dữ liệu từ khung thời gian khác
Vì vậy, không kết luận chỉ từ tên tùy chọn. lookahead_on không phải lúc nào cũng sai, và lookahead_off không đồng nghĩa mọi đầu vào đã xác nhận. Cần xem biểu thức được lấy, quan hệ giữa các khung và thời điểm giá trị được cập nhật.

Thiết kế dùng HTF xác nhận tham chiếu nến HTF trước đó
Với khung được yêu cầu cao hơn nghiêm ngặt so với khung biểu đồ, cách tài liệu chính thức mô tả để nhận giá trị đã xác nhận nhất quán là lùi biểu thức một nến trong chính ngữ cảnh HTF bằng expression[1], kết hợp với lookahead_on. Ý tưởng là dùng giá trị đã chốt của nến HTF trước từ đầu khoảng HTF mới. Phần lùi biểu thức và cách đưa dữ liệu xuống phải được xét cùng nhau. Cách lấy giá trị HTF đã xác nhận
Cách này không cho biết sớm giá trị cuối của nến 1 giờ đang hình thành. Đầu vào là nến 1 giờ trước đó, nên tốc độ phản ứng và mức xác nhận khác với việc dùng HTF hiện tại. Không áp dụng nguyên dạng như một cách sửa chung cho yêu cầu cùng khung hoặc khung thấp hơn.
barstate.isconfirmed trên biểu đồ xác nhận chính nến của biểu đồ. Nó không làm HTF đang được tham chiếu đóng theo, và cũng không phải điều kiện có thể đặt vào request.security() để giải quyết mọi vấn đề xác nhận HTF. Trạng thái nến trong Pine
Điều kiện kiểm tra HTF: Trên nến 5 phút thông thường, quan sát đầu vào 1 giờ. Lưu thời điểm mỗi nến 5 phút đóng cùng định danh thời gian và giá trị nến 1 giờ đang được dùng. Với thiết kế dùng HTF đã xác nhận, kiểm tra giá trị có cập nhật tại ranh giới 1 giờ dự kiến hay không. Nếu nó đổi bất ngờ giữa khoảng đó, tạm ngừng dùng tín hiệu để gửi lệnh và kiểm tra biểu thức cùng quan hệ giữa hai khung.
Ví dụ 2 · Giá đóng HTF đã xác nhận trước đó (Pine v6)
Dùng nến 5 phút thông thường với tham số khung cao hơn là 60. Đường bậc thang xanh dùng giá đóng nến 1 giờ trước từ đầu mỗi khoảng 1 giờ mới. [1] nằm trong ngữ cảnh 1 giờ được yêu cầu; lookahead_on đưa giá trị đã xác nhận vào đầu khoảng. Nó không đọc trước giá đóng tương lai của giờ hiện tại. Khung bằng hoặc thấp hơn bị từ chối bằng lỗi. Đổi lại, đường này không phản ứng với biến động mới nhất trong giờ đang chạy và không giải quyết dữ liệu sửa hay phần vẽ lùi khác của mã.
//@version=6
indicator("OptiNod - Previous confirmed HTF close", overlay=true)
// Layout: Minimal Overlay. Educational indicator; no orders or alerts.
string higherTimeframe = input.timeframe("60", "상위 시간대", tooltip="차트보다 큰 시간대만 사용합니다. 5분 차트에서는 60분을 선택합니다.")
if timeframe.in_seconds(higherTimeframe) <= timeframe.in_seconds()
runtime.error("Choose a timeframe strictly higher than the chart.")
float confirmedHigherClose = request.security(syminfo.tickerid, higherTimeframe, close[1], gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(confirmedHigherClose, "Previous confirmed HTF close", color=#10b981, linewidth=2, style=plot.style_stepline)Kết quả quan sát và phạm vi — Cả hai ví dụ Pine v6 đã biên dịch trong TradingView Pine Editor và chạy trên biểu đồ. Khi quan sát realtime ngắn trên nến 5 phút thông thường của OANDA:EURUSD, ví dụ 1 hiển thị giá hiện tại 1.12886 còn giá đóng nến biểu đồ đã xác nhận chưa xuất hiện. Trong một lần chạy riêng của ví dụ 2, giá nến 5 phút hiện tại là 1.12892 và giá đóng nến 1 giờ đã xác nhận trước đó là 1.12912; đường bậc thang xanh cũng xuất hiện trên các nến lịch sử. Trên một nến ngày AAPL lịch sử đã đóng, cả hai giá trị của ví dụ 1 đều là 333.02. Đây là giá trị quan sát, không phải điều kiện giao dịch hay đầu vào cố định.
Phạm vi kiểm tra là chạy biểu đồ và quan sát realtime ngắn. Chưa theo dõi liên tục toàn bộ nến 5 phút hay cả trước và sau ranh giới 1 giờ, nên kết quả chưa chứng minh tính nhất quán sau khởi động lại hoặc hành vi trên mọi thị trường. Phép kiểm tra tiếp theo là cố định mã, tham số, thị trường và phạm vi dữ liệu, ghi thời điểm nến thực sự đóng cùng ranh giới HTF, rồi so với lần chạy lại.
Vị trí pivot khác với nến phát hiện pivot
Giả sử một pivot cần hai nến bên phải để xác nhận. Đỉnh ứng viên nằm ở nến A nhưng hai nến cần thiết chỉ đủ tại nến C. Nếu đến C mới phát hiện rồi vẽ dấu trở lại A, biểu đồ lịch sử sẽ trông như dấu đã có từ đầu ở đỉnh. Quy tắc giao dịch chỉ được sử dụng thông tin sau khi phát hiện; không thể lấy vị trí vẽ làm thời điểm khớp.
ZigZag cũng có thể thay đổi đoạn cuối và đỉnh hoặc đáy ứng viên trước khi đạt điều kiện đảo chiều của cấu hình. Nó có thể hữu ích để quan sát cấu trúc giá, nhưng đỉnh–đáy cuối cùng không chứng minh rằng bạn đã biết cấu trúc đó ngay lúc ấy. Hãy kiểm tra chính phiên bản đang dùng xác nhận điều gì và khi nào.
Offset âm của phần vẽ dịch vị trí hiển thị về quá khứ; nó không phải chỉ số lịch sử dùng để đọc giá tương lai. Tham chiếu lịch sử của Pine là cơ chế lấy giá trị trước đó. Cần tách thao tác dời hình vẽ khỏi thời điểm thông tin trở nên khả dụng. Offset khi vẽ, toán tử tham chiếu lịch sử

Cảnh báo lúc đóng nến chỉ xác nhận trong phạm vi của nó
“Once Per Bar Close” dùng để thông báo khi điều kiện còn đúng tại lúc nến biểu đồ đóng. Nó giúp hạn chế cảnh báo từ một điều kiện chỉ xuất hiện tạm thời giữa nến. Tuy nhiên, nếu điều kiện phụ thuộc HTF chưa đóng, giá trị HTF gốc vẫn có thể thay đổi sau đó. Chỉ đổi tần suất cảnh báo không sửa được cách lấy HTF.
Cần biết cảnh báo đang thông báo sự kiện nào. Cảnh báo điều kiện và thông báo khớp lệnh của chiến lược không phải cùng một thứ. Cảnh báo đã tạo chạy trên bản sao mã và tham số tại thời điểm tạo, nên thay đổi biểu đồ có thể yêu cầu tạo lại cảnh báo. Cơ chế cảnh báo TradingView
Ngoài vị trí dấu trên biểu đồ, lưu cấu hình cảnh báo, thời điểm phát sinh, thời điểm nhận và nến liên quan. Nhận được thông báo chưa chứng minh rằng một lệnh ngoài thị trường đã khớp tại cùng thời điểm.
Theo tính toán chiến lược mặc định của TradingView, lệnh thị trường tạo khi nến xác nhận được xử lý từ tick khả dụng tiếp theo, thường là giá mở cửa nến sau trên dữ liệu lịch sử. process_orders_on_close là lựa chọn xử lý lệnh tại lúc đóng nến trong mô phỏng; riêng lựa chọn đó chưa đủ kết luận có rò rỉ tương lai. Cách xử lý lệnh chiến lược
Ngay cả khi không dùng tương lai, cảnh báo gửi sau lúc đóng nến cũng không bảo đảm khớp được đúng giá đóng cửa thật. Kiểm tra thời điểm thông tin khả dụng bằng mã và bản ghi quan sát; kiểm tra khả năng thực hiện bằng nhật ký lệnh và giá khớp. Lùi mọi tín hiệu một nến không tự giải quyết HTF chưa xác nhận hay dấu vẽ lùi về quá khứ.
So sánh sau tải lại cần cùng điều kiện dữ liệu
| Khác biệt quan sát được | Điều cần kiểm tra | Bằng chứng cần lưu |
|---|---|---|
| Dấu chỉ xuất hiện giữa nến | Giá trị chưa xác nhận và thời điểm tính | Giá trị, hình ảnh, thông báo giữa nến và lúc đóng |
| Giá trị HTF đổi trước khi HTF đóng | Biểu thức, ranh giới HTF, đầu vào xác nhận | Thời gian của nến biểu đồ và nến HTF |
| Dấu được thêm vào một nến cũ | Số nến bên phải của pivot, offset hiển thị | Nến được vẽ và nến lần đầu phát hiện |
| Lịch sử đổi sau khi tải lại | Các nguyên nhân trên, dữ liệu sửa, lịch sử nạp thay đổi | Bản mã, tham số và phạm vi dữ liệu đã lưu |
| Cảnh báo không khớp biểu đồ | Bản dùng khi tạo, tần suất và loại sự kiện | Cấu hình tạo cùng nhật ký gửi–nhận |
Một biểu hiện có thể có nhiều nguyên nhân. Cố định mã và tham số rồi kiểm tra từng khả năng. Giữ cả việc nhà cung cấp sửa dữ liệu hoặc lịch sử khởi tạo thay đổi trong danh sách cần xem xét. Chỉ nhìn thấy khác biệt không đủ để kết luận ý đồ của tác giả hoặc việc sử dụng tương lai.
Bổ sung quan sát realtime và so sánh sau tải lại cho Bar Replay
Bar Replay tiến từng nến giúp tìm độ trễ xác nhận pivot và việc vẽ lùi. CSV giao dịch giúp đối chiếu thời gian, khối lượng và giá của phép tính lịch sử. Tuy nhiên, mỗi công cụ riêng lẻ không chứng minh mọi tick hay trạng thái tạm thời đã từng xuất hiện trong realtime.
Chọn trước giai đoạn quan sát, cố định mã, tham số và điều kiện thị trường. Với mỗi tín hiệu, lưu thời điểm quan sát đầu tiên, nến được gắn dấu, trạng thái xác nhận của nến biểu đồ và HTF, cùng nhật ký cảnh báo. Kết thúc giai đoạn, tải lại cùng đoạn trong cùng điều kiện, rồi tìm dấu mất đi, đổi vị trí hoặc được thêm vào. Muốn kiểm chứng giao dịch giữa nến, cần ghi cả các giá trị trong nến; nếu không, vẫn còn những biến động chưa được quan sát.
Không có một ngưỡng tỷ lệ thắng đủ để chẩn đoán rò rỉ tương lai. Dòng mô tả “non-repainting” cũng chưa phải bằng chứng. Cơ sở để sử dụng tín hiệu là giải thích được thông tin nào có vào lúc nào, và vì sao bản ghi phù hợp hoặc khác phép tính lại. Khi còn một tín hiệu chưa giải thích được, quay về thời điểm đầu tiên có thể quan sát nó trước khi đánh giá chiến lược có lợi nhuận hay không.
