Bỏ qua

Các loại cBot chính

cBot là những công cụ đa năng mà tùy thuộc vào mã và logic của chúng, có thể đảm nhận nhiều vai trò và chức năng khác nhau, từ giao dịch hoàn toàn tự động đến hỗ trợ thực hiện các chiến lược giao dịch thủ công. Trong bài viết này và video tương ứng, chúng ta sẽ xác định các loại cBot chính, phác thảo những điểm khác biệt chính của chúng và liệt kê một số phương pháp hay nhất để tạo và sử dụng các loại cBot khác nhau.

Nói chung, có bốn loại cBot chính.

Ghi chú

Các danh mục dưới đây chỉ khác nhau dựa trên hành vi của cBot. Không có danh mục nào được chỉ định trong mã cBot thực tế. Ngoài ra, một số nhà phát triển cũng có thể tạo ra các phân loại cBot tùy chỉnh.

  • Chiến lược giao dịch tự động - như tên gọi, các cBot thuộc loại này tự động thực hiện các chiến lược giao dịch. Ví dụ, cBot Ba cây nến đen & ba cây nến trắng đặt một lệnh mua mới sau khi gặp ba cây nến xanh liên tiếp, và một lệnh bán mới khi đối mặt với ba cây nến đỏ liên tiếp.
  • Script - các cBot thuộc loại này thực hiện một hành động khi bắt đầu và dừng sau khi thực thi hoàn tất. Ví dụ, một cBot script có thể thiết lập cắt lỗ cho tất cả các vị thế hiện đang mở bất kể hướng, khối lượng hay công cụ của chúng.
  • Trợ lý giao dịch - được thiết kế để thực hiện một số hành động hữu ích bổ sung cho chiến lược giao dịch thủ công hoặc tự động. Ví dụ, một cBot thuộc loại này có thể quản lý cắt lỗ trượt của bạn bằng các quy tắc tùy chỉnh khác với chức năng cắt lỗ trượt tích hợp do cTrader cung cấp.
  • Bảng giao dịch - các cBot thuộc loại này không giao dịch tự động; thay vào đó, chúng tạo ra các điều khiển tùy chỉnh có thể được sử dụng cho nhiều mục đích khác nhau. Ví dụ, một cBot có thể khởi chạy WebView của một trang tổng hợp tin tức Forex đồng thời tích hợp các nút mua và bán tùy chỉnh cũng như bộ chọn ký hiệu bên trong WebView, cho phép người dùng giao dịch mà không cần rời khỏi trang tin tức.

Trong các phần phụ dưới đây, chúng ta sẽ thảo luận chi tiết về từng loại nêu trên, phác thảo những lợi ích và hạn chế của chúng, đồng thời đề xuất các trường hợp sử dụng khác nhau.

Chiến lược giao dịch thuật toán

Các cBot thuộc loại chiến lược giao dịch tự động phức tạp nhưng mạnh mẽ. Chúng phải triển khai chính xác một chiến lược giao dịch bao gồm tất cả các khía cạnh như quản lý rủi ro, định cỡ vị thế và phân tích kỹ thuật.

Bạn có thể tạo một chiến lược giao dịch tự động đơn giản trong chưa đầy hai phút bằng cách thay thế mẫu cBot mới mặc định bằng mã dưới đây.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using cAlgo.API;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicTrendBot : Robot
    {
        protected override void OnBar()
        {
            if (Bars.ClosePrices.Last(1) > Bars.ClosePrices.Last(2))
            {
                ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "FollowTrend");
            }
            else if (Bars.ClosePrices.Last(1) < Bars.ClosePrices.Last(2))
            {
                ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000, "FollowTrend");
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicTrendBot():
    def on_bar(self):
        if api.Bars.ClosePrices.Last(1) > api.Bars.ClosePrices.Last(2):
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "FollowTrend")
        elif api.Bars.ClosePrices.Last(1) < api.Bars.ClosePrices.Last(2):
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, 1000, "FollowTrend")

cBot mở một vị thế mới trên mỗi nến. Một vị thế mua được mở nếu giá tăng trong nến trước so với nến trước đó. Ngược lại, một vị thế bán được mở nếu giá đã giảm.

Backtest và tối ưu hóa

Các chiến lược giao dịch tự động thường bao gồm nhiều thành phần và tham số di chuyển. Do đó, các cBot như vậy thường cần được backtest và tối ưu hóa rộng rãi trước khi được khởi chạy trên tài khoản thực. May mắn thay, cTrader cung cấp các công cụ tích hợp có thể xử lý backtesttối ưu hóa cho bạn.

Công cụ dòng lệnh cTrader (CLI)

Các chiến lược giao dịch tự động thường cần chạy trong thời gian dài để có thể phản ứng với các tín hiệu phân tích kỹ thuật khác nhau. Để tiết kiệm tiêu thụ RAM và CPU trong những trường hợp này, bạn có thể khởi chạy cBot thông qua cTrader CLI mà không cần mở cTrader Windows (lưu ý rằng có thể khởi chạy bất kỳ cBot nào thông qua cTrader CLI, không chỉ các cBot thuộc loại này).

Script

Script thường cần thiết để thực hiện một số hành động khó hoặc tốn thời gian để làm thủ công. Các hành động này thường được thực hiện khi cBot bắt đầu để bạn có thể khởi chạy một script, quan sát kết quả hoạt động của nó và sau đó dừng phiên bản của nó khi thành công để tiết kiệm tiêu thụ RAM và CPU.

Ví dụ, một script có thể đóng tất cả các vị thế có lợi nhuận gộp vượt quá 50 đơn vị tiền gửi tài khoản của nhà giao dịch. Trên thực tế, script sẽ hoạt động như một lệnh chốt lời phổ quát cho tất cả các vị thế đang mở mà bạn có thể kích hoạt bất cứ lúc nào. Đây là cách mã cho script này sẽ trông như thế nào.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using cAlgo.API;
using cAlgo.API.Collections;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicScriptBot : Robot
    {

        protected override void OnStart()
        {
            foreach (var position in Positions) 
            {
                if (position.GrossProfit > 50) 
                {
                    ClosePosition(position);
                }
            }
            Stop();
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicScriptBot():
    def on_start(self):
        for position in api.Positions:
            if position.GrossProfit > 50:
                api.ClosePosition(position)
        api.Stop()

Sau khi khởi chạy cBot, chúng ta sẽ thấy một số vị thế có lãi dần dần được đóng.

Dừng script

Vì script chỉ cần thực hiện một hành động cụ thể một lần, bạn có thể hướng dẫn cTrader đóng ngay lập tức một script sau khi thực thi hoàn tất thành công. Như đã thể hiện trong ví dụ trên, bạn có thể làm như vậy bằng cách gọi phương thức Stop().

Trợ lý giao dịch

Mục đích của trợ lý giao dịch là thường xuyên thực hiện các hành động hữu ích. Mặc dù điều này làm cho chúng tương tự như script, nhưng script chỉ thực hiện một hành động khi bắt đầu phiên. Ngược lại, trợ lý giao dịch được thiết kế để liên tục phản ứng với điều kiện thị trường hoặc các yếu tố khác, và thực hiện các hoạt động để đáp ứng với các mẫu nhất định.

Ví dụ, hãy xem xét một cBot tự động phòng ngừa rủi ro cho các vị thế của bạn ngay khi bạn mở chúng. Mã cho cBot này có thể trông như sau.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using cAlgo.API;
using cAlgo.API.Collections;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicAssistantBot : Robot

    {
        private bool hasHedgedPosition = false;

        protected override void OnStart()
        {
            Positions.Opened += Positions_Opened;
        }

        private void Positions_Opened(PositionOpenedEventArgs args) 
        {
            if (!hasHedgedPosition) 
            {
                hasHedgedPosition = true;
                var position = args.Position;
                var oppositeTradeType = position.TradeType == TradeType.Buy ? TradeType.Sell : TradeType.Buy;
                ExecuteMarketOrder(oppositeTradeType, SymbolName, position.VolumeInUnits / 2);
            }
            else 
            {
                hasHedgedPosition = false;            
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicAssistantBot():
    def on_start(self):
        self.hasHedgedPosition = False
        api.Positions.Opened += self.positions_opened

    def positions_opened(self, args):
        if not self.hasHedgedPosition:
            self.hasHedgedPosition = True
            position = args.Position
            opposite = TradeType.Sell if position.TradeType == TradeType.Buy else TradeType.Buy
            api.ExecuteMarketOrder(opposite, api.SymbolName, position.VolumeInUnits / 2)
        else:
            self.hasHedgedPosition = False

Khi mở một vị thế, cBot ngay lập tức cố gắng mở một vị thế khác theo hướng ngược lại; khối lượng của vị thế mới này chính xác bằng một nửa khối lượng của vị thế ban đầu.

Lưu ý rằng chúng ta đang sử dụng trường hasHedgedPosition để tránh một vòng lặp vô hạn để cBot chỉ phòng ngừa rủi ro cho một vị thế mới một lần.

Hàm gọi lại

Các trợ lý giao dịch thường sử dụng các hàm gọi lại đóng vai trò như trình xử lý cho các sự kiện khác nhau. Để tìm hiểu những sự kiện nào bạn có thể xử lý cho một lớp nhất định, hãy mở tài liệu API tích hợp sẵn, tìm kiếm lớp cần thiết và điều hướng đến phần Sự kiện trong mục lục.

Bảng giao dịch

Bảng giao dịch hiển thị các điều khiển tùy chỉnh kích hoạt các hành động khác nhau khi tương tác. Chúng thường cung cấp các cải tiến chất lượng cuộc sống cho giao diện người dùng cTrader mặc định. Ví dụ, một cBot có thể hiển thị nút Mua mà khi được nhấp vào, sẽ thực hiện một lệnh thị trường cho một khối lượng được xác định trước trong cTrader.

Để tạo một cBot như vậy, chỉ cần sử dụng mã bên dưới.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using cAlgo.API;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicPanelBot : Robot
    {

        Button buttonBuyOrder;

        protected override void OnStart()
        {

            buttonBuyOrder = new Button
            {
                Text = "Buy",
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
            };

            buttonBuyOrder.Click += ButtonBuyOrder_Click;

            Chart.AddControl(buttonBuyOrder);
        }

        private void ButtonBuyOrder_Click(ButtonClickEventArgs args) 
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicPanelBot():
    def on_start(self):
        self.buttonBuyOrder = Button()
        self.buttonBuyOrder.Text = "Buy"
        self.buttonBuyOrder.HorizontalAlignment = HorizontalAlignment.Center
        self.buttonBuyOrder.VerticalAlignment = VerticalAlignment.Center
        self.buttonBuyOrder.Click += self.button_buy_order_click
        api.Chart.AddControl(self.buttonBuyOrder)

    def button_buy_order_click(self, args):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 10000)

Khi nhấp vào nút Mua, một lệnh thị trường mới cho 10.000 đơn vị sẽ được đặt. Vị trí thuận tiện của nút cho phép phản ứng nhanh chóng với các cơ hội thị trường mới.

Kết hợp bảng giao dịch với các loại cBot khác

Bảng giao dịch cung cấp các điều khiển giao diện người dùng tùy chỉnh cho phép bạn thực hiện các thao tác khác nhau. Bạn có thể sử dụng chúng cùng với các loại cBot khác. Ví dụ, một bảng giao dịch có thể bao gồm nút Phòng ngừa rủi ro tùy chỉnh mà khi được nhấp vào, sẽ phòng ngừa rủi ro cho tất cả các vị thế đang mở, tương tự như ví dụ về trợ lý giao dịch ở trên.

Tổng quan

Cả bốn loại cBot đều có công dụng hợp lệ và có thể được kết hợp tùy theo sở thích của bạn. Ví dụ, bạn có thể đồng thời khởi chạy một chiến lược giao dịch tự động và một trợ lý giao dịch để đạt được kết quả tốt nhất có thể. Bạn có thể thử nghiệm với các cBot thuộc nhiều loại khác nhau để đảm bảo rằng phương pháp giao dịch ưa thích của bạn được thực hiện đầy đủ và không có lỗi.

Image title