#define DEVIATION 5 // desviación permitida del precio
#define VOLUME 1.0 // volumen de la orden
#define EXPERT_MAGIC 123 // MagicNumber
#define DIRECTION ORDER_TYPE_BUY // dirección de la orden abierta (ORDER_TYPE_BUY o ORDER_TYPE_SELL)
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- declaramos e inicializamos la estructura de la consulta, la comprobación y el resultado
MqlTradeRequest request={};
MqlTradeCheckResult check ={};
MqlTradeResult result ={};
//--- preparamos los parámetros de la consulta
PrepareRequest(_Symbol, DIRECTION, VOLUME, request);
//--- preparamos los parámetros de la solicitud comercial
ResetLastError();
bool res=OrderCheck(request, check);
if(!res)
{
PrintFormat("Trade request verification completed with error %d\nServer retcode: %u, comment: %s", GetLastError(), check.retcode, check.comment);
return;
}
//--- la comprobación de la solicitud comercial se ha realizado correctamente, mostramos en el registro la descripción de los campos de la estructura de comprobación de la solicitud comercial
Print("Trade request verification completed successfully");
MqlTradeCheckResultPrint(check, 14);
//--- enviamos la solicitud comercial
if(!OrderSend(request, result))
Print("OrderSend error ", GetLastError()); // si no hemos logrado enviar la solicitud, mostramos el código de error
//--- información sobre la operación
PrintFormat("Trade request result: retcode=%u, deal=%I64u, order=%I64u", result.retcode, result.deal, result.order);
/*
resultado con el trading automático desactivado en el terminal cliente
Trade request verification completed with error 4752
Server retcode: 10027, comment: AutoTrading disabled by client
activamos el trading automático y volvemos a comprobar en el mercado cerrado:
Experts automated trading is enabled
Trade request verification completed successfully
Retcode: 0
Balance: 10779.50 USD
Equity: 10779.50 USD
Profit: 0.00 USD
Margin: 1104.79 USD
Margin free: 9674.71 USD
Margin level: 975.71 %
Comment: Done
OrderSend error 4756
Trade request result: retcode=10018, deal=0, order=0
comprobamos en el mercado abierto:
Trade request verification completed successfully
Retcode: 0
Balance: 10779.50 USD
Equity: 10779.50 USD
Profit: 0.00 USD
Margin: 110.46 USD
Margin free: 10669.04 USD
Margin level: 9758.74 %
Comment: Done
Trade request result: retcode=10009, deal=2777010968, order=2802818813
*/
}
//+------------------------------------------------------------------+
//| Comprobamos los parámetros para la solicitud comercial |
//+------------------------------------------------------------------+
void PrepareRequest(const string symbol, const ENUM_ORDER_TYPE order_type, const double volume, MqlTradeRequest &request)
{
ENUM_ORDER_TYPE type=(DIRECTION !=ORDER_TYPE_BUY ? ORDER_TYPE_SELL : DIRECTION);
double price=(DIRECTION==ORDER_TYPE_BUY ? SymbolInfoDouble(Symbol(), SYMBOL_ASK) : SymbolInfoDouble(Symbol(), SYMBOL_BID));
//--- parámetros de la solicitud
request.action = TRADE_ACTION_DEAL; // tipo de operación comercial
request.symbol = symbol; // símbolo
request.volume = volume; // volumen
request.type = type; // tipo de orden
request.price = price; // precio para la apertura
request.deviation = DEVIATION; // desviación permitida respecto al precio
request.magic = EXPERT_MAGIC; // MagicNumber de la orden
}
//+------------------------------------------------------------------+
//| Imprime en el registro los campos de la estructura |
//| resultado de la comprobación de la solicitud comercial |
//+------------------------------------------------------------------+
void MqlTradeCheckResultPrint(const MqlTradeCheckResult &check, const uint header_width=0)
{
//--- obtenemos la divisa de la cuenta y el número de decimales para la divisa de la cuenta
string currency=AccountInfoString(ACCOUNT_CURRENCY);
int digits =(int)AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS);
//--- definimos el texto del encabezado y la anchura del campo del encabezado
//--- si la anchura del encabezado se ha transmitido a la función como igual a cero, entonces la anchura será el tamaño de la línea del encabezado + 1
string header="Retcode:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- mostramos en el registro el código de retorno con un encabezado de la anchura establecida
PrintFormat("%-*s%-u", w, header, check.retcode);
//--- mostramos en el registro el valor de balance que tendremos tras realizar la operación comercial
header="Balance:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.balance, currency);
//--- mostramos en el registro el valor de fondos propios que tendremos tras realizar la operación comercial
header="Equity:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.equity, currency);
//--- mostramos en el registro el valor de beneficio flotante que tendremos tras realizar la operación comercial
header="Profit:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.profit, currency);
//--- mostramos en el registro el tamaño del margen necesario para la operación comercial requerida
header="Margin:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.margin, currency);
//--- mostramos en el registro la cantidad de fondos propios que quedarán tras realizar la operación comercial
header="Margin free:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.margin_free, currency);
//--- mostramos en el registro el nivel de margen que tendremos tras realizar la operación comercial requerida
header="Margin level:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.2f %%", w, header, check.margin_level);
//--- mostramos en el registro los comentarios al código de respuesta, la descripción del error
header="Comment:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-s", w, header, check.comment);
}
|