Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 697

 
yaaarik777:

¡Buenos días a todos! ¿Puede usted por favor aconsejar cómo establecer un borrado de órdenes en un EA?

La situación es la siguiente:

Colocamos 2 órdenes pendientes en diferentes direcciones, en cuanto una de ellas se dispara, la otra se elimina y deja de estar expuesta.

Estaría muy agradecido por cualquier ayuda.

Gracias.

Hay varias formas de hacerlo. Uno de ellos es el uso deOnTradeTransaction.

Al captar la transacción

TRADE_TRANSACTION_DEAL_ADD

Añade la transacción al historial. Realizado como resultado de la ejecución de una orden o de operaciones de saldo de cuenta.

y asegurarse de que esta transacción es una entrada en el mercado:

DEAL_ENTRY_IN

Entrada en el mercado


//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }

Esta operación se llevará a cabo una vez que la orden pendiente se haya activado y la operación se haya introducido en el historial.

Una vez que hayamos capturado esta transacción, sólo tenemos que eliminar todas las órdenes pendientes que nos quedan:

//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }

Código común de EA (sólo aquí he especificado la magia igual a "0" - usted debe establecer su propia magia):

//+------------------------------------------------------------------+
//|                                       There will be only one.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade         m_trade;                      // trading object
COrderInfo     m_order;                      // pending orders object
//---
ulong          m_magic=0;                // magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

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

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }
//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 

Otra pregunta sobre el evento OnDeinit:

este código funcionará:

void OnDeinit(const int reason)

{

if(reason==REASON_REMOVE)

{

código para cerrar la posición(si la hay)

}

}

En general, necesitamos saber si es posible cerrar la posición en el manejo del evento OnDeinit

 

Buenas tardes expertos, por favor compartan sus experiencias.

Hay una matriz de valores, refleja algún objeto/campo, es decir, si hay una tarea para designar este objeto/campo de alguna manera, cuáles son las acciones posibles.

Por ejemplo, ¿sería apropiado poner esta matriz en la red de mapas de Kohonen, si el volumen de la matriz puede alcanzar miles de celdas de x e y?

Tal vez puedas sugerir cómo meter una de las matrices bidimensionales (con gran dimensionalidad) en una red Kohonen.

Y si Kohon es adecuado para el análisis - recursión de arrays (arrays en un array).

O tal vez alguien puede ayudar a poner las preguntas correctas


1 1 1 1 1 2 4 6 8
1 1 1 1 2 3 5 7 9
1 1 1 1 3 4 6 8 10
1 1 1 2 4 5 7 9 11
1 1 1 3 5 6 8 10 12
1 1 1 4 6 7 9 11 13
1 1 1 5 7 8 10 12 14
1 1 2 6 8 9 11 13 15
1 1 3 7 9 10 12 14 16
1 1 4 8 10 11 13 15 17
1 2 5 9 11 12 14 16 18
1 3 6 10 12 13 15 17 19
1 4 7 11 13 14 16 18 20
1 5 8 12 14 15 17 19 21
1 6 9 13 15 16 18 20 22
2 7 10 14 16 17 19 21 1
3 8 11 15 17 18 20 22 1
4 9 12 16 18 19 21 1 1
5 10 13 17 19 20 22 1 1
6 11 14 18 20 21 1 1 1
7 12 15 19 21 22 1 1 1
8 13 16 20 22 1 1 1 1
9 14 17 21 1 1 1 1 1
10 15 18 22 1 1 1 1 1
 
Vladimir Karputov:

Hay varias formas de hacerlo. Una de ellas es utilizarOnTradeTransaction.

En la captura de la transacción

TRADE_TRANSACTION_DEAL_ADD

Añade la transacción al historial. Realizado como resultado de la ejecución de una orden o de operaciones de saldo de cuenta.

y asegurarse de que esta transacción es una entrada en el mercado:

DEAL_ENTRY_IN

Entrada en el mercado


//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }

Esta operación se llevará a cabo una vez que la orden pendiente se haya activado y la operación se haya introducido en el historial.

Una vez que hayamos capturado esta transacción, sólo tenemos que eliminar todas las órdenes pendientes:

//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }

Código genérico de EA (sólo aquí he especificado la magia igual a "0" - usted debe establecer su propia magia):

//+------------------------------------------------------------------+
//|                                       There will be only one.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade         m_trade;                      // trading object
COrderInfo     m_order;                      // pending orders object
//---
ulong          m_magic=0;                // magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

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

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }
//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }
//+------------------------------------------------------------------+

Gracias, pero ¿cómo debería implementarse en MQL4? Me disculpo por no haber especificado de inmediato.

 
yaaarik777:

Gracias, pero ¿cómo lo formateo para MQL4? Me disculpo por no haber sido más específico de inmediato.

No es así. No consulto sobre la antigua lengua y el terminal. Haz tus preguntas sobre el antiguo terminal en la sección:MQL4 y MetaTrader 4 (22693)
 

¿Por qué me sale un error en el mercado de valores y de futuros y todo va bien en el de divisas y materias primas?

venta fallida límite 1.00 USDRUB_TOM a 63.8679 sl: 63.8829 tp: 63.8329 [Vencimiento inválido].

 
-Aleks-:

¿Por qué me sale un error en el mercado de valores y de futuros, pero todo va bien en el de divisas y materias primas?

límite de venta fallido 1.00 USDRUB_TOM a 63.8679 sl: 63.8829 tp: 63.8329 [Vencimiento inválido].

hay que añadir un parámetro

request.type_time=ORDER_TIME_DAY;
 

Hola compañeros, tengo una pregunta sobre mql5:

Cómo calcular el beneficio de las posiciones abiertas hoy (si la posición se abrió ayer y se cerró hoy, esta posición no se tiene en cuenta) ????

 
Dmitry Melnichenko:

Hola compañeros, tengo una pregunta sobre mql5:

Cómo calcular el beneficio de las posiciones abiertas hoy (si la posición se abrió ayer y se cerró hoy, esta posición no se tiene en cuenta) ????

Obviamente, comparando la hora de apertura de la posición con la hora de inicio de la jornada.
 
Vitalie Postolache:
Obviamente, comparando la hora de apertura de la posición con la hora de inicio de la jornada.
Pero si la posición se abrió ayer y se cerró hoy, el historial mostrará una Transacción con la hora de apertura de hoy, ¡sólo cierra la posición de ayer! ¿O me equivoco?