Nuovo MetaTrader 4 Client Terminal 387 e MetaTrader 4 Data Center build 387 - pagina 4

 
AlexSTAL:

Ho cancellato la corrispondenza, ma capisco perfettamente cos'è l'ottimizzazione senza di essa...

Dichiarate chiaramente con un minimo di codice ciò che temete, ma che non avete riprodotto nella realtà...

Questa è una conversazione completamente inane... Nessuno dei miei indicatori mi chiede di reinizializzare i buffer ad ogni tick...

Ecco perché sto cercando di capire di cosa stiamo parlando....


a Zhunko: cercherò di capirlo più tardi


Quanto più chiaro, ho scritto, che ho solo un calcolo:

1) quando appare una nuova barra.

2) quando il prezzo lascia i confini della parte già calcolata di una barra (per alto o basso)

3) si calcolano tre o quattro ultimi raggi.

Questo è stato discusso nella nostra corrispondenza. Hai detto che era chiaro.... O ho scritto invano?

Se ci sarà una reinizializzazione ad ogni tick, cioè il riempimento del buffer con degli zeri, dovrà essere ricalcolato ad ogni tick. Questo causerà quanto segue. Ora Putnika ha fino a 100 istanze di ZUP in un terminale su diversi grafici. Anche in un mercato veloce il terminale non rallenta molto. E se dobbiamo ricalcolare su ogni tick, il numero di indicatori attivati simultaneamente diminuirà di dieci volte. E se il calcolo viene eseguito su tutta la storia disponibile, il computer sarà in grado di gestire una sola istanza dell'indicatore.

Non è abbastanza?

 
nen:

Se ci sarà una reinizializzazione ad ogni tick, cioè il riempimento del buffer con degli zeri, dovrà essere ricalcolato ad ogni tick. Questo comporterà quanto segue. Ora Putnika ha fino a 100 istanze di ZUP in un terminale su diversi grafici. Anche in un mercato veloce il terminale non rallenta molto. E se dobbiamo ricalcolare su ogni tick, il numero di indicatori attivati simultaneamente diminuirà di dieci volte. E se il calcolo viene eseguito su tutta la storia disponibile, il computer sarà in grado di gestire una sola istanza dell'indicatore.

Dove è scritto? Si può controllare prima e solo dopo spaventarsi.
 
nen:


Come molto più chiaro, ho scritto che ho avuto solo il calcolo:

1) quando appare una nuova barra

2) quando il prezzo si muove oltre la parte già calcolata della barra (oltre il massimo o il minimo)

3) si calcolano le ultime tre o quattro barre.

Questo è stato discusso nella nostra corrispondenza. Hai detto che era chiaro.... O ho scritto invano?

Se ci sarà una reinizializzazione ad ogni tick, cioè il riempimento del buffer con degli zeri, dovrà ricalcolare ad ogni tick. Questo causerà quanto segue. Ora Putnika ha fino a 100 istanze di ZUP in un terminale su diversi grafici. Anche in un mercato veloce il terminale non rallenta molto. E se dobbiamo ricalcolare su ogni tick, il numero di indicatori attivati simultaneamente diminuirà di dieci volte. E se il calcolo viene eseguito su tutta la storia disponibile, il computer sarà in grado di gestire una sola istanza dell'indicatore.

Non è abbastanza?

Se solo, ma se solo... Non c'è nessun problema! Zhunko ha un problema completamente diverso. Prima di scatenare il panico è necessario controllare di persona. Ho controllato alcuni post sopra e ho anche postato il codice
 
Rosh:
Dove lo dice? Si può controllare prima e solo dopo spaventarsi.

+10000

In ogni caso ci dovrebbe essere un approccio professionale ....

 
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 piccolo pezzo di codice. E circa lo stesso con alcune variazioni in tutti i miei indicatori.

Notate che ho un'area piuttosto grande dove i buffer vengono reinizializzati. Tutte le funzioni ArrayInitialize sono solo impegnate in tale reinizializzazione. Ma avviene solo se necessario, non forzato.

 

Ho già scritto nella prima pagina per gli sviluppatori di spiegare il significato del punto 6

Terminale: è stata aggiunta l'inizializzazione dei buffer per gli indicatori personalizzati quando si rileggono i dati storici.

Nessuna spiegazione è stata ancora ricevuta da loro. E qui creiamo una tempesta in un bicchiere d'acqua. Ma non è solo qui. Ho avvertito tutti quelli che usano i miei indicatori di aspettare prima di scaricare la build 387.

 
La discussione è finita.
 
Zhunko:

Ho capito perché il complesso non funzionava. Addio ottimizzazione :-(

Ora devo riempire nuovamente i buffer ad ogni tick. Preso cura di...

Nessun cambiamento - nessuna inizializzazione! Almeno pensaci!

Non leggo i dati storici nei buffer. Li uso solo per lo sweep verticale in sottofinestra. Perché devo sempre riempirli? Ci sono solo tre occasioni in cui devono essere sovrascritti (prima esecuzione, zoom, spostamento del grafico). Così com'è, MT4 può a malapena muoversi, e c'è un altro freno.


Nessun cambiamento, nessuna inizializzazione. Proprio così. L'inizializzazione viene fatta solo dopo che i dati storici sono stati sovrascritti. Questo era previsto prima, solo che non ha funzionato come previsto. In condizioni normali, quando una barra dopo l'altra (o diverse barre dopo un errore di connessione), non c'è inizializzazione del buffer.
 

2 Terminale: Calcolo del contatore delle quotazioni fisso quando si calcolano gli indicatori personalizzati.

C'è stato un errore nella stima del numero di cambiamenti nei dati storici. Con un gran numero di modifiche, i dati sono stati ricalcolati in modo errato, ma non ricalcolati. Questo ha colpito soprattutto l'indicatore ZigZag, quando i dati sono cambiati drasticamente, ma lo zigzag non è stato ricalcolato.

 
VBAG:

È fantastico! Gli sviluppatori non hanno abbandonato il B4, ma lo stanno supportando e addirittura migliorando. Questo è semplicemente evidenziato dal numero di costruzione 387!

L'ultimo che ho visto era - 229. E subito - 387 (forse un coprocessore collegato? Huh...)! Fico!

La cosa principale è rispettare il comandamento principale del chirurgo-programmatore - "Non nuocere!

La piattaforma MetaTrader 4 è un insieme di molti componenti - server, centri dati, alimentatori di quotazioni e notizie, terminale client, terminali di gestione e amministratore, API, componenti aggiuntivi standard scritti utilizzando le API, ecc. Questi componenti si sono evoluti in modi diversi.

Pertanto, a tutti i componenti attuali è stato dato il numero 380, equiparando la numerazione delle build. Un'operazione puramente estetica.