Hướng dẫn chi tiết OrderSend() function - send market orders, pending orders, fill modes và error handling.
OrderSend() là function quan trọng nhất để gửi orders (market orders, pending orders) lên server.
// 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);
}
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;
}
}
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);
}
}