Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 165

 
fxsaber:

Sì, ho la storia che legge presente.

Hai scritto allora che il mio indicatore era lento.
Ho trovato la ragione proprio per questo. Quando ho caricato il conto con 30.000 scambi.
Sono riuscito a ridurre i freni. Di un fattore 4. Ho rifatto un po' la lettura della storia e ho ottimizzato il codice. Ma li ha ancora. Il motivo è che ci sono dei filtri e tutto viene ricalcolato quando clicco su un filtro.
Anche se tutto viene letto dagli array.
Tutto è a posto sui conti con 5000 scambi. Ma è un problema su quelli grandi.
Non riguarda solo questo indicatore.

Ho fatto un progetto di lettura di storia pulita.
Forse, può essere dovuto a Internet. Dopo tutto, l'intera storia è un sacco di dati.

 

Forum sul trading, sistemi di trading automatico e test di strategia

Biblioteche: Easy Canvas

Nikolai Semko, 2020.02.17 05:15

Voglio chiarire un punto importante per i programmatori interessati quando si utilizza il kanvas in modalità tester.
Un noto programmatore di questa comunità è venuto da me con questa domanda:

- Perché in modalità tester il mio pannello, creato sugli oggetti, viene ridisegnato molto più velocemente che disegnato su tela, mentre in modalità normale il mio pannello viene disegnato a velocità normale su tela?

Sono riuscito a capire la ragione del problema e la sua soluzione.

Il problema è che il ridisegno degli oggetti va insieme al ridisegno di tutto lo schermo, mentre lo schermo nel tester viene ridisegnato non più frequentemente di 30 fotogrammi al secondo.

Gli oggetti sono in definitiva la stessa tela (interna), ma quando si cambiano le proprietà dell'oggetto, la tela dell'oggetto non viene generata (non ricalcolata), ma generata solo quando lo schermo viene aggiornato (ChartRedraw), il che avviene nel tester (e anche in modalità normale) non più spesso di quanto il nostro occhio possa distinguere i cambiamenti, cioè non più spesso di ~ 32 frame al secondo.

Supponiamo che il pannello cambi ogni tick. Allora la tela di default sarà anche ridisegnata ogni tick, ma il ridisegno nel tester non è ancora più frequente di ~30 msec (~30 fps).

In altre parole, la tela sarà ricomputata molto più frequentemente di quanto sia effettivamente visualizzata sullo schermo, il che si traduce in un uso sproporzionato delle risorse.

La soluzione a questo problema sarebbe assicurarsi che la tela sia ricalcolata e ridisegnata non più spesso di ogni 15-30 millisecondi di tempo del computer, e allora non ci saranno cicli inutili di ricalcolo a vuoto.

Per esempio, così:

void OnTick()
  {
  static uint lastCalc=0;
  uint cur=GetTickCount();
  if (cur-lastCalc>15) {
    ReDrawMyCanvas();
    lastCalc=cur;
   }
  }

 
Se, per esempio, vuoi creare un file "EURUSD.txt" (caratteri grandi) e hai già "eurusd.txt" (caratteri piccoli) sul disco, il file avrà lo stesso nome di prima.
 
fxsaber:
Se, per esempio, voglio creare il file "EURUSD.txt" (simboli grandi) e c'è già "eurusd.txt" (simboli piccoli) sul disco, il file avrà lo stesso nome di prima.

Inoltre, quando salvo EURUSD TicksLongOpt.set, eurusd tickslongopt.set viene salvato. Devo rinominarlo dopo. Ci sono un sacco di piccole cose fastidiose come questa.

 
Edgar Akhmadeev:

Inoltre, quando salvo EURUSD TicksLongOpt.set, eurusd tickslongopt.set viene salvato. Devo rinominarlo dopo. Devo rinominarlo dopo. Ci sono molte piccole cose così fastidiose.

Penso che se prima cancello e poi creo, tutto andrà bene.

 
fxsaber:

Penso che se prima cancelli e poi crei, andrai bene.

No, intendo la creazione di un nuovo file, in particolare quando si salva dalla finestra di dialogo del terminale. Se non funziona per tutti, allora dipende da qualcos'altro. Ho Win7, semmai.

 
Edgar Akhmadeev:

No, intendo la creazione di un nuovo file, esattamente quando si salva dalla finestra di dialogo del terminale. Se non funziona per tutti, allora dipende da qualcos'altro. Ho Win7, semmai.

Intendevo le funzioni FileOpen e FileSave.

 
fxsaber:

Intendevo le funzioni FileOpen e FileSave.

Sì, solo ora mi sono reso conto che è fuori luogo, l'argomento è il linguaggio...

 
fxsaber:
Ordinamento facile di una serie di strutture


Applicazione


Risultato

Non funziona, puoi aggiornarlo? Le dichiarazioni di template non sono permesse nelle classi locali TestarrSort.mq5 81 3

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define  ArraySortStruct(ARRAY, FIELD)                                            \
{                                                                                \
  class SORT                                                                     \
  {                                                                              \
  private:                                                                       \
    template <typename T>                                                        \
    static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
      const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
    template <typename T>                                                        \
    static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
      int Marker = Start;                                                        \
                                                                                 \          
      for (int i = Start; i <= End; i++)                                         \
        if (Array[i].##FIELD <= Array[End].##FIELD)                              \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return(Marker - 1);                                                       \
    }                                                                            \
                                                                                 \
    template <typename T>                                                        \
    static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
      if (Start < End)                                                           \
      {                                                                          \
        const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1);                                \
        SORT::QuickSort(Array, Pivot + 1, End);                                  \
      }                                                                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
                                                                                 \
  public:                                                                        \
    template <typename T>                                                        \ 
    static void Sort( T &Array[], int Count = WHOLE_ARRAY, const int Start = 0 ) \
    {                                                                            \
      if (Count == WHOLE_ARRAY)                                                  \
        Count = ::ArraySize(Array)- Start; ;                                     \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1);                          \
                                                                                 \
      return;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}                                                                                \


void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates); // Взяли бары
  
  Print("\nБары без сортировки - как получили.");
  ArrayPrint(Rates);
  
  Print("\nСортируем по open-цене.");
  ArraySortStruct(Rates, open);
  ArrayPrint(Rates);

  Print("\nСортируем по high-цене.");
  ArraySortStruct(Rates, high);
  ArrayPrint(Rates);

  Print("\nСортируем по времени.");
  ArraySortStruct(Rates, time);
  ArrayPrint(Rates);
}

 
Vladimir Pastushak:

Non funziona, puoi aggiornare? Scrive che le dichiarazioni di template non sono permesse nelle classi locali TestarrSort.mq5 81 3

Purtroppo la lingua è stata tagliata. Questo codice non funziona.

void OnStart()
{
  class A
  {
    template <typename T> // template declarations are not allowed in local classes
    void f() {}
  };
}


Ma si può provare una variante alternativa.

template <typename T>                                       
void ArrayReindex( T &Array[], const double &TmpSort[][2] )
{                         
  T TmpArray[];
  
  for (int i = ::ArrayResize(TmpArray, ::ArrayRange(TmpSort, 0)) - 1; i >= 0; i--)
    TmpArray[i] = Array[(int)(TmpSort[i][1] + 0.1)];
    
  ::ArraySwap(Array, TmpArray);
              
  return;     
}             

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define  ArraySortStruct(ARRAY, FIELD)                                      \
{                                                                          \
  double TmpSort[][2];                                                     \
                                                                           \
  for (int i =::ArrayResize(TmpSort, ::ArraySize(ARRAY)) - 1; i >= 0; i--) \
  {                                                                        \
    TmpSort[i][0] = (double)ARRAY[i].FIELD;                                \
    TmpSort[i][1] = i;                                                     \
  }                                                                        \
                                                                           \
  ::ArraySort(TmpSort);                                                    \
  ::ArrayReindex(ARRAY, TmpSort);                                          \
}                                         

void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 5, Rates); // Взяли бары
  
  Print("\nБары без сортировки - как получили.");
  ArrayPrint(Rates);
  
  Print("\nСортируем по open-цене.");
  ArraySortStruct(Rates, open);
  ArrayPrint(Rates);

  Print("\nСортируем по high-цене.");
  ArraySortStruct(Rates, high);
  ArrayPrint(Rates);

  Print("\nСортируем по времени.");
  ArraySortStruct(Rates, time);
  ArrayPrint(Rates);
}


SZZ Ecco un altro esempio di utilizzo.