MetaTrader 4 Client Terminal 387 ve MetaTrader 4 Data Center build 387'nin yeni versiyonu - sayfa 4

 
AlexSTAL :

Yazışmayı sildim, ancak onsuz bile optimizasyonun ne olduğunu çok iyi anlıyorum ...

Açıkçası, minimal bir kod yardımıyla, korktuğunuz şeyi formüle edin, ancak gerçekte yeniden üretmediğinizi…

Konuşmanın tamamen aptalca olduğu ortaya çıkıyor... Göstergelerin hiçbiri, her bir onay işaretinde arabellekleri yeniden başlatmamı gerektirmiyor...

Bu yüzden tüm bunların neyle ilgili olduğunu anlamaya çalışıyorum...


Zhunko'ya: sonra yazdıklarımı içmeye çalışacağım


Çok daha net, sadece hesapladığımı yazdım:

1) yeni bir çubuk göründüğünde

2) fiyat, çubuğun önceden hesaplanmış kısmının ötesine geçtiğinde (yüksek veya düşük için)

3) üç veya dört son kiriş hesaplanır.

Bu bizim yazışmamızda vardı. Bunun anlaşılabilir olduğunu söylediniz .... yoksa boşuna mı yazdım?

Her tikte yeniden başlatma varsa, yani arabellek sıfırlarla doldurulursa, her tikte yeniden hesaplanması gerekecektir. Bu, aşağıdakilere yol açacaktır. Şimdi Putnika'nın birkaç çizelgede bir terminalde 100'e kadar ZUP kopyası var. Aynı zamanda hızlı bir pazarda bile terminal fazla yavaşlamıyor. Ve her tikte yeniden hesaplamanız gerekiyorsa, aynı anda etkinleştirilen göstergelerin sayısı on kat azalacaktır. Ve mevcut geçmişin tamamı üzerinde bir hesaplama varsa, bilgisayar genellikle göstergenin yalnızca bir örneğine dayanacaktır.

Bu yeterli değil mi?

 
nen :

Her tikte yeniden başlatma varsa, yani arabellek sıfırlarla doldurulursa, her tikte yeniden hesaplanması gerekecektir. Bu, aşağıdakilere yol açacaktır. Şimdi Putnika'nın birkaç çizelgede bir terminalde 100'e kadar ZUP kopyası var. Aynı zamanda hızlı bir pazarda bile terminal fazla yavaşlamıyor. Ve her tikte yeniden hesaplamanız gerekiyorsa, aynı anda etkinleştirilen göstergelerin sayısı on kat azalacaktır. Ve mevcut geçmişin tamamı üzerinde bir hesaplama varsa, bilgisayar genellikle göstergenin yalnızca bir örneğine dayanacaktır.

Ve nerede yazıyor? Sonuçta, önce kontrol edebilir ve ancak o zaman korkabilirsiniz.
 
nen :


Çok daha net, sadece hesapladığımı yazdım:

1) yeni bir çubuk göründüğünde

2) fiyat, çubuğun önceden hesaplanmış kısmının ötesine geçtiğinde (yüksek veya düşük için)

3) üç veya dört son kiriş hesaplanır.

Bu bizim yazışmamızda vardı. Bunun anlaşılabilir olduğunu söylediniz .... yoksa boşuna mı yazdım?

Her tıklamada yeniden başlatma varsa, yani arabellek sıfırlarla doldurulursa, her onayda yeniden hesaplamanız gerekir . Bu, aşağıdakilere yol açacaktır. Şimdi Putnika'nın birkaç çizelgede bir terminalde 100'e kadar ZUP kopyası var. Aynı zamanda hızlı bir pazarda bile terminal fazla yavaşlamıyor. Ve her tikte yeniden hesaplamanız gerekiyorsa, aynı anda etkinleştirilen göstergelerin sayısı on kat azalacaktır. Ve mevcut geçmişin tamamı üzerinde bir hesaplama varsa, bilgisayar genellikle göstergenin yalnızca bir örneğine dayanacaktır.

Bu yeterli değil mi?

Keşke, evet, olsaydı... Böyle bir sorun yok! Zhunko'nun tamamen farklı bir sorunu var. Panik yapmadan önce kendinizi kontrol etmeniz gerekir. Yukarıdaki birkaç gönderiyi kontrol ettim ve hatta kodu gönderdim
 
Rosh :
Ve nerede yazıyor? Sonuçta, önce kontrol edebilir ve ancak o zaman korkabilirsiniz.

+10000

Her durumda profesyonel bir yaklaşım olmalı ....

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

Küçük bir kod parçası. Ve tüm göstergelerde sahip olduğum bazı varyasyonlarla yaklaşık olarak aynı.

Tamponların yeniden başlatıldığı oldukça geniş bir alanım olduğunu unutmayın. Tüm ArrayInitialize işlevleri tam olarak bu tür yeniden başlatma işlemini gerçekleştirir. Ama bu mecburiyetten değil mecburiyetten oluyor.

 

6. paragrafın anlamını geliştiriciler için ilk sayfada yazdım

Terminal: Geçmiş verileri yeniden okurken özel göstergeler için arabelleklerin başlatılması eklendi.

Şu ana kadar kendilerinden bir açıklama yapılmadı. Ve burada bir çay fincanı içinde bir fırtına yaratıyoruz. Ama sadece burada değil. Göstergelerimi kullanan herkesi 387 yapısını yüklemeyi ertelemek için uyardım.

 
Tartışma bitti.
 
Zhunko :

Kompleksin neden çalışmadığını anladım. Hoşçakal optimizasyonu :-(

Şimdi arabelleklerin her onay için yeniden doldurulması gerekiyor. Bakımlı denir...

Değişiklik yok - başlatma yok! En azından iyice düşün!

Arabelleklerdeki geçmiş verileri okumuyorum. Bunları yalnızca bir alt pencerede dikey tarama için kullanıyorum. Neden onları her zaman doldurmam gerekiyor? Yeniden yazılmaları gereken yalnızca üç durum vardır (ilk çalıştırma, yakınlaştırma, grafik kaydırma). Ve böylece MT4 zar zor dönüyor ve dönüyor ve işte başka bir fren.


Değişiklik yok - başlatma yok. Her şey doğru. Başlatma, yalnızca geçmiş verileri yeniden okuduktan sonra gerçekleştirilir. Bu daha önce sağlandı, ancak amaçlandığı gibi çalışmadı. Normal koşullar altında, ardı ardına çubuklar gittiğinde (veya bir bağlantı kesintisinden sonra birkaç çubuk), arabelleklerin başlatılması gerçekleştirilmez.
 

2 Terminal: Özel göstergeler hesaplanırken sabit fiyat sayacı hesaplaması.

Geçmiş verilerdeki değişikliklerin sayısı tahmin edilirken bir hata oluştu. Çok sayıda değişiklikle, yeniden hesaplama değil, verilerin hesaplanması hatalı olarak çağrıldı. Bu, veriler önemli ölçüde değiştiğinde ve ZigZag yeniden hesaplanmadığında özellikle ZigZag göstergesini etkiledi.

 
VBAG :

Bu harika! Geliştiricilerin dörde puan vermediğini, ancak onu desteklediğini ve hatta iyileştirdiğini. Bu basitçe yapı numarası ile kanıtlanmıştır - 387!

En son gördüğüm 229'du. Ve hemen - 387 (belki yardımcı işlemci bağlıydı? Vay canına ...)! Güzel!

Ana şey, aynı zamanda cerrah-programcının ana emrinin de gözlenmesidir - "Zarar verme!"

MetaTrader 4 platformu, sunucular, veri merkezleri, alıntılar ve haber besleyicileri, bir istemci terminali, yönetici ve yönetici terminalleri, API, API kullanılarak yazılan bileşenler için standart eklentiler gibi birçok bileşenin birleşimidir. Bu bileşenler farklı şekillerde gelişmiştir.

Bu nedenle, mevcut tüm bileşenlere, yapıların numaralandırılmasını eşitleyen 380 sayısı atanmıştır. Tamamen estetik cerrahi.