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ạn | Sở hữu | Không được làm |
|---|---|---|
build_indicator_frame | Tí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_frame | Tí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_visuals | Render 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,
)