Erros, bugs, perguntas - página 2412

 
Andrey Barinov:

Depois depurar. Imprimir bilhetes de transacção e ver no testador o que é realmente seleccionado ali. Adicionar um filtro para tipo de negócio, no entanto.

O lote é apresentado correctamente, pelo que o bilhete é seleccionado correctamente.

 
Andrey Dik:

o lote está correcto, por isso o bilhete está correcto.

Não. Ambos os ofícios, In e Out, têm o mesmo lote. Mas o lucro não é.

Aqui está o meu 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:

Não. Ambos os ofícios, In e Out, têm o mesmo lote. O lucro não é.

Aqui está o meu código. Funciona.

experimentou, o seu código também dá 0.0))))

A conta é coberta, se é que existe alguma coisa.
 
Andrey Dik:

experimentou, o seu código também dá 0.0))))

A conta é coberta, se é que existe alguma coisa.

Acabei de verificar tudo sobre a construção de 2009. O meu código dá o que deve. Se der 0, significa que tem aí 0.

 
Andrey Barinov:

Acabei de verificar tudo sobre a construção de 2009. O meu código dá o que é suposto dar. Se der 0, significa que tem aí 0.

Como é que, na história, há negócios fechados com um resultado não zero, e dá 0

 
Andrey Barinov:
Andrey Dik:

Existe a possibilidade de o problema poder estar do lado DC.

 
Alexey Kozitsyn:

Existe a possibilidade de o problema estar do lado DC.

Experimentei-o em Metaquotes e Robo, no testador.

 
Encontrei o meu erro... O meu erro foi não ter passado um majik para a função de fecho de posição, mas para a função aberta, e como resultado o negócio não pôde ser seleccionado pelo majik...
 

Se utilizar o CSymbolInfo em várias moedas, que é chamado pelo método Nome no momento da inicialização:

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 os testes do símbolo USDCAD, ocorrerão erros:

no prices for symbol
 
Andrey Pogoreltsev:

Se utilizar o CSymbolInfo em várias moedas, que é chamado pelo método Nome no momento da inicialização:

Haverá erros para o símbolo USDCAD durante os testes:

Será que alguém compreende sequer do que estamos a falar?

Razão: