Bỏ qua

Các hoạt động giao dịch của cBot

Trong hướng dẫn này, chúng tôi giải thích chi tiết các hoạt động giao dịch chính mà bạn có thể thực hiện bằng cách sử dụng cBot được phát triển thông qua Algo API.

Đây là một số hoạt động được hỗ trợ cho cBot:

  • Gửi lệnh thị trường.
  • Đặt lệnh chờ.
  • Sửa đổi lệnh chờ và vị thế mở.
  • Đóng vị thế và hủy lệnh.
  • Đăng ký các sự kiện giao dịch (vị thế, lệnh và hoạt động liên quan).

Gửi lệnh thị trường

Một lệnh thị trường được gửi đến máy chủ giao dịch khi phương thức ExecuteMarketOrder() được gọi. Sau khi tạo một cBot mới, bạn có thể thêm phương thức này với một số thuộc tính đã định nghĩa của lệnh thị trường (ký hiệu, khối lượng, chốt lời, cắt lỗ, v.v.). Ví dụ dưới đây đặt một lệnh thị trường khi cBot bắt đầu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
        }       
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import clr

clr.AddReference("cAlgo.API")

from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)

Mẹo

Trong ví dụ, một số tham số lệnh cố ý được để trống "". Kiểm tra Tài liệu tham khảo để biết chữ ký và thứ tự của tất cả các tham số ExecuteMarketOrder().

Sau khi xây dựng cBot và thêm một phiên bản, bạn sẽ thấy rằng một lệnh thị trường với các tham số đã chỉ định đã được thực thi khi bắt đầu. Các tab Vị thếNhật ký trong bảng Màn hình theo dõi giao dịch hiển thị các mục vị thế và nhật ký tương ứng.

Positions

Log

Đặt lệnh chờ

cTrader hỗ trợ ba loại lệnh chờ, cụ thể là lệnh dừng, lệnh giới hạn và lệnh dừng-giới hạn. Để đặt lệnh chờ khi bắt đầu, bạn có thể thay thế lệnh thị trường bằng các đoạn mã sau trong ví dụ cBot trước đó.

1
2
3
PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);
1
2
3
api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

Mẹo

Để nhanh chóng kiểm tra các tham số của một phương thức, hãy bắt đầu nhập tên phương thức và một dấu ngoặc đơn mở. Bạn sẽ thấy một cửa sổ pop-up IntelliSense với thông tin bổ sung.

Image title

Mẹo

Nếu bạn nhấp vào một phương thức/tham số trong cTrader Algo và nhấn F1, bảng trợ giúp ở bên phải cửa sổ mã sẽ hiển thị kết quả tìm kiếm phù hợp. Nếu con trỏ văn bản vẫn ở ngoài cửa sổ mã và bạn nhấn F1, cửa sổ Trung tâm trợ giúp sẽ xuất hiện để hỗ trợ bạn.

Bạn sẽ thấy các bản ghi sau trong bảng Màn hình theo dõi giao dịch sau khi xây dựng và chạy cBot thành công.

Orders

Log

Sửa đổi lệnh chờ và vị thế mở

Khi các lệnh chờ được đặt, chúng sẽ có sẵn trong bộ sưu tập PendingOrders của cBot của bạn. Thông qua bộ sưu tập này, bạn có thể truy cập và sửa đổi chúng. Các lệnh chờ hiện có có thể được sửa đổi bằng cách điều chỉnh mức cắt lỗ của chúng như sau.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnStart()
{
    PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);

    foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
    {
        order.ModifyStopLossPips(20);
    }
}     
1
2
3
4
5
6
7
8
def on_start(self):
    api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

    for order in api.PendingOrders:
        if order.SymbolName == api.SymbolName:
            order.ModifyStopLossPips(20)

Tab Nhật ký của bảng Màn hình theo dõi giao dịch hiển thị rằng ba lệnh chờ đã được sửa đổi thành công ngay sau khi được đặt.

Image title

Sau khi các loại lệnh khác nhau được thực hiện thành công, các vị thế sẽ được mở cho tài khoản của bạn. Tất cả các vị thế mở có sẵn trong bộ sưu tập Positions của cBot của bạn. Tương tự như việc chỉnh sửa các lệnh chờ trong ví dụ trước, bạn có thể chỉnh sửa vị thế mở. Vì lệnh thị trường là cách nhanh nhất để mở vị thế, hãy thêm phương thức OnBar() với hành động chỉnh sửa vị thế vào cBot đầu tiên trong hướng dẫn này.

1
2
3
4
5
6
7
protected override void OnBar()
{
    foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
    {
        position.ModifyTakeProfitPips(20);
    }
}
1
2
3
4
def on_bar(self):
    for position in api.Positions:
        if position.SymbolName == api.SymbolName:
            position.ModifyTakeProfitPips(20)

Như được phản ánh trong nhật ký, vị thế mở đã được chỉnh sửa trên nến đầu tiên được mở.

Image title

Đóng vị thế và hủy lệnh

Bạn có thể tìm thấy một ví dụ cBot bên dưới đóng tất cả các vị thế mở và hủy tất cả các lệnh chờ vào thứ Sáu lúc 11:00 (UTC) bằng cách gọi phương thức OnTick().

 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
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
            PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
        }  

        protected override void OnTick()
        {
            if(Server.Time.DayOfWeek == DayOfWeek.Friday && Server.Time.Hour >= 11)
            {
                foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
                {
                    position.Close();    
                }

                foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
                {
                    order.Cancel();
                }
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)
        api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)

    def on_tick(self):
        # Friday == 5 (Sunday=0)
        if api.Server.Time.DayOfWeek == 5 and api.Server.Time.Hour >= 11:
            for position in api.Positions:
                if position.SymbolName == api.SymbolName:
                    position.Close()
            for order in api.PendingOrders:
                if order.SymbolName == api.SymbolName:
                    order.Cancel()

Image title

Đăng ký các sự kiện giao dịch

cTrader cho phép các nhà phát triển thuật toán đăng ký các sự kiện giao dịch và theo dõi hoạt động giao dịch, bất kể chúng được khởi tạo bởi cBot hay thủ công. Điều này đạt được bằng cách lắng nghe các sự kiện có sẵn trong hai bộ sưu tập đã được trình bày trước đó, PositionsPendingOrders.

Có ba sự kiện có sẵn cho các vị thế:

  • Open
  • Modified
  • Closed

Chúng được kích hoạt khi bạn mở, chỉnh sửa và đóng các vị thế trên tài khoản của mình, tương ứng.

Trong đoạn mã dưới đây, ba sự kiện được khai báo trong phương thức OnStart() và các phương thức được gọi được chỉ định. Những điều này sẽ tự động tạo ra các chữ ký mã cho chúng ta sử dụng. Sau đó, các câu lệnh Print() được thêm vào mỗi phương thức sự kiện.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
protected override void OnStart()
{
    Positions.Opened += Positions_Opened;
    Positions.Modified += Positions_Modified;
    Positions.Closed += Positions_Closed;                    
}  

private void Positions_Opened(PositionOpenedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was opened");
}

private void Positions_Modified(PositionModifiedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was modified");
}

private void Positions_Closed(PositionClosedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was closed");
}   
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def on_start(self):
    api.Positions.Opened += self.positions_opened
    api.Positions.Modified += self.positions_modified
    api.Positions.Closed += self.positions_closed

def positions_opened(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was opened")

def positions_modified(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was modified")

def positions_closed(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was closed")

Cho dù là bạn hay cBot thực hiện các sự kiện Open, ModifiedClosed, thuật toán sẽ phản ứng với chúng mỗi lần với các thông báo được in ra như hiển thị trong nhật ký bên dưới.

Image title

Tương tự, bạn có thể đăng ký các sự kiện liên quan đến lệnh chờ. Có bốn sự kiện có sẵn cho lệnh chờ:

  • Created
  • Modified
  • Filled
  • Cancelled

Bốn sự kiện được khai báo trong phương thức OnStart(), và các trình xử lý sự kiện được thêm vào 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
protected override void OnStart()
{
    PendingOrders.Created += PendingOrders_Created;
    PendingOrders.Modified += PendingOrders_Modified;
    PendingOrders.Filled += PendingOrders_Filled;
    PendingOrders.Cancelled += PendingOrders_Cancelled;
}

private void PendingOrders_Created(PendingOrderCreatedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was created");
}

private void PendingOrders_Modified(PendingOrderModifiedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was modified");
}

private void PendingOrders_Filled(PendingOrderFilledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was filled");
}

private void PendingOrders_Cancelled(PendingOrderCancelledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was cancelled");
}       
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def on_start(self):
    api.PendingOrders.Created += self.pending_orders_created
    api.PendingOrders.Modified += self.pending_orders_modified
    api.PendingOrders.Filled += self.pending_orders_filled
    api.PendingOrders.Cancelled += self.pending_orders_cancelled

def pending_orders_created(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was created")

def pending_orders_modified(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was modified")

def pending_orders_filled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was filled")

def pending_orders_cancelled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was cancelled")

Nếu đăng ký các sự kiện liên quan đến lệnh chờ, cBot sẽ phản ứng với cả hoạt động giao dịch thủ công và được lập trình.

Image title

Tổng quan

Để kết luận, cTrader trang bị cho các nhà phát triển thuật toán một kho vũ khí ấn tượng các hoạt động giao dịch có thể được thực hiện bởi cBot. Bằng cách áp dụng chúng một cách khéo léo, bạn có thể theo đuổi các chiến lược giao dịch được điều chỉnh và tinh vi.

Image title