Chuyển đến nội dung chính
ATK Pine Script®

Hợp Đồng Giai Đoạn

Quy tắc sở hữu giai đoạn cho tác giả visual — mỗi giai đoạn sở hữu gì và không được làm gì qua build_indicator_frame, build_signal_frame, build_trade_frame, và build_visuals.

Hợp Đồng Giai Đoạn Cho Tác Giả Visual#

Giai đoạnSở hữuKhông được làm
build_indicator_frameTính toán indicator, các column visual đã chuẩn bị, cấu hình attrs tĩnh.Render đối tượng trực tiếp.
build_signal_frameTính toán strategy, helper MTF, intent thực thi đã ánh xạ.Trì hoãn rủi ro, entry, hoặc resampling sang giai đoạn sau.
build_trade_frameÁnh xạ hoặc ủy quyền cho build_mapped_trade_frame(...).Chạy TA, gọi request, hoặc phát minh logic strategy.
build_visualsRender từ dữ liệu đã chuẩn bị và slice frame hiện tại.Tính toán indicator, thay đổi frame đầu vào, hoặc phụ thuộc vào tọa độ attrs cũ.

Kiểm tra thực tế: nếu bạn có thể xóa build_visuals mà vẫn giữ nguyên tất cả các column đã tính toán và strategy intent, thì việc phân chia giai đoạn của bạn có lẽ đúng. Nếu xóa nó làm mất tính toán, thì những tính toán đó thuộc về giai đoạn trước.

Ý Nghĩa Mỗi Giai Đoạn Đối Với Tác Giả Visual#

build_indicator_frame#

Đây là nơi tất cả tính toán diễn ra. Khi build_visuals chạy, mọi giá trị nó cần phải đã tồn tại dưới dạng column hoặc trong frame.attrs. Chuẩn bị các column visual ở đây — boolean tín hiệu, giá neo, nhãn hiển thị — để build_visuals chỉ đọc.

build_visuals#

Giai đoạn này hoàn toàn là lượt render. Nó đọc các hàng cuối của frame, giải nén cấu hình từ frame.attrs, và lắp ráp các intent ctx.* hoặc ctx.atk.*. Nó không được gọi ta.*, resample, thay đổi frame, hoặc thực hiện bất kỳ tính toán nào thuộc về frame builder.

frame.attrs cho cấu hình tĩnh#

Lưu trữ màu sắc, tiêu đề, token style, và các cấu hình ổn định khác trong frame.attrs bên trong build_indicator_frame. Lấy tọa độ, điểm neo tail, và hình học theo slice từ slice frame trực tiếp bên trong build_visuals.

# build_indicator_frame — store style config in attrs
frame.attrs["label_style"] = {"color": "#2962ff", "style": "label_down"}

# build_visuals — read attrs for config, frame for coordinates
def build_visuals(frame, params=None, ctx=None):
    if frame is None or frame.empty or ctx is None:
        return None
    last = frame.iloc[-1]
    style = dict(frame.attrs.get("label_style") or {})
    return ctx.label.new(
        key="signal_label",
        x=int(last["index"]),
        y=float(last["low"]),
        text="SIGNAL",
        **style,
    )