Preguntas de OrderSend()

 

El primer día del Campeonato ha demostrado que mi Asesor Experto no funciona como se pretende, es decir, en lugar de una sola orden pendiente coloca varias órdenes pendientes unidireccionales. Se trata aproximadamente de la siguiente estructura:

bool flag_order=false;
...
if(OrderSend(request,result)) flag_order=true;  //из блока обработки (модификации) имеющихся отложенных ордеров
...
if(flag_order==false)                            //из блока выставления отложенных ордеров
  {
   ...
   OrderSend(request,result);
  }                                           
Pregunta: ¿El terminal espera a que la función OrderSend() del primer bloque termine de procesar [es decir, espera a que se reciba la solicitud], o pasa inmediatamente al siguiente operador (bloque) después de enviar una solicitud de operación al servidor?
 

Por supuesto, comprobaremos su caso.

Pero en general la función OrderSend funciona según la ayuda.

Возвращаемое значение

En caso de que lacomprobación básica de las estructuras (comprobación de punteros) tenga éxito, devuelve true - no indica la ejecución exitosa de la operación comercial. Para obtener una descripción más detallada del resultado de la función, debemos analizar los campos de la estructura delresultado.

Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговые функции / OrderSend - Документация по MQL5
 
alexvd:

Por supuesto, comprobaremos su caso.

Pero en general, la función OrderSend funciona según la ayuda.

No, no me quejo, sólo quiero entender. Tal vez metí la pata en otra parte... También analicé los campos de la estructura de resultados donde creía que debían estar [como me enseñaron :)].

Pero según entiendo, al menos se supone que la transición al siguiente operador debe hacerse sólo después de que el terminal maneje completamente la función OrderSend() [incluyendo la obtención y manejo de los campos de la estructura de resultados]?

(Perdón, en la pregunta anterior cometí un error tipográfico: especifiqué solicitud en lugar de resultado)

 
Yedelkin:

El primer día del Campeonato ha demostrado que mi Asesor Experto no funciona como se pretende, es decir, en lugar de una sola orden pendiente coloca varias órdenes pendientes unidireccionales. Esta es aproximadamente la misma estructura:

Pregunta: ¿El terminal espera a que la función OrderSend() del primer bloque termine de procesar [es decir, espera a que se reciba la solicitud], o pasa inmediatamente al siguiente operador (bloque) tras enviar una solicitud de operación al servidor?

Confirmo el problema. Después de establecer el OrderSend() de una orden pendiente, OrdersTotal no siempre lo ve.

He establecido una pausa después de OrderSend(). Pero no ayudó al robot en el campeonato de hoy :)

 

Buenas tardes a todos.

Estoy tratando de hacer un programa que simplemente abra una orden de acuerdo al mercado, es decir, envío un Símbolo, Volumen y Tipo de Orden, en un bucle hasta que aparezca una Posición con la dirección deseada.

El registro da

2012.01.09 16:08:42 Operaciones '9066293' : falló la compra instantánea de 1,00 EURUSD a 0,0000 (desviación: 103117312) [Paradas no válidas].

Entonces, si abro en el mercado, ¿por qué tengo que especificar el precio de apertura? No necesito ninguna parada.

Yo abriría por F9.

Por favor, aconséjame en qué he metido la pata o escribe algún código para abrir un pedido.

Estoy llenando la estructura con ese mínimo:

uint zOrderSend (string zSymbol, double zVolume, string zORDER_TYPE)
  {
zSymbol = "EURUSD";
zVolume = 1;
zORDER_TYPE ="Buy";
  Alert ("*****************", zSymbol," ", zVolume," ", zORDER_TYPE);
//--- готовим запрос
   MqlTradeRequest request;
   request.action=TRADE_ACTION_DEAL;
//   request.magic=0;
   request.symbol=zSymbol;
//   request.volume=zVolume;
   request.volume=zVolume;
//   request.price=0;
//   request.sl=0;
//   request.tp=0;
//   request.deviation=SymbolInfoInteger("EURUSD",SYMBOL_SPREAD);                                         // slippage                           
//   request.deviation=50;
//--- сформируем тип ордера
if (zORDER_TYPE == "Buy" ) {request.type =  ORDER_TYPE_BUY ;}    // тип ордера = 0
if (zORDER_TYPE == "Sell") {request.type =  ORDER_TYPE_SELL;}    // тип ордера = 1
Alert ("Тип ордера: request.type = ",request.type);
   request.type_filling = ORDER_FILLING_FOK;
   request.type_time = ORDER_TIME_GTC;
//   request.comment = "";
Toda la prueba del Asesor Experto para abrir una posición está en el archivo.
Archivos adjuntos:
 
awkozlov:

Buenas tardes a todos.

Estoy tratando de hacer un programa que simplemente abra una orden de mercado. Es decir, envío allí un Símbolo, Volumen y Tipo de Orden, en un bucle hasta que aparezca una Posición con la dirección que quiero.

Y algo me da = Invalid Stops, mientras que no necesito ningún Stops para una orden de mercado. No sé en qué me estoy equivocando...

La prueba completa del Asesor Experto para abrir una posición está en el archivo.


Aquí tienes, debería funcionar.

//+------------------------------------------------------------------+
//|                                                         Deal.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

   if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена
     {
      Alert("Купили!");
     }
   else Alert("Не купили....");
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

  }
//+------------------------------------------------------------------+
uint zOrderSend(string zSymbol,double zVolume,ENUM_ORDER_TYPE zORDER_TYPE)
  {
   MqlTradeRequest      request;
   MqlTradeCheckResult  ch_result;
   MqlTradeResult       result;

// обнулим структуру запроса перед заполнением
   ZeroMemory(request);

   Alert("*****************",zSymbol," ",zVolume," ",zORDER_TYPE);
// заполняем структуру
   request.action=TRADE_ACTION_DEAL;
   request.type_filling=ORDER_FILLING_AON;
   request.symbol=zSymbol;
   request.type=zORDER_TYPE;
   request.deviation=30;
   request.sl=0.0;
   request.tp=0.0;
   request.volume=zVolume;
   if(zORDER_TYPE==ORDER_TYPE_BUY)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   if(zORDER_TYPE==ORDER_TYPE_SELL)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

// выводим на печать заполненную структуру торгового запроса
   Alert("   ENUM_TRADE_REQUEST_ACTIONS    request.action;           // Тип выполняемого действия                                     =",request.action,"=");
   Alert("   ulong                         request.magic;            // Штамп эксперта (идентификатор magic number)                   =", request.magic,         "=" );
   Alert("   ulong                         request.order;            // Тикет ордера                                                  =", request.order,         "=" );
   Alert("   string                        request.symbol;           // Имя торгового инструмента                                     =", request.symbol,        "=" );
   Alert("   double                        request.volume;           // Запрашиваемый объем сделки в лотах                            =", request.volume,        "=" );
   Alert("   double                        request.price;            // Цена                                                          =", request.price,         "=" );
   Alert("   double                        request.stoplimit;        // Уровень StopLimit ордера                                      =", request.stoplimit,     "=" );
   Alert("   double                        request.sl;               // Уровень Stop Loss ордера                                      =", request.sl,            "=" );
   Alert("   double                        request.tp;               // Уровень Take Profit ордера                                    =", request.tp,            "=" );
   Alert("   ulong                         request.deviation;        // Максимально приемлемое отклонение от запрашиваемой цены       =", request.deviation,     "=" );
   Alert("   ENUM_ORDER_TYPE               request.type;             // Тип ордера                                                    =", request.type,          "=" );
   Alert("   ENUM_ORDER_TYPE_FILLING       request.type_filling;     // Тип ордера по исполнению                                      =", request.type_filling,  "=" );
   Alert("   ENUM_ORDER_TYPE_TIME          request.type_time;        // Тип ордера по времени действия                                =", request.type_time,     "=" );
   Alert("   datetime                      request.expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED) =", request.expiration,    "=" );
   Alert("   string                        request.comment;          // Комментарий к ордеру                                          =", request.comment,       "=" );

// отправляем структуру запроса на проверку
   if(OrderCheck(request,ch_result)==false)
     {
      Alert("OrderCheck выявил ошибку: "+IntegerToString(ch_result.retcode)+"/"+ch_result.comment);
      return ch_result.retcode;
     }
// отправляем запрос на торговый сервер
   if(OrderSend(request,result)==false)
     {
      Alert("OrderSend возвратил ошибку: "+IntegerToString(result.retcode)+"/"+result.comment);
      return result.retcode;
     }
// выводим на печать структуру ответа сервера
   Alert("Код результата операции сервера: " + IntegerToString(result.retcode));
   Alert("deal Тикет сделки "                + IntegerToString(result.deal));
   Alert("order Тикет ордера "               + IntegerToString(result.order));
   Alert("volume Объем сделки "              + DoubleToString (result.volume));
   Alert("price Цена в сделке "              + DoubleToString (result.price));
   Alert("bid(цены реквоты) "                + DoubleToString (result.bid));
   Alert("ask(цены реквоты) "                + DoubleToString (result.ask));
   Alert("Комментарий: "+result.comment);

   return result.retcode;
  }
//+------------------------------------------------------------------+
 
sergey1294:

Ahí lo tienes, debería funcionar.


Gracias. Está funcionando. Y tan rápido que no tiene tiempo de actualizar la información de la Posición.

Como resultado, se realizan 2 pedidos.

Se puede arreglar con una pausa de 1 milisegundo.


   if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена
     {
Sleep (1);
       Alert("Купили!");
     }
   else Alert("Не купили....");
  }
 
awkozlov:

... no tiene tiempo para actualizar la información de la posición.

Como resultado, se realizan 2 pedidos.

Esto puede resolverse con una pausa de 1 milisegundo.

Sólo hay que tener en cuenta que la pausa no es una panacea:

 
Yedelkin:

Sólo hay que tener en cuenta que una pausa no es una panacea:

¿La función de comprobación de pedidos de KimV no ayuda?
 
-Alexey-:
¿No ayuda la función de comprobación de pedidos de KimV?
Debo haberme perdido un tema como este. ¿Dónde puedo encontrar información sobre la función de verificación de pedidos de KimV?