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.


Vị trí tín hiệu trên biểu đồ hồi tố có thể khác thời điểm đầu tiên quan sát được trong realtime
Vị trí tín hiệu trên biểu đồ hồi tố có thể khác thời điểm đầu tiên quan sát được...

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.


Đưa giá trị cuối cùng chưa xác nhận của HTF về quá khứ có thể đưa thông tin vào trước khi nó tồn tại
Đưa giá trị cuối cùng chưa xác nhận của HTF về quá khứ có thể đưa thông tin vào...

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ử


Đỉnh ứng viên và đoạn cuối của ZigZag có thể thay đổi trước khi xác nhận đảo chiều
Đỉnh ứng viên và đoạn cuối của ZigZag có thể thay đổi trước khi xác nhận đảo chiều

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 traBằng chứng cần lưu
Dấu chỉ xuất hiện giữa nếnGiá trị chưa xác nhận và thời điểm tínhGiá trị, hình ảnh, thông báo giữa nến và lúc đóng
Giá trị HTF đổi trước khi HTF đóngBiểu thức, ranh giới HTF, đầu vào xác nhậnThờ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ạiCác nguyên nhân trên, dữ liệu sửa, lịch sử nạp thay đổiBả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ệnCấ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.


So bản ghi đã lưu trong realtime với cùng giai đoạn sau khi tải lại biểu đồ
So bản ghi đã lưu trong realtime với cùng giai đoạn sau khi tải lại biểu đồ

Kiểm tra backtest của bạn

Tải lên CSV kết quả tối ưu hóa hoặc danh sách giao dịch của chiến lược TradingView để xem các chỉ số hiệu suất cùng kết quả kiểm tra độ bền. Không cần đăng nhập để phân tích.

Phân tích tệp kết quả Xem báo cáo mẫu