🔥 🎁 QUÀ TẶNG khi đăng ký: Phần mềm DNT SaaS FindMe VPS Guardian 12 tháng (~240 USD) và 24 tháng (~480 USD)
Hướng dẫn tạo cBot đầu tiên: lấy dữ liệu Balance, Equity, Margin… ra ngoài
ĐTĐược viết bởi Đặng Trí Thanhvào ngày 29/08/2026 lúc 10:15| lượt xem
Hướng dẫn29/08/2026 · 12 phút đọc

Hướng dẫn tạo cBot đầu tiên: lấy dữ liệu Balance, Equity, Margin… ra ngoài

Chủ đề: Lập trình cBot trên cTrader · Trình độ: Người mới bắt đầu · Công cụ: cTrader + Ngôn ngữ C#

Vì sao bạn cần "lấy dữ liệu ra"?

Khi bạn chạy bot giao dịch, điều đầu tiên bạn muốn biết mỗi ngày là: tài khoản đang thế nào? Số dư (Balance), vốn thực (Equity), ký quỹ đang dùng (Margin), ký quỹ khả dụng (Free Margin), lời/lỗ đang chạy (Net Profit), số lệnh đang mở (Positions Count)... Tất cả những con số này nằm sâu bên trong cTrader, và nếu bạn cứ mở màn hình nhìn mỗi giờ thì vừa mất thời gian vừa không tự động hóa được.

Giải pháp là viết một cBot — một chương trình robot chạy ngay bên trong cTrader, có quyền đọc toàn bộ dữ liệu tài khoản. cBot có thể:

  • In các con số ra màn hình log để bạn xem.
  • Ghi ra file CSV/Excel để mở bằng Excel, Google Sheets, hoặc đưa vào bảng điều khiển (dashboard) riêng.
  • Gửi cảnh báo lên Telegram, Zalo hay email khi equity tụt xuống dưới mức bạn đặt.
  • Tự đóng lệnh, điều chỉnh rủi ro theo đúng ngưỡng bạn lập trình.

Bài viết này hướng dẫn bạn từ con số 0: tạo cBot đầu tiên, đọc toàn bộ dữ liệu tài khoản (Balance, Equity, Margin, Free Margin, Margin Level, Leverage, Net Profit...), in ra màn hình và ghi ra file CSV để dùng ngoài.

cTrader và cBot là gì?

cTrader là nền tảng giao dịch hiện đại (của hãng Spotware), được nhiều broker sử dụng, nổi tiếng vì giao diện sạch, tốc độ nhanh và hệ sinh thái tự động hóa mạnh mẽ. Khác với MetaTrader dùng MQL4/MQL5, cTrader cho phép bạn lập trình bot bằng C# — một trong những ngôn ngữ lập trình phổ biến nhất thế giới, dễ học, dễ đọc.

cBot là tên gọi chương trình robot giao dịch chạy trong cTrader. Bạn viết mã C#, biên dịch ngay trong cTrader (không cần cài Visual Studio), rồi gắn cBot vào một biểu đồ. Từ đó cBot tự chạy: đọc dữ liệu, ra lệnh, quản lý vị thế theo đúng luật bạn lập trình.

Điểm mạnh lớn nhất của cBot so với việc "nhìn màn hình thủ công": mọi thứ đều là dữ liệu. Bạn có quyền truy cập đầy đủ vào tài khoản (Account), biểu đồ (Bars), giá (Bid/Ask), vị thế (Positions), lệnh chờ (Orders) — và bạn có thể làm bất cứ điều gì với chúng: tính toán, lưu trữ, gửi đi nơi khác.

Chuẩn bị môi trường

Trước khi viết code, bạn cần:

  1. Tải cTrader — vào trang chủ của broker bạn dùng, tìm phần "cTrader Platform", tải bản Desktop (Windows). Cài đặt xong, đăng nhập.
  2. Tạo tài khoản demo — trong cTrader, chọn tab Accounts, bấm + để tạo tài khoản Demo (không cần nạp tiền). Nên chọn loại tài khoản có cặp tiền bạn quen thuộc, ví dụ EURUSD, XAUUSD, BTCUSD. Tài khoản demo cho phép bạn thử thoải mái, không sợ mất tiền thật.
  3. Mở khu vực lập trình — trên thanh công cụ, bấm biểu tượng Automation (hình cờ-lê / bánh răng), chọn Algorithm Lab. Đây chính là IDE (môi trường lập trình) tích hợp của cTrader. Tại đây bạn thấy tab cBots, cAlgos, Indicators, Symbols... Chúng ta làm việc chủ yếu trong tab cBots.
Mẹo: Nếu broker của bạn không có cTrader, bạn có thể dùng tài khoản demo của các broker hỗ trợ cTrader như IC Markets, FxPro, Pepperstone... Bản chất cBot giống nhau trên mọi broker.

Tạo cBot đầu tiên bằng Algo Wizard

Trong Algorithm Lab, bấm + ở tab cBots → chọn New cBot. Một cửa sổ Algo Wizard hiện ra, giúp tạo khung code nhanh:

  • Name: đặt tên, ví dụ AccountDataBot.
  • Description: ghi chú ngắn, ví dụ "Bot đọc dữ liệu tài khoản và ghi file CSV".
  • Basic Setup: chọn Source: Generate. cTrader sẽ sinh ra sẵn một cBot mẫu với các hàm chính.

Bấm Next qua các bước (Timeframes, Symbols... bạn có thể bỏ qua, dùng mặc định), rồi bấm Finish. cTrader tạo ra file AccountDataBot.cs chứa code mẫu — đây chính là bộ khung bạn sẽ sửa.

Đọc hiểu bộ khung cBot mẫu

Khi mới tạo, cBot mẫu trông giống thế này:

using System;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Requests;
using cAlgo.API.Certificates;
using cAlgo.API.Collections;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class AccountDataBot : Robot
    {
        protected override void OnStart()
        {
            // Chạy một lần khi cBot được gắn vào biểu đồ
            Print("cBot đã khởi động!");
        }

        protected override void OnTick()
        {
            // Chạy mỗi khi giá có tick mới (mỗi thay đổi giá)
        }

        protected override void OnStop()
        {
            // Chạy một lần khi cBot bị dừng / gỡ khỏi biểu đồ
            Print("cBot đã dừng.");
        }
    }
}

Giải thích 3 hàm quan trọng nhất:

  • `OnStart()` — chạy một lần duy nhất khi bạn gắn cBot vào biểu đồ. Đây là nơi lý tưởng để khởi tạo, đọc dữ liệu tài khoản lần đầu, mở file ghi dữ liệu.
  • `OnTick()` — chạy mỗi khi giá thay đổi (có tick mới). Đây là nơi bạn kiểm tra điều kiện liên tục: equity còn bao nhiêu, có nên đóng lệnh không...
  • `OnStop()` — chạy một lần khi cBot bị dừng hoặc bạn gỡ khỏi biểu đồ. Nơi lý tưởng để đóng file, dọn dẹp.

`Print()` — in một dòng text ra tab Log của cTrader. Đây là "màn hình in" của cBot, nơi bạn nhìn thấy mọi thứ cBot in ra.

Lấy dữ liệu tài khoản: Balance, Equity, Margin và họ hàng

Trong cTrader, mọi thông tin tài khoản nằm ở đối tượng `Account`. Bạn chỉ cần gõ Account. và cTrader tự động gợi ý danh sách thuộc tính. Các thuộc tính quan trọng nhất:

Thuộc tínhÝ nghĩa
Account.BalanceSố dư tài khoản (không tính lời/lỗ đang chạy)
Account.EquityVốn thực = Balance + lời/lỗ đang chạy (bao gồm lệnh mở)
Account.MarginKý quỹ đang bị "khóa" bởi các lệnh đang mở
Account.FreeMarginKý quỹ khả dụng còn lại = Equity − Margin
Account.MarginLevelMức ký quỹ (%) = Equity / Margin × 100
Account.LeverageĐòn bẩy tài khoản, ví dụ 100 nghĩa là 1:100
Account.CurrencyĐơn vị tiền tệ, ví dụ "USD"
Account.NumberSố tài khoản
Account.NetProfitLời/lỗ ròng (bao gồm cả lệnh đang mở và đã đóng)
Account.PositionsCountSố vị thế đang mở
Account.PendingOrdersCountSố lệnh chờ (limit/stop)
Account.StopOutLevelMức Stop Out của tài khoản
Account.IsLiveTrue nếu là tài khoản thật, False nếu demo

Để in toàn bộ ra màn hình, bạn viết trong OnStart():

protected override void OnStart()
{
    Print("=== DỮ LIỆU TÀI KHOẢN ===");
    Print("Account Number : " + Account.Number);
    Print("Balance        : " + Account.Balance + " " + Account.Currency);
    Print("Equity         : " + Account.Equity + " " + Account.Currency);
    Print("Margin         : " + Account.Margin + " " + Account.Currency);
    Print("Free Margin    : " + Account.FreeMargin + " " + Account.Currency);
    Print("Margin Level   : " + Account.MarginLevel.ToString("0.00") + " %");
    Print("Leverage       : 1:" + Account.Leverage);
    Print("Net Profit     : " + Account.NetProfit + " " + Account.Currency);
    Print("Positions      : " + Account.PositionsCount);
    Print("Pending Orders : " + Account.PendingOrdersCount);
    Print("Stop Out Level : " + Account.StopOutLevel + " %");
    Print("Loại tài khoản : " + (Account.IsLive ? "Real (thật)" : "Demo"));
}

Lưu ý định dạng số: Account.Balance trả về kiểu double. Khi in ra, cTrader dùng dấu chấm làm phân cách thập phân. Nếu muốn làm tròn đẹp, bạn dùng .ToString("0.00") hoặc .ToString("N2").

Lấy dữ liệu Symbol và giá (Bid, Ask, nến)

Ngoài tài khoản, cBot còn đọc được giá và nến của biểu đồ mà nó được gắn vào. Ba đối tượng hay dùng:

  • `Symbol` — cặp tiền / tài sản đang mở trên biểu đồ. Ví dụ: Symbol.Name, Symbol.Bid, Symbol.Ask, Symbol.Digits, Symbol.PipSize.
  • `Bars` — danh sách nến của biểu đồ. Ví dụ: Bars.Count, Bars.LastBar.Close, Bars.LastBar.High, Bars.LastBar.Low.
  • `Server` — thông tin máy chủ, giờ server.

Để đọc giá hiện tại và cây nến gần nhất:

protected override void OnTick()
{
    // Giá hiện tại
    Print("Bid = " + Symbol.Bid);
    Print("Ask = " + Symbol.Ask);
    Print("Spread = " + (Symbol.Ask - Symbol.Bid));

    // Nến gần nhất (đã đóng hoặc đang hình thành)
    Print("Close = " + Bars.LastBar.Close);
    Print("High  = " + Bars.LastBar.High);
    Print("Low   = " + Bars.LastBar.Low);

    // Lấy nến đóng trước đó (chỉ số 0 là nến hiện tại, 1 là nến đã đóng)
    Print("Nến đóng trước: Close = " + Bars[Bars.Count - 2].Close);
}

Mẹo quan trọng về `OnTick`: hàm này chạy rất nhiều lần (mỗi tick giá). Nếu bạn Print trong OnTick, màn hình log sẽ "loạn" vì quá nhiều dòng. Tốt nhất:

  • In dữ liệu tài khoản một lần trong OnStart.
  • Trong OnTick, chỉ in khi có thay đổi đáng chú ý, hoặc chỉ ghi file.
  • Nếu muốn xử lý mỗi nến mới (không phải mỗi tick), dùng OnBar() hoặc kiểm tra số nến:
private int lastBarCount;
protected override void OnBar()
{
    // Chạy khi có nến mới hoàn thành — ít bị "loạn" hơn OnTick
    Print("Nến mới: Close = " + Bars.LastBar.Close);
    Print("Equity hiện tại: " + Account.Equity);
}

OnBar() là lựa chọn thông minh khi bạn muốn theo dõi theo từng nến thay vì từng tick, giảm tải rất nhiều.

Lấy dữ liệu vị thế (Positions)

Nếu bạn đang có lệnh mở, cBot đọc được từng vị thế qua bộ sưu tập `Positions`:

protected override void OnStart()
{
    Print("Tổng số vị thế: " + Positions.Count);
    foreach (var position in Positions)
    {
        Print("Vị thế: " + position.TradeType + " " + position.SymbolName);
        Print("  Khối lượng : " + position.Volume);
        Print("  Giá mở    : " + position.EntryPrice);
        Print("  Giá hiện tại: " + position.StopLoss + " / " + position.TakeProfit);
        Print("  Lời/lỗ    : " + position.NetProfit + " " + position.Account.Currency);
        Print("  Pips       : " + position.Pips);
    }
}

Một số thuộc tính hữu ích của Position: TradeType (Buy/Sell), SymbolName, Volume, EntryPrice, StopLoss, TakeProfit, NetProfit, GrossProfit, Pips, Id.

Với dữ liệu vị thế, bạn có thể viết bot tự đóng lệnh khi lỗ vượt ngưỡng, hay chốt lời từng phần — đó là nền tảng của mọi chiến lược quản lý rủi ro.

Lấy dữ liệu từ nhiều Symbol cùng lúc

Một cBot không chỉ đọc được biểu đồ mà nó đang gắn vào — nó có thể lấy dữ liệu của bất kỳ tài sản nào mà broker cung cấp, thông qua Symbols.GetSymbol("TÊN"). Điều này rất hữu ích khi bạn muốn theo dõi cùng lúc nhiều cặp tiền: EURUSD, XAUUSD, BTCUSD... chỉ với một cBot duy nhất:

protected override void OnStart()
{
    // Lấy đối tượng Symbol không nằm trên biểu đồ hiện tại
    var gold = Symbols.GetSymbol("XAUUSD");
    var btc  = Symbols.GetSymbol("BTCUSD");

    if (gold != null)
        Print("Vàng (XAUUSD) Bid = " + gold.Bid + ", Ask = " + gold.Ask);
    if (btc != null)
        Print("Bitcoin (BTCUSD) Bid = " + btc.Bid + ", Ask = " + btc.Ask);
}

Mẹo hay: kết hợp đọc nhiều symbol với ghi file CSV, bạn có thể tạo một "bảng tổng quan thị trường" tự cập nhật — mỗi dòng là một tài sản kèm giá và thay đổi. Đây là kỹ thuật nền tảng để xây dashboard theo dõi danh mục sau này.

Ghi dữ liệu ra file CSV

In ra màn hình chỉ để xem trực tiếp. Muốn lưu trữ và phân tích sau, bạn ghi ra file. cBot có thể ghi file bằng thư viện chuẩn của C# (System.IO). Ví dụ đơn giản nhất — ghi dòng đầu tiên vào file account_data.csv trong thư mục Documents:

using System;
using System.IO;

// Trong OnStart:
var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var filePath = Path.Combine(folder, "account_data.csv");

var header = "Time,Account,Balance,Equity,Margin,FreeMargin,MarginLevel,NetProfit,Positions";
File.WriteAllText(filePath, header + Environment.NewLine);
Print("Đã tạo file: " + filePath);

Để ghi dữ liệu mỗi lần có nến mới (append thêm dòng, không ghi đè):

protected override void OnBar()
{
    var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    var filePath = Path.Combine(folder, "account_data.csv");

    var line = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8}",
        Server.Time.ToString("yyyy-MM-dd HH:mm:ss"),
        Account.Number,
        Account.Balance,
        Account.Equity,
        Account.Margin,
        Account.FreeMargin,
        Account.MarginLevel,
        Account.NetProfit,
        Account.PositionsCount);

    File.AppendAllText(filePath, line + Environment.NewLine);
    Print("Đã ghi dữ liệu vào file CSV.");
}

Sau khi chạy một lúc, bạn mở file account_data.csv bằng Excel hoặc Google Sheets — bạn sẽ thấy một bảng dữ liệu lịch sử đầy đủ: từng thời điểm, balance, equity, margin... Từ bảng này, bạn vẽ biểu đồ vốn (equity curve), tính drawdown, đánh giá hiệu suất bot.

Tổng kết cuối ngày vào một file riêng

Ngoài file chi tiết theo từng nến, bạn có thể ghi một bản tổng kết cuối ngày (daily summary) — chỉ một dòng mỗi ngày, rất dễ nhìn biến động vốn theo ngày:

protected override void OnBar()
{
    // Chỉ làm khi nến mới bắt đầu ngày mới (giả định timeframe Daily)
    if (Server.Time.Hour == 0 && Server.Time.Minute == 0)
    {
        var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        var filePath = Path.Combine(folder, "daily_summary.csv");
        if (!File.Exists(filePath))
            File.WriteAllText(filePath, "Date,Balance,Equity,NetProfit,Positions" + Environment.NewLine);

        var line = string.Format("{0},{1},{2},{3},{4}",
            Server.Time.ToString("yyyy-MM-dd"),
            Account.Balance, Account.Equity, Account.NetProfit, Account.PositionsCount);
        File.AppendAllText(filePath, line + Environment.NewLine);
        Print("Đã ghi tổng kết ngày.");
    }
}

Với file tổng kết ngày, bạn mở Excel và vẽ đường equity curve theo ngày — nhìn một cái là biết bot đang đi lên hay đi xuống, drawdown lớn nhất là bao nhiêu. Đây chính là cách trader chuyên nghiệp đánh giá hiệu suất, thay vì nhìn cảm tính.

Lưu ý bảo mật: File được ghi vào thư mục Documents của máy chạy cTrader. Nếu bạn chạy cBot trên VPS, file sẽ nằm trên VPS. Nếu muốn gom dữ liệu về một nơi, hãy đẩy dữ liệu qua API (Telegram, webhook) thay vì chỉ ghi file cục bộ.

Gửi dữ liệu ra ngoài qua Telegram

Việc "lấy dữ liệu ra" sẽ hữu ích hơn nhiều nếu bạn nhận được thông báo chủ động, thay vì phải mở file xem. Cách phổ biến nhất hiện nay: gửi qua Telegram Bot API — miễn phí, gửi được về điện thoại, không cần server riêng.

Bạn cần 2 thứ: Bot Token (tạo qua @BotFather trên Telegram) và Chat ID (ID hội thoại với bot). Sau đó gửi HTTP request từ cBot:

using System;
using System.Net.Http;

private readonly HttpClient _http = new HttpClient();

// Trong OnStart:
var botToken = "123456789:AA...token_cua_ban";
var chatId = "123456789";

protected override void OnBar()
{
    var msg = string.Format(
        "📊 {0}\nBalance: {1} {5}\nEquity: {2} {5}\nMargin: {3} {5}\nPositions: {4}",
        Server.Time, Account.Balance, Account.Equity, Account.Margin, Account.PositionsCount, Account.Currency);

    try
    {
        var url = "https://api.telegram.org/bot" + botToken + "/sendMessage?chat_id=" + chatId + "&text=" + Uri.EscapeDataString(msg);
        _http.GetAsync(url);
        Print("Đã gửi thông báo Telegram.");
    }
    catch (Exception ex)
    {
        Print("Lỗi gửi Telegram: " + ex.Message);
    }
}
Ghi chú về AccessRights: Để cBot được phép gọi mạng (HTTP), bạn phải đặt AccessRights thành AccessRights.FullAccess ngay dòng khai báo lớp: [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]. Nếu không, cBot sẽ bị chặn gọi mạng. Đây là lỗi cực kỳ hay gặp khi mới học.

Xuất dữ liệu qua Webhook / Google Sheets

Nếu bạn muốn dữ liệu về một bảng tính Google Sheets hoặc một server riêng (để gom nhiều bot về một chỗ), bạn dùng kỹ thuật Webhook: cBot gửi một HTTP POST đến một URL, và phía nhận sẽ xử lý. Ví dụ gửi JSON đến một webhook bất kỳ:

using System;
using System.Net.Http;
using System.Text;

private readonly HttpClient _http = new HttpClient();

protected override void OnBar()
{
    var payload = string.Format(
        "{{\"time\":\"{0}\",\"balance\":{1},\"equity\":{2},\"margin\":{3},\"positions\":{4}}}",
        Server.Time.ToString("yyyy-MM-dd HH:mm:ss"),
        Account.Balance, Account.Equity, Account.Margin, Account.PositionsCount);

    var content = new StringContent(payload, Encoding.UTF8, "application/json");
    try
    {
        _http.PostAsync("https://webhook.site/ma-webhook-cua-ban", content);
        Print("Đã gửi dữ liệu qua webhook.");
    }
    catch (Exception ex)
    {
        Print("Lỗi webhook: " + ex.Message);
    }
}

Từ webhook, bạn có thể nối với Google Sheets (dùng Apps Script) hoặc Telegram Bot để nhận dữ liệu từ nhiều bot, nhiều tài khoản về một nơi duy nhất. Đây chính là hạ tầng để xây "bảng điều khiển trung tâm" cho cả đội ngũ giao dịch.

Kết hợp với ghi file CSV + báo Telegram, bạn đã có một hệ thống "đọc dữ liệu ra" hoàn chỉnh: dữ liệu lưu lịch sử trong file, cảnh báo tức thời trên điện thoại, và đẩy về dashboard tập trung.

Chạy thử và kiểm tra

Sau khi viết code, quy trình chạy thử như sau:

  1. Bấm Compile (hoặc Build) trong Algorithm Lab để kiểm tra lỗi cú pháp. Nếu có lỗi, cTrader chỉ rõ dòng lỗi, bạn sửa lại.
  2. Gắn cBot lên biểu đồ: mở biểu đồ EURUSD (hoặc tài sản bất kỳ), bấm Add cBot, chọn AccountDataBot, cấu hình tham số (nếu có), bấm OK.
  3. Mở tab Log (hoặc Show Log) trong cTrader để xem các dòng Print. Bạn sẽ thấy toàn bộ dữ liệu tài khoản hiện ra.
  4. Mở file CSV trong Documents để kiểm tra dữ liệu đã được ghi.
  5. Để dừng: bấm chuột phải lên cBot trên biểu đồ → Remove (hoặc tắt nút Start).

Cách kiểm tra nhanh: mở một lệnh nhỏ bằng tay, rồi để cBot chạy — bạn sẽ thấy PositionsCount, Margin, Equity thay đổi đúng theo lệnh. Đây là cách tốt nhất để chắc chắn cBot đọc đúng dữ liệu.

Nâng cao: bot cảnh báo khi Equity tụt

Giờ bạn đã biết đọc dữ liệu, hãy làm một thứ thực tế: cBot cảnh báo khi equity tụt quá X% so với đỉnh. Đây là nền tảng của mọi hệ thống bảo vệ vốn:

[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
public class EquityGuardBot : Robot
{
    private double _maxEquity;

    protected override void OnStart()
    {
        _maxEquity = Account.Equity;
        Print("Equity Guard khởi động. Equity ban đầu: " + _maxEquity);
    }

    protected override void OnTick()
    {
        // Cập nhật đỉnh equity
        if (Account.Equity > _maxEquity)
            _maxEquity = Account.Equity;

        // Nếu tụt hơn 5% so với đỉnh -> cảnh báo
        double drawdownPct = (_maxEquity - Account.Equity) / _maxEquity * 100;
        if (drawdownPct >= 5)
        {
            Print("⚠️ CẢNH BÁO: Equity tụt " + drawdownPct.ToString("0.00") + "% kể từ đỉnh!");
            // Gửi Telegram ở đây...
            _maxEquity = Account.Equity; // reset để tránh spam
        }
    }
}

Từ ví dụ này, bạn có thể mở rộng: đóng toàn bộ lệnh khi drawdown vượt ngưỡng, giảm khối lượng khi thua liên tiếp, dừng bot vào giờ tin tức...

Câu hỏi thường gặp

cBot có chạy được trên điện thoại không?

Không. cBot chạy trong bản Desktop của cTrader (Windows/Mac). Muốn bot chạy 24/7, bạn phải để máy luôn bật hoặc chạy trên VPS — một máy chủ ảo chạy Windows, bật liên tục. Nhiều người mới mắc sai lầm tắt máy tính vào ban đêm và bot "chết" âm thầm.

Tôi không biết lập trình, học C# có khó không?

Không quá khó cho mục tiêu này. Bạn chỉ cần biết: biến, kiểu dữ liệu, điều kiện if, vòng lặp for/foreach, và vài hàm đọc dữ liệu của cTrader. Bài viết này đã đưa bạn đi qua hết những khái niệm đó bằng ví dụ thực tế.

Dữ liệu `Account.Balance` và `Account.Equity` khác nhau thế nào?

Balance là số dư — không tính lời/lỗ của lệnh đang mở. Equity = Balance + lời/lỗ đang chạy. Vì vậy khi đang có lệnh lời, Equity > Balance; khi lệnh lỗ, Equity < Balance. Khi đóng toàn bộ lệnh, hai số này bằng nhau.

Margin Level bao nhiêu là nguy hiểm?

Thông thường khi Margin Level dưới 100%, tài khoản không mở được lệnh mới. Khi chạm mức Stop Out (ví dụ 50%), broker tự đóng lệnh để bảo vệ. Viết cBot đọc Account.MarginLevel là cách tốt nhất để tự động cảnh báo trước khi chạm vùng nguy hiểm.

File CSV ghi ở đâu?

Mặc định trong thư mục Documents của người dùng Windows chạy cTrader (thường là C:\Users\Tên\Documents). Nếu chạy trên VPS, file nằm trên VPS đó.

Có an toàn khi chạy bot trên tài khoản thật không?

Bot chỉ làm đúng lệnh bạn lập trình, nhưng rủi ro vẫn đến từ chiến lược. Luôn test kỹ trên tài khoản demo, kiểm soát drawdown, và chỉ vào tiền thật khi bạn tin vào chiến lược.

Những lỗi thường gặp và mẹo

  1. Quên `using System;` hoặc `using System.IO;` — khi dùng File, Path, Environment, báo lỗi "tên không tồn tại". Chỉ cần thêm dòng using ở đầu file.
  2. Quên `AccessRights.FullAccess` khi gọi mạng (Telegram, webhook) — lỗi bị chặn mạng. Đặt trong dòng khai báo lớp.
  3. In quá nhiều trong `OnTick` — log "loạn", khó đọc. Ưu tiên OnBar() hoặc in theo điều kiện.
  4. Ghi file ghi đè thay vì append — dùng File.AppendAllText thay vì File.WriteAllText nếu muốn giữ lịch sử.
  5. Không kiểm tra `Bars.Count` — nếu biểu đồ chưa có đủ nến, truy cập Bars[Bars.Count - 2] có thể lỗi. Luôn kiểm tra Bars.Count > 1.
  6. Định dạng số thập phân — dùng .ToString("0.00") hoặc .ToString("N2") để làm tròn đẹp khi in/ghi file.
  7. Chạy thử trên tài khoản demo — không bao giờ gắn bot mới viết lên tài khoản thật ngay lập tức.

Kết luận

Chỉ với khoảng 20 dòng code C#, bạn đã có một cBot hoàn chỉnh đọc được toàn bộ dữ liệu tài khoản — Balance, Equity, Margin, Free Margin, Margin Level, Leverage, Net Profit, Positions — in ra màn hình, ghi ra file CSV và gửi cảnh báo Telegram. Đây chính là bước đầu tiên và quan trọng nhất trên con đường tự động hóa giao dịch:

  • Hiểu rõ tài khoản đang thế nào (dữ liệu ra).
  • Tự động cảnh báo khi có rủi ro (chủ động, không phải nhìn màn hình).
  • Lưu lịch sử để phân tích, tối ưu chiến lược.

Từ bài cơ bản này, bạn có thể đi tiếp: đọc dữ liệu để tự quản lý vốn, đóng lệnh khi thua, xây dashboard theo dõi bot từ xa, hay kết nối với hệ thống giám sát VPS để biết bot "còn sống" hay không. Nếu bạn muốn bot chạy 24/7 trên VPS và được giám sát tự động, hãy tìm hiểu thêm các giải pháp quản lý VPS — vì một bot giỏi mà máy "chết lúc 3h sáng" thì cũng chẳng để làm gì.

Lời khuyên cuối: hãy mở cTrader ngay bây giờ, tạo tài khoản demo, và gắn cBot AccountDataBot lên biểu đồ. Nhìn thấy số liệu của chính mình hiện ra trên màn hình là khoảnh khắc bạn chính thức bước chân vào thế giới lập trình bot giao dịch. Chúc bạn thành công!

Đọc xong rồi? Hãy thử ngay — miễn phí 7 ngày.