Học lập trình Robot trade Forex với code mẫu

Robot Trade forex này xử dụng chiến lược 2 đường trung bình động MA 20 và MA 24. Chiến lược Mua khi MA20 lên trên MA24 và chiến lược bán khi MA20 dưới MA24 (Lưu ý đây chỉ là ví dụ mẫu không phải chiến lược có thể áp dụng thực tế)


#property copyright "NHỰT PHẠM"
#property link      "https://www.nhutpham.com/"

#include <stdlib.mqh>
#include <WinUser32.mqh>

// các biến
extern int OpenOrdersLimit8 = 1;
extern double BuyLots4 = 0.1;
extern int BuyStoploss4 = 20;
extern int BuyTakeprofit4 = 30;
extern int OpenOrdersLimit9 = 1;
extern double SellLots5 = 0.1;
extern int SellStoploss5 = 20;
extern int SellTakeprofit5 = 30;


// biến cục bộ
double PipValue=1;    // hỗ trợ môi giới 5 chữ số
bool Terminated = false;
string LF = "\n";  // sử dụng trong các khối tùy chỉnh hoặc tiện ích nơi bạn cần nguồn cấp dữ liệu
int NDigits = 4;   // được sử dụng chủ yếu cho NormalizeDouble trong các khối loại Flex
int ObjCount = 0;  // đếm tất cả các đối tượng được tạo trên biểu đồ, cho phép tạo các đối tượng có tên duy nhất
int current = 0;   // chỉ mục thanh hiện tại, được sử dụng bởi Cross Up, Cross Down và nhiều khối khác
int varylots[101]; // được sử dụng bởi Thay đổi đơn đặt hàng mua, Thay đổi đơn đặt hàng bán và tương tự



int init()
{
    NDigits = Digits;
    
    if (false) ObjectsDeleteAll();      // clear the chart
    
    
    Comment("");    // clear the chart
    return (0);
}

// Expert start
int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick1();
    return (0);
}

void OnEveryTick1()
{
    PipValue = 1;
    if (NDigits == 3 || NDigits == 5) PipValue = 10;
    
    TechnicalAnalysis2();
    TechnicalAnalysis3();
    
}

void TechnicalAnalysis2()
{
    if (iMA(NULL, PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE,current) > iMA(NULL, PERIOD_H1,24,0,MODE_SMA,PRICE_CLOSE,current))
    {
        LimitOpenOrders8();
        
    }
}

void LimitOpenOrders8()
{
    int count = 0;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol())
        if (OrderMagicNumber() == 1)
        {
            count++;
        }
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    if (count < OpenOrdersLimit8)
    {
        BuyOrder4();
        
    }
}

void BuyOrder4()
{
    double SL = Ask - BuyStoploss4*PipValue*Point;
    if (BuyStoploss4 == 0) SL = 0;
    double TP = Ask + BuyTakeprofit4*PipValue*Point;
    if (BuyTakeprofit4 == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, BuyLots4, Ask, 4, 0, 0, "My Robot", 1, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, BuyLots4, Ask, 4, SL, TP, "My Robot", 1, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}

void TechnicalAnalysis3()
{
    if (iMA(NULL, PERIOD_H1,20,0,MODE_SMA,PRICE_CLOSE,current) < iMA(NULL, PERIOD_H1,24,0,MODE_SMA,PRICE_CLOSE,current))
    {
        LimitOpenOrders9();
        
    }
}

void LimitOpenOrders9()
{
    int count = 0;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol())
        if (OrderMagicNumber() == 2)
        {
            count++;
        }
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    if (count < OpenOrdersLimit9)
    {
        SellOrder5();
        
    }
}

void SellOrder5()
{
    double SL = Bid + SellStoploss5*PipValue*Point;
    if (SellStoploss5 == 0) SL = 0;
    double TP = Bid - SellTakeprofit5*PipValue*Point;
    if (SellTakeprofit5 == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_SELL, SellLots5, Bid, 4, 0, 0, "My Expert", 2, 0, Red);
    else
    ticket = OrderSend(Symbol(), OP_SELL, SellLots5, Bid, 4, SL, TP, "My Expert", 2, 0, Red);
    if (ticket > -1)
    {
        if (true)
        {
            bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Red);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}



int deinit()
{
    if (false) ObjectsDeleteAll();
    
    
    return (0);
}

Giải thích mã

Mã MQL4 Expert Advisor – Ea trong nền tảng giao dịch MetaTrader 4 (MT4). Dưới đây là phân tích chi tiết về mã này:

Thư viện và Biến: Mã bắt đầu bằng việc nhập các thư viện cần thiết và định nghĩa một số biến. Các biến đó gồm các tham số dùng để cấu hình EA, ví dụ: OpenOrdersLimit8, BuyLots4, BuyStoploss4, BuyTakeprofit4, OpenOrdersLimit9, SellLots5, SellStoploss5, và SellTakeprofit5.

Biến cục bộ: Các biến cục bộ như PipValue, Terminated, LF, NDigits, ObjCount, current, và varylots được khai báo để sử dụng trong toàn bộ mã.

Hàm init(): Hàm init() được gọi khi bạn nạp EA lên biểu đồ. Hàm này đặt giá trị ban đầu cho một số biến và thực hiện một số tác vụ khởi tạo. Tuy nhiên, trong mã này, nó không có nhiệm vụ cụ thể.

Hàm start(): Hàm start() là hàm chính của EA, nó được gọi mỗi khi có sự kiện mới trên thị trường. Trước khi bắt đầu, nó kiểm tra xem có đủ thanh nến trên biểu đồ không (Bars) và nếu không đủ thì hiển thị một thông báo. Nó cũng kiểm tra biến Terminated để xem liệu EA đã bị dừng lại hay chưa, nếu đã dừng thì hiển thị thông báo và thoát. Sau đó, nó gọi hàm OnEveryTick1().

Hàm OnEveryTick1(): Hàm này được gọi trong hàm start() và thực hiện một số công việc cơ bản như đặt giá trị cho biến PipValue dựa trên số chữ số thập phân của cặp tiền tệ (NDigits) và gọi các hàm TechnicalAnalysis2() và TechnicalAnalysis3().

Hàm TechnicalAnalysis2() và LimitOpenOrders8(): Các hàm này có vẻ liên quan đến việc quyết định mở lệnh mua (Buy Order) dựa trên phân tích kỹ thuật. Hàm TechnicalAnalysis2() so sánh hai đường trung bình động (SMA) trên biểu đồ và nếu điều kiện được đáp ứng, nó gọi hàm LimitOpenOrders8(). Hàm LimitOpenOrders8() kiểm tra xem đã có bao nhiêu lệnh mua được mở và nếu chưa đạt đến giới hạn OpenOrdersLimit8, nó gọi hàm BuyOrder4() để mở lệnh mua.

Hàm BuyOrder4(): Hàm này tạo lệnh mua với các tham số như kích thước lệnh (BuyLots4), giá đặt lệnh stop loss và take profit dựa trên BuyStoploss4 và BuyTakeprofit4, và màu sắc của lệnh (Blue). Sau đó, nó thực hiện đặt lệnh và kiểm tra kết quả.

Các hàm tương tự cho việc đặt lệnh bán (Sell Order): Các hàm TechnicalAnalysis3(), LimitOpenOrders9(), và SellOrder5() hoạt động tương tự như các hàm liên quan đến lệnh mua, nhưng cho lệnh bán.

Hàm deinit(): Hàm này được gọi khi EA bị gỡ ra khỏi biểu đồ. Trong trường hợp này, nó cũng không có nhiệm vụ cụ thể.

Bạn có câu hỏi nào khác có thể để lại comment hoặc liên hệ trực tiếp với mình.