#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); } |