Testare 'CopyTicks'. - pagina 17

 
fxsaber:
Il volume delle barre di tick è un rudimento? Un indicatore che, in linea di principio, non significa nulla in borsa. Non si può usare consapevolmente. È spazzatura.

Beh, in realtà, il volume dei tick in borsa è il numero dei flipper. Cioè il numero effettivo di scambi.

 
Slawa:

Beh, in realtà il volume dei tick in borsa è il numero dei flipper. Cioè il numero effettivo di scambi.

Così la barra non cambia quando arriva un trade che è completamente identico al precedente.
 
fxsaber:
Così la barra non cambia quando arriva un trade che è completamente identico al precedente.
I volumi di tick e reali cambiano
 
L'Expert Advisor scrive tick freschi di storia e rivela l'N-terzo bug in CopyTicks
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

string GetTickFlag( uint tickflag )
{
  string flag = "";

#define  TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef  TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
     
  return(flag);
}

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

#define  TOSTRING2(A) #A + " = " + (string)A

int AddFreshTicks( MqlTick &Ticks[], const string Symb = NULL, const uint flags = COPY_TICKS_ALL )
{
  int Res = 0;
  const int Amount = ArraySize(Ticks);
  
  MqlTick NewTicks[];  
  const int NewAmount = (Amount == 0) ? CopyTicks((Symb == NULL)? Symbol() : Symb, NewTicks, flags) :
                                        CopyTicks((Symb == NULL)? Symbol() : Symb, NewTicks, flags, Ticks[Amount - 1].time_msc);
  
  if (NewAmount > 0)
  {
    if (Amount > 0)
    {
      // Взяли крайнее время из предыдущей истории
      const long LastTime = Ticks[Amount - 1].time_msc;
      
      int Count = 1;
      
      // Находим (Count) в предыдушей истории количество тиков со временем LastTime
      for (int i = Amount - 2; i >= 0; i--)
      {
        if (Ticks[i].time_msc < LastTime)
          break;
          
        Count++;
      }

      if ((Count < Amount) && (Count < NewAmount))      
      {
        // Если Count-тик c LastTime-временем в новой истории не равен самому последнего тику в старой истории, выводим в журнал
        if (_R(Ticks[Amount - 1]) != NewTicks[Count - 1]) // https://www.mql5.com/ru/code/16280
          Print(TOSTRING2(TickToString(Ticks[Amount - 1])) + "\n" +
                TOSTRING2(TickToString(NewTicks[Count - 1])) + "\n" + TOSTRING2(TickToString(NewTicks[Count])) + "\n");              

        Res = ArrayCopy(Ticks, NewTicks, Amount, Count);
      }
    }
    else
      Res = ArrayCopy(Ticks, NewTicks);
  }
  
  return(Res);
}

void OnTick( void )
{
  static MqlTick PrevTicks[];
  
  // Дописываем свежие тики
  AddFreshTicks(PrevTicks);
}

Questa volta ho scritto commenti dettagliati, quindi il risultato dovrebbe essere chiaro

2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count]) =  time = 2016.09.22 12:19:53.233 bid = 0.0 ask = 0.0 last = 98560.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY
2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count-1]) =  time = 2016.09.22 12:19:51.968 bid = 0.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:03.762 Test8 (RTS-12.16,M1)    TickToString(Ticks[Amount-1]) =  time = 2016.09.22 12:19:51.968 bid = 98550.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count]) =  time = 2016.09.22 12:19:51.968 bid = 98550.0 ask = 0.0 last = 98550.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(NewTicks[Count-1]) =  time = 2016.09.22 12:19:51.813 bid = 98550.0 ask = 0.0 last = 0.0 volume = 0 TICK_FLAG_BID
2016.09.22 12:20:02.504 Test8 (RTS-12.16,M1)    TickToString(Ticks[Amount-1]) =  time = 2016.09.22 12:19:51.813 bid = 98550.0 ask = 98560.0 last = 0.0 volume = 0 TICK_FLAG_BID
Il problema non è solo con COPY_TICKS_ALL ma anche con altre modalità (LAST, INFO).
 
fxsaber:
L'Expert Advisor ha completato la scrittura di tick storici freschi e ha trovato il nono bug in CopyTicks.

Questa volta ho scritto commenti dettagliati, quindi il risultato dovrebbe essere chiaro

Il problema non riguarda solo COPY_TICKS_ALL, ma anche altre modalità (LAST, INFO).

Ho provato ad aggiungere le zecche tramite From == 0. Non funziona! - Bug in CopyTicks.

Cari sviluppatori, ho molto bisogno di questa funzione (per aggiungere un nuovo dato della storia). Lascia che sia ritardato per ora, ma funzionerà. Per favore, scrivete qui la sua versione funzionante.

Dovrete correggere i bug in CopyTicks per molto tempo e non una sola build. Come gli altri usano CopyTicks - non riesco a capire. A quanto pare, non li usano affatto. Mancano di immaginazione.

 

Dovresti dire chiaramente cosa consideri esattamente un bug.

 
Renat Fatkhullin:

Dovresti dire chiaramente cosa consideri esattamente come un bug.

Ha risposto molto chiaramente in codice. Ho creato una domanda a Service Desk, dove ho scritto ancora più dettagli.
 
fxsaber:
Risponde molto chiaramente a questa domanda il codice. Ho fatto una richiesta al Service Desk dove l'ho descritto in dettaglio.

L'errore consiste nel fatto che nell'array di tick appena ottenuto le prime voci contengono zero bid, ask o last. mentre nell'array precedente gli stessi tick alla fine dell'array non contengono zeri, ma contengono i valori attuali di bid, ask e last al momento

Questo errore in CopyTicks è stato corretto dopo il rilascio della build. Ora, le voci di tick iniziali dopo la chiamata di CopyTicks non conterranno zeri, ma i valori attuali di bid, ask e last al momento richiesto.

Sfortunatamente, le correzioni non sono state incluse nella build attuale.

 
Slawa:

L'errore consiste nel fatto che nell'array di tick appena ottenuto le prime voci contengono zero valori di bid, ask o last, mentre nell'array precedente gli stessi tick alla fine dell'array non contengono zeri, ma contengono i valori attuali di bid, ask e last

Questo bug in CopyTicks è stato risolto già dopo il rilascio della build. Ora i record di tick iniziali dopo la chiamata di CopyTicks non conterranno zeri, ma i valori attuali di bid, ask e last al momento richiesto

Non ti capisco. State dicendo che avete il vostro formato interno di memorizzazione della storia. E CopyTicks ne prende un pezzo ad ogni richiesta e genera la propria sequenza di MqlTick? Gli stessi flag sono calcolati da CopyTicks, e non sono memorizzati nella storia? Qualche pad, che calcola anche qualcosa, e non solo lo converte in formato user-friendly.

Non ho bisogno di CopyTicks per riempire qualcosa lì, a seconda del tempo della richiesta. Voglio solo avere la storia senza distorsioni. E aggiungerlo senza problemi.

Sfortunatamente, non ci sono correzioni nella build attuale.

Per favore, rilasciate la build beta sul vostro server. Sono sicuro che troverò altre incongruenze. Lecchiamo questo CopyTicks in modo che finalmente ci si possa fidare!

 
fxsaber:
L'Expert Advisor completa i tick storici freschi e rileva l'N-esimo bug di CopyTicks
Se avete bisogno SOLO del nastro (COPY_TICKS_TRADE - time_msc, last, volume e flags), allora questa soluzione è completamente adatta - nessun bug rilevato.
Motivazione: