Bỏ qua

Cách sử dụng chỉ báo trong cBot

Trong bài viết này và video tương ứng, chúng tôi giải thích cách bạn có thể sử dụng các chỉ báo tích hợp sẵn trong cBot của mình. Việc sử dụng chỉ báo trong cBot thường được thực hiện cho nhiều mục đích, đáng chú ý nhất là giúp cBot đưa ra quyết định giao dịch dựa trên kết quả của chỉ báo. Để minh họa điều này, chúng ta sẽ phát triển một chiến lược giao dịch tự động đơn giản dựa trên Chỉ số sức mạnh tương đối (RSI).

Tạo một cBot mới

Để tạo một cBot mới, hãy chuyển sang tab Algo và nhấp vào New cBot.

Chúng ta sẽ đổi tên cBot của mình thành "RSI cBot". Đây là cách chiến lược giao dịch tự động của chúng ta sẽ hoạt động.

  • Bot sẽ vào vị thế mua khi chỉ báo RSI di chuyển xuống dưới ngưỡng đã định trước.
  • Bot sẽ vào vị thế bán khi chỉ báo RSI di chuyển lên trên ngưỡng đã định trước.

Định nghĩa và khởi tạo chỉ báo

Điều đầu tiên chúng ta cần làm là định nghĩa chỉ báo RSI trong lớp cBot của chúng ta. Để làm điều đó, chúng ta khai báo một trường mới.

1
private RelativeStrengthIndicator rsi;

Sử dụng các thành viên lớp riêng tư

Chúng ta có thể an toàn đặt trường rsi là riêng tư vì nó sẽ chỉ được sử dụng trong cBot của chúng ta.

Tất cả các chỉ báo cTrader cần được khởi tạo trước khi chúng ta có thể sử dụng chúng. Cách tốt nhất để làm điều này là trong phần thân của phương thức OnStart() để cBot có thể truy cập vào đầu ra của chỉ báo sau khi nó bắt đầu chạy. cTrader cung cấp một lớp tiện dụng cho phép bạn dễ dàng khởi tạo các chỉ báo tích hợp sẵn bằng cách sử dụng các hàm tạo có sẵn. Trước khi chúng ta có thể thấy cách thực hiện điều này, chúng ta sẽ thêm hai tham số cần thiết để khởi tạo chỉ báo RSI.

1
2
3
4
5
[Parameter("Source", Group = "RSI")]
public DataSeries Source { get; set; }

[Parameter("Periods", Group = "RSI", DefaultValue = 14)]
public int Periods { get; set; }

Bây giờ chúng ta đã thêm các tham số của mình, chúng ta đã sẵn sàng để khởi tạo chỉ báo.

1
2
3
4
protected override void OnStart()
{
    rsi = Indicators.RelativeStrengthIndex(Source, Periods);
}

Thực hiện logic giao dịch

Vì chúng ta đã khởi tạo chỉ báo, chúng ta có thể gọi và sử dụng nó trong logic giao dịch của mình. Trong trường hợp của chỉ báo RSI, chúng ta có thể đọc các đầu ra bằng cách sử dụng bộ sưu tập Results.

Để làm điều đó, chúng ta sẽ sử dụng phương thức OnBar() và thực hiện các điều kiện sau.

  • Nếu giá trị RSI hiện tại thấp hơn ngưỡng mua RSI, hãy vào một vị thế mua mới.
  • Nếu giá trị RSI hiện tại cao hơn ngưỡng bán RSI, hãy vào một vị thế bán mới.

Vì chúng ta dựa vào các ngưỡng đã định trước để thực hiện logic giao dịch của mình, chúng ta sẽ thêm hai tham số nữa vào cBot của mình.

1
2
3
4
5
[Parameter("Buy Level", Group = "RSI", DefaultValue = 30)]
public int BuyLevel { get; set; }

[Parameter("Sell Level", Group = "RSI", DefaultValue = 70)]
public int SellLevel { get; set; }

Tiếp theo, chúng ta sẽ thực hiện các điều kiện của mình trong mã cBot.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnBarClosed()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
    // Enter buy position
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
    // Enter sell position
    }
}

Đã đến lúc thực hiện các phương thức phụ trợ để thực thi các lệnh giao dịch. Điều này được thực hiện để tạo ra một cấp độ trừu tượng bổ sung trong mã, cải thiện khả năng đọc và tái sử dụng.

Chúng ta bắt đầu bằng cách thêm một tham số cBot nữa cho phép bạn đặt khối lượng giao dịch.

1
2
[Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }

Sau đó, chúng ta sẽ thêm các phương thức Open()Close() để vào một vị thế mới và đóng tất cả các vị thế được mở bởi cBot theo một hướng nhất định.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
private void Open(TradeType tradeType)
{
    var position = Positions.Find("SampleRSI", SymbolName, tradeType);
    var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity);

    if (position == null)
        ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "RSI cBot");
}

private void Close(TradeType tradeType)
{
    foreach (var position in Positions.FindAll("SampleRSI", SymbolName, tradeType))
        ClosePosition(position);
}

Chúng ta có thể sử dụng các phương thức phụ trợ của mình để hoàn thành chiến lược giao dịch tự động.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnTick()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
        Close(TradeType.Sell);
        Open(TradeType.Buy);
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
        Close(TradeType.Buy);
        Open(TradeType.Sell);
    }
}

Backtest cBot

Sau khi chúng ta hoàn thành việc lập trình cBot, chúng ta có thể xây dựng nó và chuyển sang tab Backtesting để xem nó hoạt động như thế nào trên dữ liệu lịch sử.

Chúng ta cũng có thể gắn chỉ báo RSI vào biểu đồ hiện tại để xem liệu các giao dịch được thực hiện bởi cBot có khớp với các điểm vào dự định hay không.

Image title