Preguntas de OrderSend() - página 3

 
 komposter:

Contabilizar las órdenes en MT5 es toda una ciencia:Manejar los eventos de negociación en el Asesor Experto utilizando la función OnTrade()

Ninguna pausa le salvará de la reapertura, siempre puede ocurrir una situación en la que la orden tardará 1 segundo más en ejecutarse.

ps: Y no te olvides de la magia.

¿El facilitador?

Ninguna cantidad de ciencia te salvará de las maquinaciones de la metanfetamina global

de la metafobia global.

Probando

 
her.human:
Pensar antes de publicar se considera un buen estilo.
 

Por desgracia, MT5 tiene muchas más trampas que MT4.

El problema del retraso en la actualización de los datos tras la ejecución exitosa deOrderSend() se resuelve en la última línea del siguiente ejemplo:

MqlTradeRequest request;
MqlTradeResult result;
...
OrderSend(request,result);
...
Ticket=false;
Error==result.retcode;
if(Error==10008 || Error==10009){Ticket=true;}
...
if(Ticket==true){while(!HistoryDealSelect(result.deal)){RefreshRates();Sleep(1);}}   

Función de actualización:

bool RefreshRates()
  {
   MqlTick tick;
   return(SymbolInfoTick(Symbol(),tick));
  }
 
sergey1294:

Aquí tienes, debería funcionar.


//+------------------------------------------------------------------+
//|                                                         Deal.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://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;
  }
//+------------------------------------------------------------------+

En este gran código - todo funcionó bien,

pero ha habido un cambio en el lenguaje de programación.

mql5 ha sido eliminado.

ORDER_FILLING_AON;

Y ahora la compilación no funciona en este lugar.

¿Puedes decirme cómo rellenar la estructura correctamente ahora?

// заполняем структуру
   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);
 
awkozlov:

En este maravilloso código - todo funcionó bien,

pero hubo un cambio en el lenguaje de programación.

mql5 ha sido eliminado

La respuesta está aquí - https://www.mql5.com/ru/forum/6343/page8#comment_189991. Sí, se les pasó este punto y no lo anunciaron en los anuncios por alguna razón.
 

¡Muchas gracias, Rosh!

Aunque. he cambiado - a "tomar lo que está disponible" ya que tengo un flip agresivo que es poco probable que suceda.

Tengo mucha curiosidad por saber a qué herramientas se referían los desarrolladores con las siglas primarias en ruso o con la transcripción importada.

Sólo por curiosidad, ¿cómo se implicaron verbalmente las 2 variantes?

 
awkozlov:

Sólo por curiosidad, ¿cómo se implicaron verbalmente las 2 opciones?

  • ORDER_FILLING_AON - Una operación sólo puede ser ejecutada en el volumen especificado y a un precio igual o mejor que el especificado en la orden. Si no hay suficiente volumen de ofertas para el símbolo de la orden en el mercado en ese momento, la orden no se ejecutará.
  • ORDER_FILLING_CANCEL - Acuerdo para ejecutar una operación al máximo volumen disponible en el mercado dentro del volumen especificado en la orden, y a un precio igual o mejor que el especificado en la orden. En este caso, no se realizan pedidos adicionales para el volumen que falta.
  •  

    Dado que podemos tener dos políticas de ejecución para una orden de mercado, ORDER_FILLING_FOK y ORDER_FILLING_IOC, ¿cómo es de apropiado rellenar el campo request.type_filling en la solicitud de operación de la siguiente manera?

    request.type_filling=ORDER_FILLING_FOK | ORDER_FILLING_IOC
    El compilador sólo genera la advertencia: conversión implícita de enum. ¿Es suficiente para que la solicitud se procese correctamente independientemente de la política de ejecución establecida por el corredor/agente?
     
    Yedelkin:
    El compilador sólo genera la advertencia: conversión implícita de enum. ¿Es suficiente para que la solicitud se procese correctamente independientemente de la política de ejecución establecida por el corredor/agente?

    Es como "el café negro y la leche": dos políticas mutuamente excluyentes. Aquí hay más enlaces en inglés:

    Fill Or Kill (FOK) Definition | Investopedia
    Fill Or Kill (FOK) Definition | Investopedia
    • www.investopedia.com
    A type of time-in-force designation used in securities trading that instructs a brokerage to execute a transaction immediately and completely or not at all. This type of order is most likely to be used by active traders and is usually for a large quantity of stock. The order must be filled in its entirety or canceled (killed). The purpose of a...
     
    Yedelkin:

    Ya que podemos tener dos políticas de ejecución para una orden de mercado, ORDER_FILLING_FOK y ORDER_FILLING_IOC,

    Esto significa que puede elegir entre las dos opciones.