Novo MetaTrader 4 Terminal de Clientes 387 e MetaTrader 4 Data Center construído 387 - página 4

 
AlexSTAL:

Eu apaguei a correspondência, mas entendo perfeitamente o que é otimização sem ela...

Diga claramente com um mínimo de código o que você teme, mas não reproduziu na realidade...

Esta é uma conversa completamente inana... Nenhum dos meus indicadores me pede para reinicializar os amortecedores em cada carrapato.

É por isso que estou tentando entender do que estamos falando....


a Zhunko: tentarei entender isso mais tarde


Quanto mais claro, escrevi, que tenho apenas um cálculo:

1) quando aparece uma nova barra.

2) quando o preço deixa os limites de uma parte já calculada de uma barra (para alto ou baixo)

3) três ou quatro últimas vigas são calculadas.

Isto foi discutido em nossa correspondência. Você disse que era claro.... Ou será que eu escrevi em vão?

Se houver uma reinicialização em cada carrapato, ou seja, enchendo o buffer com zeros, ele terá que ser recalculado em cada carrapato. Isto causará o seguinte. Agora a Putnika tem até 100 instâncias de ZUP em um terminal em vários gráficos. Mesmo em um mercado rápido, o terminal não abranda muito. E se tivermos que recalcular em cada tick, o número de indicadores ativados simultaneamente diminuirá dez vezes. E se o cálculo for realizado em todo o histórico disponível, o computador será capaz de lidar com apenas uma instância do indicador.

Não é suficiente?

 
nen:

Se houver uma reinicialização em cada carrapato, ou seja, enchendo o buffer com zeros, ele terá que ser recalculado em cada carrapato. Isto implicará o seguinte. Agora a Putnika tem até 100 instâncias de ZUP em um terminal em vários gráficos. Mesmo em um mercado rápido, o terminal não abranda muito. E se tivermos que recalcular em cada tick, o número de indicadores ativados simultaneamente diminuirá dez vezes. E se o cálculo for realizado em todo o histórico disponível, o computador será capaz de lidar com apenas uma instância do indicador.

Onde está escrito? Você pode verificá-lo primeiro e só depois se assustar.
 
nen:


Quanto mais claro, eu escrevi que só tinha o cálculo:

1) quando uma nova barra aparece

2) quando o preço se move além da parte já calculada da barra (sobre a parte alta ou baixa)

3) as últimas três ou quatro barras são calculadas.

Isto foi discutido em nossa correspondência. Você disse que era claro.... Ou será que eu escrevi em vão?

Se houver uma reinicialização em cada carrapato, ou seja, enchendo o buffer com zeros, ele terá que recalcular em cada carrapato. Isto causará o seguinte. Agora a Putnika tem até 100 instâncias de ZUP em um terminal em vários gráficos. Mesmo em um mercado rápido, o terminal não abranda muito. E se tivermos que recalcular em cada tick, o número de indicadores ativados simultaneamente diminuirá dez vezes. E se o cálculo for realizado em todo o histórico disponível, o computador será capaz de lidar com apenas uma instância do indicador.

Não é suficiente?

Se ao menos, mas se ao menos... Não existe tal problema! Zhunko tem um problema completamente diferente. Antes de criar o pânico, você mesmo precisa verificá-lo. Eu verifiquei alguns posts acima e até afixei o código
 
Rosh:
Onde diz isso? Você pode verificá-lo primeiro e só depois se assustar.

+10000

Em todos os casos deve haver uma abordagem profissional....

 
start()
 {
  if(glowBar<=iLow(NULL, gtf, 0) && ghighBar>=iHigh(NULL, gtf, 0) && gtimelast==iTime(NULL, gtf, 0)) return (0);

  glowBar=iLow(NULL, gtf, 0); ghighBar=iHigh(NULL, gtf, 0);                  // обновляем сразу, а не после длительного расчета
...// здесь код основного расчета.

  gcurrentBars=iBars(NULL, gtf);       // обновляем в конце, чтобы не накапливались непосчитанные бары за время расчета
                                        // и не срабатывал полный пересчет на следующем тике в случае длительного расчета
 }

Полный код секции старт


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i, j;

   gtf=Period();
   gRecalculation=1;

   while(gRecalculation>0)
     {
      if(gcurrentBars<iBars(NULL, gtf)-1)
        {
         Print("Время полного пересчета = ",TimeToStr(Time[0],TIME_DATE|TIME_MINUTES));
         glowBar=0; ghighBar=0; gtimelast=0; gsave_wr0=0;
         ArrayInitialize(gsave_tLast,0);ArrayInitialize(gsave_hl,0);ArrayInitialize(gsave_lastlow,0);ArrayInitialize(gsave_lasthigh,0);
         ArrayInitialize(gt_hi,0);ArrayInitialize(gt_li,0);ArrayInitialize(gt_end,0);

         gTheExternalBar=false; 
         history=true;
//      if(_PrimarySelectionOfExtremums==2 || _PrimarySelectionOfExtremums==3) delete_objects();
         delete_objects();
         g_addnewextremum=true;
         gbar=iBars(NULL, gtf);

         ArrayInitialize(gtime_gbar,0); ArrayInitialize(gL2LTime,0); ArrayInitialize(gL2HTime,0); 

         ArrayInitialize(LowestBuffer1,0);ArrayInitialize(HighestBuffer1,0);
         ArrayInitialize(LowestBuffer2,0);ArrayInitialize(HighestBuffer2,0); 
         ArrayInitialize(LowestBuffer3,0);ArrayInitialize(HighestBuffer3,0); 
         ArrayInitialize(LowestBuffer4,0);ArrayInitialize(HighestBuffer4,0); 

         ArrayInitialize(last_h,0);ArrayInitialize(last_l,0);ArrayInitialize(last_t,0);

         ArrayInitialize(tL1,0);ArrayInitialize(tL2,0);ArrayInitialize(tL3,0);ArrayInitialize(tL4,0);ArrayInitialize(tL5,0);
         ArrayInitialize(tL6,0);ArrayInitialize(tL7,0);ArrayInitialize(tL8,0);ArrayInitialize(tL9,0);ArrayInitialize(tL10,0);
         ArrayInitialize(tL11,0);

         ArrayInitialize(cL1,0);ArrayInitialize(cL2,0);ArrayInitialize(cL3,0);ArrayInitialize(cL4,0);ArrayInitialize(cL5,0);
         ArrayInitialize(cL6,0);ArrayInitialize(cL7,0);ArrayInitialize(cL8,0);ArrayInitialize(cL9,0);ArrayInitialize(cL10,0);
         ArrayInitialize(cL11,0);
         ArrayInitialize(cH1,0);ArrayInitialize(cH2,0);ArrayInitialize(cH3,0);ArrayInitialize(cH4,0);ArrayInitialize(cH5,0);
         ArrayInitialize(cH6,0);ArrayInitialize(cH7,0);ArrayInitialize(cH8,0);ArrayInitialize(cH9,0);ArrayInitialize(cH10,0);
         ArrayInitialize(cH11,0);
         if(filterZigZag==1)
           {
            ArrayResize(cLz1,gbar);ArrayResize(cHz1,gbar);ArrayResize(tLz1,gbar);

            ArrayInitialize(tLz1,0);ArrayInitialize(tLz2,0);ArrayInitialize(tLz3,0);ArrayInitialize(tLz4,0);ArrayInitialize(tLz5,0);
            ArrayInitialize(tLz6,0);ArrayInitialize(tLz7,0);ArrayInitialize(tLz8,0);ArrayInitialize(tLz9,0);ArrayInitialize(tLz10,0);
            ArrayInitialize(tLz11,0);

            ArrayInitialize(cLz1,0);ArrayInitialize(cLz2,0);ArrayInitialize(cLz3,0);ArrayInitialize(cLz4,0);ArrayInitialize(cLz5,0);
            ArrayInitialize(cLz6,0);ArrayInitialize(cLz7,0);ArrayInitialize(cLz8,0);ArrayInitialize(cLz9,0);ArrayInitialize(cLz10,0);
            ArrayInitialize(cLz11,0);
            ArrayInitialize(cHz1,0);ArrayInitialize(cHz2,0);ArrayInitialize(cHz3,0);ArrayInitialize(cHz4,0);ArrayInitialize(cHz5,0);
            ArrayInitialize(cHz6,0);ArrayInitialize(cHz7,0);ArrayInitialize(cHz8,0);ArrayInitialize(cHz9,0);ArrayInitialize(cHz10,0);
            ArrayInitialize(cHz11,0);
           }
Print("");
        }
      else
        {
         if(_PrimarySelectionOfExtremums<2)
           {
            gbar=iBarShift(NULL, gtf, gtime_gbar[0], true)+2;
           }
        }

      if(_PrimarySelectionOfExtremums==4 && gtimelast==iTime(NULL, gtf, 0)) return(0);
      if(tL1[0]>0)
        {
         if(glowBar<=iLow(NULL, gtf, 0) && ghighBar>=iHigh(NULL, gtf, 0) && gtimelast==iTime(NULL, gtf, 0)) return (0);
         if(gtimelast<iTime(NULL, gtf, 0) &&(_PrimarySelectionOfExtremums==2 || _PrimarySelectionOfExtremums==3))
           {
            gTheExternalBar=false; delete_objects();
           }
        }
      glowBar=iLow(NULL, gtf, 0); ghighBar=iHigh(NULL, gtf, 0);                  // обновляем сразу, а не после длительного расчета

      // Поиск экстремумов для первого уровня
      glevel=0;
      SamplingCreationExtremums();

      if(history)
        {

         if(ShowPrimaryLevel==0)
           {
            VisiblePrimarySelections(cL1, cH1, tL1, cLz1, cHz1, tLz1, LowestBuffer1, HighestBuffer1); // визуализация
           }

         // Создание следующих уровней и визуализация
         SelectionArrayForNextLevels();
         gtimelast=iTime(NULL, gtf, 0); // эта переменная используется в промежуточных расчетах, поэтому ее обновляем после расчетов
         history=false;

//*
         // Обрезка массивов
         if(QuantityExtremums>0)
           {
            for(i=1;i<11;i++)
             {
              int k=ScrapOfArrays(i);
              if(k!=0) Print("размер массива уровня ",i-1," = ",k);
              if(k==0) break;
//              if(ScrapOfArrays(i)==0) break;
             }
          }
//*/
        }
      else
        {
         WriteNewExtremums(cL1, cH1, tL1, cLz1, cHz1, tLz1);

         // Создание следующих уровней и визуализация
         SelectionArrayForNextLevels();

         gtimelast=iTime(NULL, gtf, 0); // эта переменная используется в промежуточных расчетах, поэтому ее обновляем после расчетов
        }
      if(gRecalculation>0) gRecalculation--;
     }

   gcurrentBars=iBars(NULL, gtf);       // обновляем в конце, чтобы не накапливались непосчитанные бары за время расчета
                                        // и не срабатывал полный пересчет на следующем тике в случае длительного расчета

Err(371);

   return(0);
  }
//+------------------------------------------------------------------+

Um pequeno pedaço de código. E mais ou menos o mesmo com algumas variações em todos os meus indicadores.

Note que tenho uma área bastante grande onde os amortecedores são reinicializados. Todas as funções do ArrayInitialize estão apenas engajadas em tal reinicialização. Mas isso só acontece quando é necessário, não forçado.

 

Já escrevi na primeira página para que os desenvolvedores explicassem o significado do ponto 6

Terminal: A inicialização dos amortecedores foi acrescentada para indicadores personalizados ao ler novamente os dados históricos.

Nenhuma explicação foi recebida deles ainda. E aqui criamos uma tempestade em um copo d'água. Mas também não é só aqui. Eu avisei a todos, que usam meus indicadores, para esperar antes de baixar o build 387.

 
A discussão está encerrada.
 
Zhunko:

Descobriu porque o complexo não estava funcionando. Adeus otimização :-(

Agora eu tenho que encher novamente os amortecedores em cada carrapato. Cuidados a ter...

Nenhuma mudança - nenhuma iniciação! Pelo menos pense sobre isso!

Eu não leio dados históricos em buffers. Só os uso para varrer na vertical em subjanela. Por que eu preciso preenchê-los o tempo todo? Há apenas três ocasiões em que elas precisam ser sobrescritas (primeira execução, zoom, deslocamento do gráfico). Como está, o MT4 mal consegue se mover, e há mais um freio.


Nenhuma mudança, nenhuma inicialização. É isso mesmo. A inicialização só é feita após os dados históricos terem sido sobregravados. Isto foi previsto antes, só que não funcionou como pretendido. Em condições normais, quando barra após barra (ou várias barras após uma falha de conexão), não há inicialização de buffer.
 

2 Terminal: Cálculo do contador de cotações fixas ao calcular indicadores personalizados.

Houve um erro com a estimativa do número de mudanças nos dados históricos. Com um grande número de mudanças, os dados foram recalculados de forma incorreta, mas não recalculados. Isto afetou especialmente o indicador ZigZag, quando os dados mudaram drasticamente, mas o zig-zag não foi recalculado.

 
VBAG:

Isso é ótimo! Os desenvolvedores não desistiram do B4, mas estão apoiando-o e até mesmo melhorando-o. Isto é simplesmente evidenciado pelo número de construção 387!

A última vez que eu vi foi - 229. E imediatamente - 387 (talvez um coprocessador conectado? Huh ...)! Legal!

O principal é respeitar o mandamento principal do cirurgião-programador - "Não fazer mal!

A plataforma MetaTrader 4 é um conjunto de muitos componentes - servidores, centros de dados, alimentadores de cotações e notícias, terminal do cliente, terminais de gerenciamento e administração, APIs, complementos padrão escritos usando APIs, etc. Estes componentes evoluíram de diferentes maneiras.

Portanto, todos os componentes atuais receberam o número 380, equalizando a numeração das construções. Uma operação puramente cosmética.