Neues MetaTrader 4 Client Terminal 387 und MetaTrader 4 Data Center Build 387 - Seite 4

 
AlexSTAL:

Ich habe die Korrespondenz gelöscht, aber ich verstehe sehr wohl, was Optimierung ohne sie ist...

Geben Sie klar und deutlich mit einem Minimum an Code an, wovor Sie Angst haben, was Sie aber in der Realität nicht reproduziert haben...

Dies ist eine völlig unsinnige Unterhaltung... Keiner meiner Indikatoren fordert mich auf, die Puffer bei jedem Tick neu zu initialisieren...

Deshalb versuche ich zu verstehen, worüber wir hier reden....


an Zhunko: Ich werde später versuchen, es zu verstehen


Wie viel klarer, schrieb ich, dass ich nur eine Berechnung habe:

1) wenn ein neuer Balken erscheint.

2) wenn der Preis die Grenzen des bereits berechneten Teils eines Balkens verlässt (für Hoch oder Tief)

3) drei oder vier letzte Strahlen werden berechnet.

Dies wurde in unserem Schriftwechsel erörtert. Sie sagten, es sei klar.... Oder habe ich umsonst geschrieben?

Wenn bei jedem Tick eine Neuinitialisierung erfolgt, d. h. der Puffer mit Nullen gefüllt wird, muss er bei jedem Tick neu berechnet werden. Dies hat folgende Auswirkungen. Jetzt hat Putnika bis zu 100 Instanzen von ZUP in einem Terminal auf mehreren Karten. Selbst in einem schnellen Markt verlangsamt sich das Terminal nicht sehr stark. Und wenn wir bei jedem Tick eine Neuberechnung vornehmen müssen, wird die Anzahl der gleichzeitig aktivierten Indikatoren um das Zehnfache sinken. Und wenn die Berechnung mit der gesamten verfügbaren Historie durchgeführt wird, kann der Computer nur eine Instanz des Indikators verarbeiten.

Ist das nicht genug?

 
nen:

Wenn bei jedem Tick eine Neuinitialisierung erfolgt, d. h. der Puffer mit Nullen gefüllt wird, muss er bei jedem Tick neu berechnet werden. Dazu gehört Folgendes. Jetzt hat Putnika bis zu 100 Instanzen von ZUP in einem Terminal auf mehreren Karten. Selbst in einem schnellen Markt verlangsamt sich das Terminal nicht sehr stark. Und wenn wir bei jedem Tick eine Neuberechnung vornehmen müssen, wird die Anzahl der gleichzeitig aktivierten Indikatoren um das Zehnfache sinken. Und wenn die Berechnung mit der gesamten verfügbaren Historie durchgeführt wird, kann der Computer nur eine Instanz des Indikators verarbeiten.

Wo steht das geschrieben? Sie können es zuerst überprüfen und erst dann Angst bekommen.
 
nen:


Wie viel deutlicher, schrieb ich, dass ich nur die Berechnung hatte:

1) wenn ein neuer Balken erscheint

2) wenn sich der Preis aus dem bereits berechneten Teil des Balkens herausbewegt (über das Hoch oder Tief)

3) die letzten drei oder vier Takte werden berechnet.

Dies wurde in unserem Schriftwechsel erörtert. Sie sagten, es sei klar.... Oder habe ich umsonst geschrieben?

Wenn bei jedem Tick eine Neuinitialisierung erfolgt, d. h. der Puffer mit Nullen gefüllt wird, muss er bei jedem Tick neu berechnet werden. Dies hat folgende Auswirkungen. Jetzt hat Putnika bis zu 100 Instanzen von ZUP in einem Terminal auf mehreren Karten. Selbst in einem schnellen Markt verlangsamt sich das Terminal nicht sehr stark. Und wenn wir bei jedem Tick eine Neuberechnung vornehmen müssen, wird die Anzahl der gleichzeitig aktivierten Indikatoren um das Zehnfache sinken. Und wenn die Berechnung mit der gesamten verfügbaren Historie durchgeführt wird, kann der Computer nur eine Instanz des Indikators verarbeiten.

Reicht das nicht aus?

Wenn nur, aber wenn nur... Es gibt kein solches Problem! Zhunko hat ein ganz anderes Problem. Bevor Sie eine Panik auslösen, müssen Sie es selbst überprüfen. Ich habe ein paar Beiträge weiter oben überprüft und sogar den Code gepostet
 
Rosh:
Wo steht das? Sie können es zuerst überprüfen und erst dann Angst bekommen.

+10000

In jedem Fall sollte es einen professionellen Ansatz geben....

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

Ein kleiner Teil des Codes. Und ungefähr dasselbe mit einigen Abweichungen bei allen meinen Indikatoren.

Beachten Sie, dass ich einen ziemlich großen Bereich habe, in dem die Puffer neu initialisiert werden. Alle ArrayInitialize-Funktionen sind gerade mit einer solchen Reinitialisierung beschäftigt. Aber das geschieht nur bei Bedarf, nicht gezwungenermaßen.

 

Ich habe bereits auf der ersten Seite für die Entwickler geschrieben, um die Bedeutung von Punkt 6 zu erklären

Terminal: Die Initialisierung von Puffern wurde für benutzerdefinierte Indikatoren hinzugefügt, wenn historische Daten erneut gelesen werden.

Sie haben noch keine Erklärung abgegeben. Und wir erzeugen hier einen Sturm im Wasserglas. Aber es ist nicht nur hier so. Ich habe alle, die meine Indikatoren verwenden, gewarnt, mit dem Download von Build 387 zu warten.

 
Die Diskussion ist beendet.
 
Zhunko:

Ich habe herausgefunden, warum der Komplex nicht funktioniert hat. Optimierung auf Wiedersehen :-(

Jetzt muss ich die Puffer bei jedem Tick neu auffüllen. Ich kümmere mich darum...

Keine Änderung - keine Initialisierung! Denken Sie wenigstens darüber nach!

Ich lese keine historischen Daten in Puffern. Ich verwende sie nur für den vertikalen Sweep im Subwindow. Warum muss ich sie immer wieder auffüllen? Es gibt nur drei Fälle, in denen sie überschrieben werden müssen (erster Lauf, Zoom, Diagrammverschiebung). So wie es ist, kann sich MT4 kaum bewegen, und es gibt noch eine weitere Bremse.


Keine Änderung, keine Initialisierung. Das ist richtig. Die Initialisierung erfolgt erst, nachdem die historischen Daten überschrieben worden sind. Das war schon einmal geplant, hat aber nicht wie vorgesehen funktioniert. Unter normalen Bedingungen, d. h. wenn ein Takt nach dem anderen (oder mehrere Takte nach einem Verbindungsabbruch) angezeigt werden, findet keine Pufferinitialisierung statt.
 

2 Terminal: Die Berechnung des Kurszählers bei der Berechnung von benutzerdefinierten Indikatoren wurde korrigiert.

Es gab einen Fehler bei der Schätzung der Anzahl der Änderungen in den historischen Daten. Bei einer großen Anzahl von Änderungen wurden die Daten falsch neu berechnet, aber nicht neu berechnet. Dies betraf insbesondere den ZigZag-Indikator, wenn sich die Daten drastisch geändert haben, der ZigZag aber nicht neu berechnet wurde.

 
VBAG:

Das ist großartig! Die Entwickler haben die B4 nicht aufgegeben, sondern unterstützen sie und verbessern sie sogar. Das beweist allein schon die Baunummer 387!

Das letzte, was ich gesehen habe, war - 229. Und auf einmal - 387 (vielleicht ein angeschlossener Coprozessor? Hm ...)! Super!

Die Hauptsache ist, das Hauptgebot des Chirurgen-Programmierers zu respektieren - "Tue nichts Böses!

Die MetaTrader 4-Plattform besteht aus einer Vielzahl von Komponenten: Server, Datenzentren, Kurs- und Nachrichtenfeeder, Kundenterminal, Manager- und Administrator-Terminals, APIs, Standard-Add-ons, die mit Hilfe von APIs geschrieben wurden, usw. Diese Komponenten haben sich auf unterschiedliche Weise entwickelt.

Daher haben alle aktuellen Komponenten die Nummer 380 erhalten, wodurch die Nummerierung der Builds angeglichen wurde. Es handelt sich um einen rein kosmetischen Eingriff.