Errori, bug, domande - pagina 2137

 

Errore durante la lettura del profitto (o sto già fraintendendo qualcosa).

C'è una funzione all'interno dell'EA:

bool Fn_profit_summ(double &profit_summ, bool is_buy, ulong magic, bool prnt=false){
   profit_summ = 0;
   string str=(is_buy?"B":"S")+" -> "; 
   //-----------------------------             
   int total = PositionsTotal();          
   for(int i=total-1; i>=0; i--){
      const ulong tic= PositionGetTicket(i); if(tic<=0)     return(false); //--- asinchr
      if(!PositionSelectByTicket(tic)                   )   return(false); //--- asinchr 
      bool is_buy_ = (PositionGetInteger(POSITION_TYPE  )==POSITION_TYPE_BUY); 
      if( is_buy_                             !=  is_buy)   continue; 
      if( PositionGetInteger(POSITION_MAGIC ) !=  magic )   continue;
      if( PositionGetSymbol (POSITION_SYMBOL) != _Symbol)   continue;
      profit_summ += PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP);
      str+=IntegerToString(tic)+" - "+DoubleToString((PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP)), 2)+"/";
      }
   //-----------------------------
   if( prnt) Print(str+" --> "+DoubleToString(profit_summ, 2));
   return(true);}

Posso vedere nel registro:

2018.02.21 01:44:04.315 2018.02.14 04:59:49   S -> 273 - -5.62/ --> -5.62

Sarebbe ok, ma è un ordine di acquisto di profitto, non un ordine di vendita

Il biglietto è esattamente per un ordine Sell (273, come nel log)


Pensavo di aver controllato nella funzione e che lo stesso tipo fosse considerato correttamente, ma il profitto non è proprio lo stesso. Se è vero, allora è l'apocalisse - il cliente chiude separatamente le posizioni Sell e Buy al raggiungimento del profitto/perdita specificato e chiude costantemente Sell, perché prende un profitto Buy. Allo stesso modo il deposito può essere involontariamente prosciugato

(Se ho lavorato troppo e sto già immaginando le cose - per favore correggetemi. Spero sinceramente che questo sia vero e che non ci sia un bug così critico)

 
Galina Bobro:

Errore durante la lettura del profitto (o sto già fraintendendo qualcosa).

C'è una funzione all'interno dell'EA:

Posso vedere nel registro:

Sarebbe ok, ma è un ordine di acquisto di profitto, non un ordine di vendita

Il biglietto è esattamente per un ordine Sell (273, come nel log)


Pensavo di aver controllato nella funzione e che lo stesso tipo fosse considerato correttamente, ma il profitto non è proprio lo stesso. Se è vero, allora è l'apocalisse - il cliente chiude separatamente le posizioni Sell e Buy al raggiungimento del profitto/perdita specificato e chiude costantemente Sell, perché prende un profitto Buy. Allo stesso modo il deposito può essere involontariamente prosciugato

(Se ho lavorato troppo e sto già immaginando le cose - per favore correggetemi. Spero sinceramente che questo sia vero e che non ci sia un bug così critico)

string str=(! is_buy?"B":"S")+" -> ";
 
Kirill Belousov:
Di cosa si tratta? Perché dovrei volere "se bye ritira S"?
 

Lavoro spesso con personaggi personalizzati. Per esempio, ho bisogno di condurre il debug su uno di questi. Questo richiede l'inserimento del suo nome qui


Ma i nomi dei personaggi personalizzati (e non solo quelli) possono essere lunghi/complicati, il che rende difficile digitarli dalla tastiera. Il meccanismo di copia del nome del simbolo nel buffer non è da nessuna parte. Pertanto, propongo di aggiungere a questo menu la voce "Copiare il nome del simbolo".


ZZY Aggiungete i millisecondi al Tester Visualizer, per favore!

 
fxsaber:

ZS Aggiungete i millisecondi al Tester Visualiser, per favore!

Aggiungi

 

Errore durante l'esecuzione

struct A {
template<typename T>
        void Print(   T t ) { ::Print( 2 ); }
        ~A() { Print( 1 ); }
};
void OnStart() { A a; }

Risultato: 1

Previsto: 2

 
A100:

Atteso: void A::Print<int>(int):1

Questo è molto probabilmente dovuto alla natura astuta della stampa regolare. Potete anche sovraccaricare iCustom allo stesso modo. Penso che vi darà lo stesso risultato.

Lo spazio dei nomi per Print, Comment, Alert, iCustom, ... - qualcosa di speciale, sembra.

 
fxsaber:

Molto probabilmente ha a che fare con la difficile natura dell'in-house Print.

Non correlato.

void Print2( int )           { Print( 1 ); }
struct A {
template<typename T>
        void Print2(   T t ) { Print( 2 ); }
        ~A() { Print2( 1 ); }
};
void OnStart() { A a; }

Stesso risultato.

 

SymbolInfoTick per i simboli personalizzati produce un tick vuoto (quando non è stato fatto alcun CustomTicksAdd), anche quando ci sono tick in History.

Suggerisco che sul lato Terminal, dopo qualsiasi CustomTicksReplace l'ultimo tick (o solo il suo tempo) in History dovrebbe essere un SymbolInfoTick.


Si prega di consigliare gli sviluppatori su questo argomento, chi dovrebbe logicamente appendere questa azione - il terminale o un utente?

Penso che il terminale, perché salverà l'utente da occasionali bug nel suo codice (ne ha preso uno).

Ora, per esempio, ultimamente si deve trovare un simbolo come questo

  ulong GetOriginalLastTime( void ) const
  {
    MqlTick Tick[1] = {0};

    ::SymbolInfoTick(this.Symb, Tick[0]);
    
    if (!Tick[0].time_msc)
      ::CopyTicks(this.Symb, Tick, COPY_TICKS_ALL, 0, 1);

    return(Tick[0].time_msc);
  }
 
A100:

Non correlato.

Il risultato è lo stesso

Sì, è un bug. Non l'ho mai incontrato, perché l'ho sempre attribuito ai metodi.