Errori, bug, domande - pagina 2412

 
Andrey Barinov:

Poi fate il debug. Stampare i biglietti delle transazioni e vedere nel tester cosa viene effettivamente selezionato lì. Aggiungete un filtro per il tipo di accordo, però.

Il lotto viene visualizzato correttamente, quindi il biglietto viene selezionato correttamente.

 
Andrey Dik:

il lotto è corretto, quindi il biglietto è corretto.

No. Entrambi gli scambi, In e Out, hanno lo stesso lotto. Ma il profitto non lo è.

Ecco il mio codice. Funziona.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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. Entrambi gli scambi, In e Out, hanno lo stesso lotto. Il profitto non lo è.

Ecco il mio codice. Funziona.

provato, anche il tuo codice dà 0,0)))

Il conto è coperto, semmai.
 
Andrey Dik:

provato, anche il tuo codice dà 0,0)))

Il conto è coperto, semmai.

Ho appena controllato tutto sulla build 2009. Il mio codice dà quello che dovrebbe. Se dà 0, significa che hai 0 lì.

 
Andrey Barinov:

Ho appena controllato tutto sulla build 2009. Il mio codice dà quello che dovrebbe dare. Se dà 0, significa che hai 0 lì.

Come mai, nella storia ci sono compravendite chiuse con un risultato non nullo, e dà 0

 
Andrey Barinov:
Andrey Dik:

C'è la possibilità che il problema sia sul lato DC.

 
Alexey Kozitsyn:

C'è la possibilità che il problema sia sul lato DC.

Provato su Metaquotes e Robo, nel tester.

 
Trovato il mio errore... Il mio errore è stato che non ho passato un majik alla funzione di chiusura della posizione, ma alla funzione di apertura, e come risultato l'affare non poteva essere selezionato dal majik...
 

Se usate CSymbolInfo in multicurrency, che viene chiamato dal metodo Name al momento dell'inizializzazione:

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 il test del simbolo USDCAD si verificheranno degli errori:

no prices for symbol
 
Andrey Pogoreltsev:

Se usate CSymbolInfo in multicurrency, che viene chiamato dal metodo Name al momento dell'inizializzazione:

Ci saranno errori per il simbolo USDCAD durante il test:

Qualcuno capisce almeno di cosa stiamo parlando?

Motivazione: