Nuevo terminal de cliente de MetaTrader 4 387 y centro de datos de MetaTrader 4 build 387 - página 4

 
AlexSTAL:

He borrado la correspondencia, pero entiendo perfectamente lo que es la optimización sin ella...

Exponga claramente con un mínimo de código lo que teme, pero que no ha reproducido en la realidad...

Esta es una conversación completamente inane... Ninguno de mis indicadores me pide que reinicie los buffers en cada tick...

Por eso estoy tratando de entender de qué estamos hablando....


a Zhunko: Trataré de entenderlo más tarde


Cuánto más claro, escribí, que en mí sólo hay un cálculo:

1) cuando aparece una nueva barra.

2) cuando el precio sale de los límites de la parte ya calculada de una barra (para el máximo o el mínimo)

3) se calculan tres o cuatro últimas vigas.

Esto se discutió en nuestra correspondencia. Dijiste que era claro.... ¿O he escrito en vano?

Si se produce una reinicialización en cada tick, es decir, llenando el buffer con ceros, tendrá que recalcular en cada tick. Esto provocará lo siguiente. Ahora Putnika tiene hasta 100 instancias de ZUP en un terminal en varias cartas. Incluso en un mercado rápido el terminal no se ralentiza mucho. Y si tenemos que recalcular en cada tic, el número de indicadores activados simultáneamente se multiplicará por diez. Y si el cálculo se realiza sobre todo el historial disponible, el ordenador sólo podrá manejar una instancia del indicador.

¿No es suficiente?

 
nen:

Si hay una reinicialización en cada tick, es decir, llenando el buffer con ceros, tendrá que ser recalculado en cada tick. Esto implicará lo siguiente. Ahora Putnika tiene hasta 100 instancias de ZUP en un terminal en varias cartas. Incluso en un mercado rápido el terminal no se ralentiza mucho. Y si tenemos que recalcular en cada tic, el número de indicadores activados simultáneamente se multiplicará por diez. Y si el cálculo se realiza sobre todo el historial disponible, el ordenador sólo podrá manejar una instancia del indicador.

¿Dónde está escrito? Puedes comprobarlo primero y sólo entonces asustarte.
 
nen:


Cuanto más claro, escribí que sólo tenía el cálculo:

1) cuando aparece una nueva barra

2) cuando el precio se sale de la parte ya calculada de la barra (por encima del máximo o del mínimo)

3) se calculan los tres o cuatro últimos compases.

Esto se discutió en nuestra correspondencia. Dijiste que era claro.... ¿O he escrito en vano?

Si se produce una reinicialización en cada tic, es decir, llenando el buffer con ceros, habrá que volver a calcularlo en cada tic. Esto provocará lo siguiente. Ahora Putnika tiene hasta 100 instancias de ZUP en un terminal en varias cartas. Incluso en un mercado rápido el terminal no se ralentiza mucho. Y si tenemos que recalcular en cada tic, el número de indicadores activados simultáneamente se multiplicará por diez. Y si el cálculo se realiza sobre todo el historial disponible, el ordenador sólo podrá manejar una instancia del indicador.

¿No es suficiente?

Si sólo, pero si sólo... No hay ningún problema. Zhunko tiene un problema completamente diferente. Antes de que cunda el pánico hay que comprobarlo por uno mismo. He comprobado unos cuantos posts más arriba e incluso he publicado el código
 
Rosh:
¿Dónde dice eso? Puedes comprobarlo primero y sólo entonces asustarte.

+10000

En todos los casos debe haber un enfoque profesional....

 
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);
  }
//+------------------------------------------------------------------+

Un pequeño trozo de código. Y más o menos lo mismo con algunas variaciones en todos mis indicadores.

Tenga en cuenta que tengo un área bastante grande donde los búferes son reiniciados. Todas las funciones ArrayInitialize sólo se dedican a dicha reinicialización. Pero sólo ocurre cuando es necesario, no es forzado.

 

Ya escribí en la primera página para que los desarrolladores explicaran el significado del punto 6

Terminal: Se ha añadido la inicialización de los buffers para los indicadores personalizados al volver a leer los datos históricos.

Todavía no se ha recibido ninguna explicación por su parte. Y aquí creamos una tormenta en un vaso de agua. Pero tampoco es sólo aquí. He advertido a todos los que utilizan mis indicadores que esperen antes de descargar la versión 387.

 
La discusión ha terminado.
 
Zhunko:

Descubrí por qué el complejo no funcionaba. Adiós a la optimización :-(

Ahora tengo que rellenar los buffers en cada tic. Se ha cuidado...

Ningún cambio - ¡ninguna inicialización! Al menos piénsalo.

No leo los datos históricos en los buffers. Sólo los utilizo para el barrido vertical en la subventana. ¿Por qué tengo que llenarlos todo el tiempo? Sólo hay tres ocasiones en las que es necesario sobrescribirlas (primera ejecución, zoom, cambio de gráfico). Tal como está, MT4 apenas puede moverse, y hay un freno más.


No hay cambio, no hay inicialización. Así es. La inicialización sólo se realiza después de sobrescribir los datos históricos. Esto ya estaba previsto, sólo que no funcionó como se pretendía. En condiciones normales, cuando se produce una barra tras otra (o varias barras tras un fallo de conexión), no se produce la inicialización del búfer.
 

2 Terminal: Corregido el cálculo del contador de cotizaciones al calcular los indicadores personalizados.

Hubo un error con la estimación del número de cambios en los datos históricos. Con un gran número de cambios, los datos se recalcularon incorrectamente, pero no se recalcularon. Esto afectó especialmente al indicador ZigZag, cuando los datos han cambiado drásticamente, pero el zigzag no fue recalculado.

 
VBAG:

¡Eso es genial! Los desarrolladores no han renunciado a la cuarta, sino que la mantienen e incluso la perfeccionan. ¡Esto se demuestra simplemente con el número de construcción 387!

Lo último que vi fue - 229. ¡Y a la vez - 387 (¿quizás un coprocesador conectado? Huh...)! ¡Genial!

Lo principal es respetar el mandamiento principal del cirujano-programador: "¡No hacer daño!

La plataforma MetaTrader 4 es un conjunto de muchos componentes: servidores, centros de datos, alimentadores de cotizaciones y noticias, terminal de cliente, terminales de gestor y administrador, APIs, complementos estándar escritos mediante APIs, etc. Estos componentes han evolucionado de diferentes maneras.

Por lo tanto, todos los componentes actuales han recibido el número 380, igualando la numeración de las construcciones. Una operación puramente cosmética.

Razón de la queja: