Errores, fallos, preguntas - página 2412

 
Andrey Barinov:

Entonces, depúrelo. Imprima los tickets de transacción y vea en el probador lo que realmente se selecciona allí. Sin embargo, añade un filtro para el tipo de acuerdo.

El lote se muestra correctamente, por lo que el billete se selecciona correctamente.

 
Andrey Dik:

el lote es correcto, por lo que el billete es correcto.

No. Ambas operaciones, la de entrada y la de salida, tienen el mismo lote. Pero el beneficio no lo es.

Aquí está mi código. Funciona.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
ulong LastOutDealTicket(const string symbol,const uint magic)
  {
//===============
   long lasttime=0;
//===============

//===============
   ulong ticket=0;
//===============

//===============
#ifdef __MQL5__
//===============
   ::HistorySelect(0,TimeCurrent()+60);
//===============
   const int deals=::HistoryDealsTotal();
//===============
   for(int i=deals-1;i>=0;i--)
     {
      //===============
      const ulong tempticket=::HistoryDealGetTicket(i);
      //===============

      //===============
      if(::HistoryDealGetInteger(tempticket,DEAL_ENTRY)!=DEAL_ENTRY_OUT || ::HistoryDealGetString(tempticket,DEAL_SYMBOL)!=symbol ||
         ::HistoryDealGetInteger(tempticket,DEAL_MAGIC)!=magic)continue;
      //===============

      //===============
      if(::MQLInfoInteger(MQL_TESTER))return(tempticket);
      //===============

      //===============
      if(::HistoryDealGetInteger(tempticket,DEAL_TIME)<=lasttime)continue;
      //===============

      //===============
      ticket=tempticket;
      lasttime=::HistoryDealGetInteger(tempticket,DEAL_TIME);
      //===============
     }
//===============
#endif 
//===============

//===============
#ifdef __MQL4__
//===============
   const int ordershistory=OrdersHistoryTotal();
//===============
   for(int i=ordershistory-1;i>=0;i--)
     {
      //===============
      if(!::OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) || ::OrderSymbol()!=symbol || ::OrderMagicNumber()!=magic || 
         (::OrderType()!=OP_SELL && ::OrderType()!=OP_BUY))continue;
      //===============

      //===============
      if(::MQLInfoInteger(MQL_TESTER))return(::OrderTicket());
      //===============

      //===============
      if(::OrderCloseTime()<=lasttime)continue;
      //===============

      //===============
      ticket=::OrderTicket();
      lasttime=::OrderCloseTime();
      //===============
     }
//===============
#endif 
//===============

//===============
   return(ticket);
//===============
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LastClosedProfit(const string symbol,const uint magic)
  {
//===============
   const ulong lastoutticket=::LastOutDealTicket(symbol,magic);
//===============

//===============
   if(lastoutticket<=0)return(0);
//===============

//===============
   double result=0;
//===============

//===============
#ifdef __MQL5__
//===============
   result=::HistoryDealGetDouble(lastoutticket,DEAL_PROFIT);
//===============
#endif 
//===============

//===============
#ifdef __MQL4__
//===============
   if(::OrderSelect((int)lastoutticket,SELECT_BY_TICKET,MODE_HISTORY))result=::OrderProfit();
//===============
#endif 
//===============

//===============
   return(result);
//===============
  }
 
Andrey Barinov:

No. Ambas operaciones, la de entrada y la de salida, tienen el mismo lote. El beneficio no lo es.

Aquí está mi código. Funciona.

lo he probado, tu código también da 0.0))

La cuenta está cubierta, en todo caso.
 
Andrey Dik:

lo he probado, tu código también da 0.0))

La cuenta está cubierta, en todo caso.

Acabo de comprobar todo en la construcción de 2009. Mi código da lo que debería. Si da 0, significa que tienes 0 ahí.

 
Andrey Barinov:

Acabo de comprobar todo en la construcción de 2009. Mi código da lo que se supone que debe dar. Si da 0, significa que tienes 0 ahí.

¿Cómo es que en el historial hay operaciones cerradas con un resultado distinto de cero, y da 0

 
Andrey Barinov:
Andrey Dik:

Existe la posibilidad de que el problema esté en el lado de la CC.

 
Alexey Kozitsyn:

Existe la posibilidad de que el problema esté en el lado de la CC.

Lo he probado en Metaquotes y Robo, en el probador.

 
Encontré mi error... Mi error fue que no pasé un majik a la función de cierre de posición, sino a la función de apertura, y como resultado el trato no pudo ser seleccionado por el majik...
 

Si se utiliza CSymbolInfo en multidivisa, que es llamado por el método Name en el momento de la inicialización:

if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE,m_tick_value))
   return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_PROFIT,m_tick_value_profit))
   return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_LOSS,m_tick_value_loss))
   return(false);

Durante la prueba se producirán errores en el símbolo USDCAD:

no prices for symbol
 
Andrey Pogoreltsev:

Si se utiliza CSymbolInfo en multidivisa, que es llamado por el método Name en el momento de la inicialización:

Habrá errores para el símbolo USDCAD durante la prueba:

¿Alguien entiende siquiera de qué estamos hablando?

Razón de la queja: