Características da linguagem mql5, subtilezas e técnicas - página 165

 
fxsaber:

Sim, tenho presente a leitura da história.

Escreveu então que o meu indicador era lento.
Encontrei a razão para essa mesma coisa. Quando carreguei a conta com 30.000 transacções.
Consegui reduzir os travões . Por um factor de 4, reditei um pouco a leitura da história e optimizei o código. Mas ainda os tem. A razão é que existem filtros e tudo é recalculado quando clico num filtro.
Embora tudo seja lido a partir de matrizes.
Está tudo bem nas contas com 5000 transacções. Mas é um problema nos grandes.
Não diz respeito apenas a esse indicador.

Fiz um projecto de leitura de história limpa.
Talvez, talvez seja devido à Internet. Afinal de contas, toda a história é um monte de dados.

 

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Bibliotecas: Easy Canvas

Nikolai Semko, 2020.02.17 05:15

Quero esclarecer um ponto importante para os programadores interessados quando operam o kanvas em modo de teste.
Um conhecido programador desta comunidade veio ter comigo com esta pergunta:

- Porque é que no modo testador o meu painel, criado em objectos, é redesenhado muito mais rapidamente do que em tela, enquanto no modo normal o meu painel é desenhado à velocidade normal em tela?

Compreendi a razão para isso e encontrei a solução para o problema.

O problema é que o redesenho de objectos vai junto com o redesenho de todo o ecrã, enquanto que o ecrã no testador não é redesenhado com mais frequência do que 30 fotogramas por segundo.

Os objectos são em última análise a mesma tela (interna), mas quando se alteram as propriedades do objecto, a tela do objecto não é gerada (não recalculada), mas gerada apenas quando a tela é actualizada (ChartRedraw), o que ocorre no testador (e no modo normal, também) não mais frequentemente do que o nosso olho consegue distinguir as alterações, ou seja, não mais frequentemente do que ~ 32 quadros por segundo.

Suponhamos que o painel muda cada vez que se faz um clique. Então a tela predefinida será também redesenhada a cada tick, mas o redesenho no testador ainda não é mais frequente que ~30 msec (~30 fps).

Por outras palavras, a tela será recalculada muito mais vezes do que é realmente apresentada no ecrã, o que resulta numa utilização desproporcionada de recursos.

A solução para este problema seria assegurar que a tela seja recalculada e redesenhada não mais frequentemente do que a cada 15-30 milissegundos de tempo de computador, e então não haverá ciclos desnecessários de recálculo vazio.

Por exemplo, como este:

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

 
Se, por exemplo, quiser criar um ficheiro "EURUSD.txt" (caracteres grandes) e já tiver "eurusd.txt" (caracteres pequenos) no disco, o ficheiro terá o mesmo nome que antes.
 
fxsaber:
Se, por exemplo, eu quiser criar o ficheiro "EURUSD.txt" (símbolos grandes) e já houver "eurusd.txt" (símbolos pequenos) no disco, o ficheiro terá o mesmo nome que antes.

Além disso, quando eu salvo EURUSD TicksLongOpt.set, eurusd tickslongopt.set é salvo. Tenho de lhe dar um novo nome depois. Há muitas pequenas coisas irritantes como essa.

 
Edgar Akhmadeev:

Além disso, quando eu salvo EURUSD TicksLongOpt.set, eurusd tickslongopt.set é salvo. Tenho de lhe dar um novo nome depois. Tenho de lhe dar um novo nome depois. Há muitas pequenas coisas tão irritantes.

Penso que se eu apagar primeiro e depois criar, tudo ficará bem.

 
fxsaber:

Penso que se apagar primeiro e depois criar, ficará bem.

Não, estou a falar da criação de um novo ficheiro, especificamente ao salvar a partir do diálogo do terminal. Se não funcionar para todos, então depende de outra coisa qualquer. Eu tenho Win7, se alguma coisa.

 
Edgar Akhmadeev:

Não, refiro-me à criação de um novo ficheiro, exactamente quando se guarda a partir do diálogo do terminal. Se não funcionar para todos, então depende de outra coisa qualquer. Eu tenho Win7, se alguma coisa.

Referia-me às funções FileOpen e FileSave.

 
fxsaber:

Referia-me às funções FileOpen e FileSave.

Sim, acabei de me aperceber agora que está deslocado, o tema é sobre a língua...

 
fxsaber:
Fácil classificação de uma série de estruturas


Aplicação


Resultado

Não funciona, pode actualizá-lo ? Não são permitidos modelos de declarações nas classes locais 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:

Não funciona, pode actualizar ? Não são permitidos modelos de declarações escritas nas classes locais TestarrSort.mq5 81 3

Infelizmente, a língua foi cortada. Este código não funciona.

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


Mas pode tentar uma 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 Aqui está outro exemplo de utilização.

Razão: