Nouveau MetaTrader 4 Client Terminal 387 et MetaTrader 4 Data Center build 387 - page 4

 
AlexSTAL:

J'ai supprimé la correspondance, mais je comprends parfaitement ce qu'est l'optimisation sans elle...

Énoncez clairement, avec un minimum de code, ce dont vous avez peur, mais que vous n'avez pas reproduit dans la réalité...

C'est une conversation complètement inepte... Aucun de mes indicateurs ne me demande de réinitialiser les buffers à chaque tick...

C'est pourquoi j'essaie de comprendre ce dont nous parlons. ....


à Zhunko : J'essaierai de le comprendre plus tard.


Comme il est plus clair, ai-je écrit, que je n'ai qu'un calcul :

1) lorsqu'une nouvelle barre apparaît.

2) lorsque le prix quitte les limites de la partie déjà calculée d'une barre (pour le haut ou le bas).

3) trois ou quatre derniers faisceaux sont calculés.

Ce point a été discuté dans notre correspondance. Vous avez dit que c'était clair.... Ou ai-je écrit en vain ?

S'il y a une réinitialisation à chaque tick, c'est-à-dire si le tampon est rempli de zéros, il devra être recalculé à chaque tick. Cela entraîne les conséquences suivantes. Aujourd'hui, Putnika a jusqu'à 100 occurrences de ZUP dans un terminal sur plusieurs cartes. Même dans un marché rapide, le terminal ne ralentit pas beaucoup. Et si nous devons recalculer à chaque tick, le nombre d'indicateurs activés simultanément sera décuplé. Et si le calcul est effectué sur l'ensemble de l'historique disponible, l'ordinateur ne pourra gérer qu'une seule instance de l'indicateur.

Ce n'est pas suffisant ?

 
nen:

S'il y a réinitialisation à chaque tick, c'est-à-dire remplissage du tampon avec des zéros, il devra être recalculé à chaque tick. Les tâches à accomplir sont les suivantes. Aujourd'hui, Putnika a jusqu'à 100 occurrences de ZUP dans un terminal sur plusieurs cartes. Même dans un marché rapide, le terminal ne ralentit pas beaucoup. Et si nous devons recalculer à chaque tick, le nombre d'indicateurs activés simultanément sera décuplé. Et si le calcul est effectué sur l'ensemble de l'historique disponible, l'ordinateur ne pourra gérer qu'une seule instance de l'indicateur.

Où est-ce que c'est écrit ? Vous pouvez d'abord le vérifier et ensuite seulement avoir peur.
 
nen:


Comme c'est plus clair, j'ai écrit que je n'avais que le calcul :

1) lorsqu'une nouvelle barre apparaît

2) lorsque le prix se déplace au-delà de la partie déjà calculée de la barre (au-delà du haut ou du bas).

3) les trois ou quatre dernières mesures sont calculées.

Ce point a été discuté dans notre correspondance. Vous avez dit que c'était clair.... Ou ai-je écrit en vain ?

S'il y a réinitialisation à chaque tick, c'est-à-dire remplissage du tampon avec des zéros, il faudra recalculer à chaque tick. Cela entraîne les conséquences suivantes. Aujourd'hui, Putnika a jusqu'à 100 occurrences de ZUP dans un terminal sur plusieurs cartes. Même dans un marché rapide, le terminal ne ralentit pas beaucoup. Et si nous devons recalculer à chaque tick, le nombre d'indicateurs activés simultanément sera décuplé. Et si le calcul est effectué sur l'ensemble de l'historique disponible, l'ordinateur ne pourra gérer qu'une seule instance de l'indicateur.

Ce n'est pas suffisant ?

Si seulement, mais si seulement... Il n'y a pas de tel problème ! Zhunko a un problème complètement différent. Avant de soulever une panique, vous devez la vérifier vous-même. J'ai vérifié quelques posts au-dessus et j'ai même posté le code
 
Rosh:
Où est-ce que ça dit ça ? Vous pouvez d'abord le vérifier et ensuite seulement avoir peur.

+10000

Dans tous les cas, il doit y avoir une approche professionnelle.....

 
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 petit morceau de code. Et à peu près la même chose avec quelques variations dans tous mes indicateurs.

Notez que j'ai une zone assez large où les tampons sont réinitialisés. Toutes les fonctions ArrayInitialize sont juste engagées dans cette réinitialisation. Mais cela ne se fait qu'en cas de besoin, pas de manière forcée.

 

J'ai déjà écrit sur la première page pour que les développeurs expliquent la signification du point 6

Terminal : L'initialisation des tampons a été ajoutée pour les indicateurs personnalisés lors de la relecture des données historiques.

Aucune explication n'a encore été reçue de leur part. Et nous créons une tempête dans un verre d'eau ici. Mais ce n'est pas seulement ici. J'ai prévenu tous ceux qui utilisent mes indicateurs d'attendre avant de télécharger la version 387.

 
La discussion est terminée.
 
Zhunko:

J'ai trouvé pourquoi le complexe ne fonctionnait pas. Au revoir l'optimisation :-(

Maintenant, je dois recharger les tampons à chaque tic. Pris en charge...

Pas de changement - pas d'initialisation ! Au moins, pensez-y !

Je ne lis pas les données historiques dans les tampons. Je ne les utilise que pour le balayage vertical en sous-fenêtre. Pourquoi dois-je les remplir tout le temps ? Il n'y a que trois occasions où ils doivent être écrasés (première exécution, zoom, déplacement du graphique). En l'état actuel des choses, MT4 peut à peine bouger, et il y a un frein supplémentaire.


Pas de changement, pas d'initialisation. C'est vrai. L'initialisation ne se fait qu'après l'écrasement des données historiques. Cela a été envisagé auparavant, mais cela n'a pas fonctionné comme prévu. Dans des conditions normales, lorsque les barres se succèdent (ou plusieurs barres après un échec de connexion), il n'y a pas d'initialisation du tampon.
 

2 Terminal : Correction du calcul du compteur de cotation lors du calcul des indicateurs personnalisés.

Il y a eu une erreur dans l'estimation du nombre de changements dans les données historiques. Avec un grand nombre de modifications, les données ont été recalculées de manière incorrecte, mais pas recalculées. Cela a particulièrement affecté l'indicateur ZigZag, lorsque les données ont changé de façon spectaculaire, mais que le zigzag n'a pas été recalculé.

 
VBAG:

C'est génial ! Les développeurs n'ont pas abandonné le B4, mais le soutiennent et l'améliorent même. Le numéro de construction 387 en est la preuve.

La dernière fois que je l'ai vue, c'était le 229. Et d'un seul coup - 387 (peut-être un coprocesseur connecté ? Huh...) ! Cool !

L'essentiel est de respecter le principal commandement du chirurgien-programmeur : "Ne pas faire de mal !

La plateforme MetaTrader 4 est un ensemble de nombreux composants : serveurs, centres de données, sources de cotations et d'informations, terminal client, terminaux du gestionnaire et de l'administrateur, API, modules complémentaires standard écrits à l'aide d'API, etc. Ces composants ont évolué de différentes manières.

Par conséquent, tous les composants actuels ont reçu le numéro 380, égalisant ainsi la numérotation des constructions. C'est une opération purement esthétique.