Đã tạo một cBot sử dụng CRTIndicator để đặt mức dừng lỗ và chốt lời.
Ý tưởng là sử dụng các mức CRT (cao, giữa, thấp) của cây nến trước đó (được chỉ định bởi CandleIndex) để đặt dừng lỗ và chốt lời cho giao dịch mới.
Các bước:
- Chúng ta sẽ tạo một cBot mở một giao dịch (mua hoặc bán) dựa trên một số điều kiện (mà chúng ta sẽ định nghĩa như một tham số để thử nghiệm).
- Chúng ta sẽ sử dụng CRTIndicator để lấy các mức từ cây nến trước đó (chỉ số cây nến được người dùng đặt).
- Đối với giao dịch mua, chúng ta sẽ đặt dừng lỗ tại mức thấp CRT và chốt lời tại mức cao CRT của cây nến tham chiếu.
- Đối với giao dịch bán, chúng ta sẽ đặt dừng lỗ tại mức cao CRT và chốt lời tại mức thấp CRT của cây nến tham chiếu.
Tuy nhiên, lưu ý rằng CRTIndicator mà chúng ta có chỉ tính toán các mức cho mỗi cây nến và vẽ chúng.
Chúng ta cần truy cập chỉ báo từ cBot và lấy các giá trị cho cây nến cụ thể mà chúng ta quan tâm.
Hãy thiết kế cBot:
Các tham số:
- CandleIndex: cây nến trước đó nào được sử dụng (0 = hiện tại, 1 = trước đó, v.v.)
- TradeType: chúng ta có thể đặt một tham số để chọn giữa Mua và Bán để thử nghiệm, hoặc có thể sử dụng tín hiệu (như giao cắt trung bình động) để quyết định.
Để đơn giản, hãy tạo một tham số để chọn loại giao dịch.
Nhưng lưu ý: Trong giao dịch thực, chúng ta sẽ sử dụng một số điều kiện để vào lệnh. Chúng ta sẽ tạo một cBot đơn giản mở giao dịch trên cây nến hiện tại nếu không có vị thế nào đang mở.
Chúng ta sẽ giả định đang giao dịch trên khung thời gian của biểu đồ.
Các bước trong cBot:
- Kiểm tra xem có vị thế nào đang mở không. Nếu không, thì xem xét mở lệnh.
- Lấy các giá trị CRTIndicator cho CandleIndex được chỉ định (là cây nến quá khứ so với hiện tại).
- Đối với giao dịch Mua:
Dừng lỗ = Mức thấp CRT của cây nến tham chiếu
Chốt lời = Mức cao CRT của cây nến tham chiếu - Đối với giao dịch Bán:
Dừng lỗ = Mức cao CRT của cây nến tham chiếu
Chốt lời = Mức thấp CRT của cây nến tham chiếu
Tuy nhiên, lưu ý rằng chỉ báo tính toán cho mỗi chỉ số. Chúng ta đang vẽ cùng một giá trị cho mỗi chỉ số (bởi vì chúng ta đang sử dụng một độ lệch CandleIndex cố định).
Nhưng trong cBot, chúng ta muốn lấy các mức từ chỉ báo tại thời điểm hiện tại (cây nến hoàn thành gần nhất) cho CandleIndex được chỉ định.
Quan trọng: Phương thức Calculate của chỉ báo được gọi cho mỗi chỉ số, và nó lưu trữ các giá trị cho cây nến tham chiếu (chỉ số - CandleIndex) tại chỉ số hiện tại.
Vậy nếu chúng ta muốn lấy các mức CRT cho một cây nến lịch sử cụ thể, chúng ta có thể đơn giản đọc chuỗi đầu ra của chỉ báo tại chỉ số của cây nến đó?
Nhưng lưu ý: các đầu ra của chỉ báo được căn chỉnh với chỉ số hiện tại. Thực tế, chỉ báo đang vẽ cùng một giá trị cho mỗi thanh vì chúng ta đang đặt:
CRTHigh[index] = crtHigh; // trong đó crtHigh là mức cao của cây nến (index - CandleIndex)
Vậy nếu chúng ta đang ở chỉ số 100 và CandleIndex=1, thì chúng ta đang lấy mức cao của chỉ số 99 và vẽ nó tại chỉ số 100.
Điều này có nghĩa là nếu chúng ta muốn các mức CRT cho cây nến cách đây CandleIndex thanh, chúng ta có thể lấy đầu ra chỉ báo tại thanh hiện tại (chỉ số) và điều đó sẽ cho chúng ta các mức từ CandleIndex thanh trước.
Nhưng chờ đã, trong cBot, chúng ta sẽ chạy OnBar hoặc OnTick. Chúng ta quan tâm đến thanh hoàn thành gần nhất (chỉ số = MarketSeries.Close.Count - 2) và cây nến chúng ta muốn là (chỉ số hiện tại - CandleIndex).
Ngoài ra, chúng ta có thể thay đổi chỉ báo để xuất các mức tại cùng chỉ số với cây nến tham chiếu, nhưng sau đó chúng ta sẽ phải dịch chuyển biểu đồ theo CandleIndex.
Tuy nhiên, chỉ báo hiện tại được thiết kế để vẽ các mức tại thanh hiện tại từ một thanh trước đó. Vì vậy nếu chúng ta đặt CandleIndex=1, thì tại mỗi thanh chúng ta đang vẽ các mức từ thanh trước đó.
Cách chúng ta có thể sử dụng nó trong cBot:
Chúng ta sẽ thêm chỉ báo vào cBot và sau đó lấy các giá trị cho thanh gần nhất (chỉ số = MarketSeries.Close.Count - 1) và điều đó sẽ cho chúng ta các mức từ CandleIndex thanh trước.
Ví dụ:
Chỉ số thanh hiện tại = thanh cuối cùng (chỉ số = MarketSeries.Close.Count - 1)
Sau đó đầu ra chỉ báo tại chỉ số này (CRTHigh[MarketSeries.Close.Count-1]) là mức cao của thanh (chỉ số hiện tại - CandleIndex).
Nhưng lưu ý: phương thức Calculate của chỉ báo được gọi cho mỗi thanh lịch sử và sau đó cho mỗi thanh mới. Vì vậy chuỗi đầu ra cho thanh cuối cùng sẽ có giá trị mà chúng ta muốn.
Hãy viết mã cho cBot:
Chúng ta sẽ có các tham số:
[Parameter("Candle Index", DefaultValue = 1, MinValue = 0)]
public int CandleIndex { get; set; }
[Parameter("Trade Type", DefaultValue = TradeType.Buy)]
public TradeType SelectedTradeType { get; set; }
[Parameter("Volume (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Volume { get; set; }
Chúng ta cũng sẽ tạo một thể hiện của CRTIndicator.
Các bước trong OnBar:
nếu không có vị thế, thì mở vị thế mới với dừng lỗ và chốt lời được đặt từ đầu ra của chỉ báo cho thanh hiện tại (tương ứng với các mức từ CandleIndex thanh trước).
Tuy nhiên, lưu ý: đầu ra của chỉ báo cho thanh hiện tại (thanh cuối cùng) được đặt thành các mức của (chỉ số thanh hiện tại - CandleIndex). Nhưng khi chúng ta ở ngay đầu, phải đảm bảo có đủ số thanh.