Trang chủ Kiến thức OrderSend() trong MQL5: Gửi Lệnh Trading
Knowledge

OrderSend() trong MQL5: Gửi Lệnh Trading

14 tháng 11, 2025

Hướng dẫn chi tiết OrderSend() function - send market orders, pending orders, fill modes và error handling.

OrderSend(): Gửi Trading Orders

OrderSend() là function quan trọng nhất để gửi orders (market orders, pending orders) lên server.

Cấu Trúc MqlTradeRequest và MqlTradeResult

// Request structure
MqlTradeRequest request = {};
request.action = TRADE_ACTION_DEAL;        // Market order
request.symbol = _Symbol;                   // Symbol
request.volume = 0.1;                       // Lot size
request.type = ORDER_TYPE_BUY;             // Order type
request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
request.sl = 0;                            // Stop loss
request.tp = 0;                            // Take profit
request.deviation = 10;                    // Max price deviation
request.magic = 12345;                     // Magic number
request.comment = "My EA Order";           // Comment

// Result structure
MqlTradeResult result = {};

// Send order
bool success = OrderSend(request, result);

if(success && result.retcode == TRADE_RETCODE_DONE) {
    Print("✅ Order successful! Ticket: ", result.order);
} else {
    Print("❌ Order failed: ", result.retcode, " - ", result.comment);
}

Open Buy Market Order

bool OpenBuy(double lotSize, double sl, double tp) {
    MqlTradeRequest request = {};
    MqlTradeResult result = {};
    
    double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
    
    request.action = TRADE_ACTION_DEAL;
    request.symbol = _Symbol;
    request.volume = lotSize;
    request.type = ORDER_TYPE_BUY;
    request.price = ask;
    request.sl = (sl > 0) ? ask - sl * point : 0;
    request.tp = (tp > 0) ? ask + tp * point : 0;
    request.deviation = 10;
    request.magic = EA_MAGIC;
    request.comment = "Buy Order";
    
    bool success = OrderSend(request, result);
    
    if(success && result.retcode == TRADE_RETCODE_DONE) {
        Print("✅ Buy order opened: ", result.order);
        return true;
    } else {
        Print("❌ Buy order failed: ", result.retcode);
        return false;
    }
}

Return Codes

void HandleOrderResult(MqlTradeResult &result) {
    switch(result.retcode) {
        case TRADE_RETCODE_DONE:
            Print("✅ Request completed");
            break;
        case TRADE_RETCODE_REQUOTE:
            Print("⚠️ Requote - price changed");
            break;
        case TRADE_RETCODE_REJECT:
            Print("❌ Request rejected");
            break;
        case TRADE_RETCODE_INVALID_PRICE:
            Print("❌ Invalid price");
            break;
        case TRADE_RETCODE_INVALID_STOPS:
            Print("❌ Invalid stop levels");
            break;
        case TRADE_RETCODE_INVALID_VOLUME:
            Print("❌ Invalid volume");
            break;
        case TRADE_RETCODE_NO_MONEY:
            Print("❌ Not enough money");
            break;
        default:
            Print("Error code: ", result.retcode);
    }
}

Best Practices

  • ✅ Check result.retcode sau OrderSend()
  • ✅ Normalize SL/TP với NormalizeDouble()
  • ✅ Validate lot size trước khi send
  • ✅ Use appropriate deviation (10-50)
  • ✅ Add retry logic cho TRADE_RETCODE_REQUOTE