
Chiến lược này là một hệ thống giao dịch định lượng không được vẽ lại dựa trên biểu đồ Renko, giải quyết vấn đề vẽ lại trong chiến lược Renko truyền thống bằng cách mô phỏng hành vi của khối Renko trên biểu đồ thời gian tiêu chuẩn. Chiến lược này sử dụng khối giá có kích thước cố định để lọc tiếng ồn thị trường, chỉ chú ý đến sự thay đổi giá có ý nghĩa, đồng thời đảm bảo tín hiệu lịch sử không thay đổi.
Các tính năng chính:
Nguyên tắc cốt lõi của chiến lược này là thực hiện chức năng của khối Renko trên biểu đồ thời gian tiêu chuẩn, đồng thời giải quyết các vấn đề vẽ lại trong biểu đồ Renko truyền thống. Nguyên tắc làm việc cụ thể như sau:
Thiết lập và khởi tạo tham số:
brickSize: Định nghĩa kích thước khối, quyết định giá phải di chuyển bao nhiêu để tạo thành khối mớirenkoPriceRenko Block: lưu trữ giá bán cuối cùng của Renko BlockprevRenkoPriceGiá của Renko Brick:brickDir: theo dõi hướng khối ((1 = tăng, -1 = giảm)newBrickBiểu tượng Bull, chỉ ra sự hình thành của khối mớibrickStart: Lưu chỉ mục cột bắt đầu khối hiện tạiNhận dạng khối Renko không được vẽ lại:
Hình ảnh Renko trên biểu đồ thời gian:
Đánh giá xu hướng đảo ngược nhiều bước:
Sau khi phân tích sâu về mã, chiến lược này cho thấy những ưu điểm đáng chú ý sau:
Giải quyết vấn đề vẽ lại:
Bộ lọc tiếng ồn và nhận dạng xu hướng rõ ràng:
Xác nhận tín hiệu nhiều bước:
brickDir[brickSize]với hiện tạibrickDirvà mức giá lịch sửHình ảnh cơ sở giao dịch:
Tính linh hoạt và tùy biến:
Mặc dù chiến lược này đã giải quyết được vấn đề vẽ lại, nhưng vẫn có những yếu tố nguy cơ sau đây:
Rủi ro của tín hiệu chậm:
Kích thước khối lượng chọn rủi ro:
Rủi ro của tín hiệu sai:
Rủi ro rút lui:
Tính toán rủi ro tài nguyên:
Dựa trên phân tích mã, đây là một số hướng tối ưu hóa quan trọng của chiến lược:
Tối ưu hóa kích thước khối động:
Thêm bộ lọc giao dịch:
Cải thiện hệ thống ngăn chặn và thu lợi nhuận:
strategy.exit()Lệnh, thiết lập điểm dừng dựa trên ATR hoặc kích thước khốiTối ưu hóa cơ chế xác minh nhiều bước:
brickSizeTỷ lệ so sánh các khối lịch sửCải thiện hệ thống hiển thị và báo động:
label.new()Vàalert()Chức năng tăng cường trải nghiệm người dùngChiến lược giao dịch lượng hóa ngược xu hướng mô phỏng xu hướng Renko nhiều bước đã giải quyết thành công vấn đề vẽ ngược trong chiến lược Renko truyền thống, cho phép các nhà giao dịch áp dụng logic Renko trên biểu đồ thời gian tiêu chuẩn, đồng thời duy trì sự ổn định của tín hiệu lịch sử. Chiến lược này nhận ra xu hướng đảo ngược thông qua cơ chế xác minh nhiều bước, cải thiện chất lượng tín hiệu và hiển thị trực quan cấu trúc thị trường thông qua biểu đồ.
Lợi thế chính của chiến lược là giải quyết các vấn đề vẽ lại, lọc tiếng ồn thị trường, xác minh tín hiệu nhiều cấp và biểu thị đồ họa trực quan. Tuy nhiên, vẫn có những rủi ro như trì hoãn tín hiệu, lựa chọn kích thước khối và tín hiệu giả. Trong tương lai, có thể tối ưu hóa hơn nữa bằng cách thực hiện kích thước khối động, tăng bộ lọc giao dịch, cải thiện cơ chế dừng lỗ, tối ưu hóa các bước xác minh và tăng cường hệ thống hiển thị.
Phương pháp này kết hợp những ưu điểm của biểu đồ Renko và tránh những nhược điểm của nó, đặc biệt phù hợp với các chiến lược giao dịch theo xu hướng và đảo ngược xu hướng, cung cấp cho các nhà giao dịch một công cụ phân tích kỹ thuật đáng tin cậy, có thể cung cấp hiệu suất thực tế ổn định trong khi vẫn duy trì độ chính xác đo đạc.
//@version=5
strategy("Non-Repainting Renko Emulation Strategy [PineIndicators]", overlay=true, calc_on_every_tick=false, max_boxes_count = 500, max_labels_count = 500, max_lines_count = 500, initial_capital = 10000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, commission_value = 0.01, slippage = 2)
// Parameter: Brick-Größe (z.B. 10 Punkte)
brickSize = input.float(3.0, "Brick Size", step=0.1)
// Persistente Variablen
var float renkoPrice = na // Aktueller Renko-Level (Schlusswert des letzten Bricks)
var float prevRenkoPrice = na // Vorheriger Renko-Level (für Box-Berechnung)
var int brickDir = 0 // 1 = Aufwärts, -1 = Abwärts
var bool newBrick = false // Signalisiert, dass ein neuer Brick abgeschlossen wurde
var int brickStart = bar_index // Beginn des aktuellen Bricks (x-Achse)
// Berechnungen nur auf abgeschlossenen Candles
if barstate.isconfirmed
newBrick := false
// Initialisierung: Beim ersten Candle setzen wir den Renko-Level
if na(renkoPrice)
renkoPrice := close
brickStart := bar_index
// Berechne die Differenz zum letzten Renko-Level
diff = close - renkoPrice
// Prüfen, ob der Unterschied mindestens der Brick-Größe entspricht
if math.abs(diff) >= brickSize
// Anzahl kompletter Bricks (kann > 1 sein)
numBricks = math.floor(math.abs(diff) / brickSize)
prevRenkoPrice := renkoPrice
// Aktualisieren des Renko-Levels
renkoPrice := renkoPrice + numBricks * brickSize * math.sign(diff)
// Brick-Richtung (konvertiere math.sign-Ergebnis in int)
brickDir := int(math.sign(diff))
newBrick := true
// Bestimme die obere und untere Grenze des abgeschlossenen Bricks:
lowLevel = brickDir == 1 ? prevRenkoPrice : renkoPrice
highLevel = brickDir == 1 ? renkoPrice : prevRenkoPrice
// Setze den Start für den nächsten Brick
brickStart := bar_index
// Handelslogik: Einstieg/Ausstieg nur, wenn ein neuer Brick abgeschlossen wurde
if barstate.isconfirmed and newBrick
// Bei Aufwärts-Brick: Long-Signal
if brickDir[brickSize] < brickDir and renkoPrice[brickSize] < renkoPrice[brickSize*2] and renkoPrice < renkoPrice[brickSize] and renkoPrice[brickSize*2] < renkoPrice[brickSize*3] and strategy.position_size <= 0
// Bestehende Short-Position schließen, falls vorhanden
strategy.entry("Long", strategy.long)
// Bei Abwärts-Brick: Short-Signal
else if brickDir[brickSize] > brickDir and renkoPrice[brickSize] > renkoPrice[brickSize*2] and renkoPrice > renkoPrice[brickSize] and renkoPrice[brickSize*2] > renkoPrice[brickSize*3] and strategy.position_size >= 0
// Bestehende Long-Position schließen, falls vorhanden
strategy.entry("Short", strategy.short)
if barstate.isconfirmed and newBrick
if brickDir[brickSize] < brickDir
strategy.close("Short")
else if brickDir[brickSize] > brickDir
strategy.close("Long")