MT5 ve iş başında hız - sayfa 56

 
Renat Akhtyamov :
Beyler progerler...
Önce bir bilgisayarda bellek tahsisi hakkında bilgi edinin, ardından bunun nasıl ve hangi yollarla gerçekleştirildiğini, ardından nasıl temizleneceğini ve buradan ve buradan nasıl okunacağını okuyun. kr göre. geliştiricilere mümkün olduğunca daha makul teklifler

Bunu mt4'te bile bilmiyor muydunuz?
Önceden tanımlanmış Ask Bid'i kendiniz mi kullanıyorsunuz?
MT5'te tüm MqlTick yapısı için, nedense öyle değiller.
Fonksiyonu çağırın, yapıyı doldurun ve ancak o zaman değeri alın.
Ya da hemen değerini alın, fark var mı?

Yoksa benim yönümde değil mi?
En azından kime yazdığımı belirtirdim))

 
Roman :

Mevcut kene için önceden tanımlanmış değişkenler muhtemelen daha iyi olurdu.

Geliştiriciler daha önce doğrudan erişimde temel bir sınırlama olduğunu açıklamıştı.

 void f()
{
         MqlTick t1 = _Tick;
         MqlTick t2 = _Tick;
}

ve genel olarak t1, t2'ye eşit değildir. Ayrıca, hem t1 hem de t2'nin içindeki alanların değerleri, nihayetinde genel olarak farklı kenelere atıfta bulunabilir.

 
A100 :

Geliştiriciler daha önce doğrudan erişimde temel bir sınırlama olduğunu açıklamıştı.

ve genel olarak t1, t2'ye eşit değildir. Ayrıca, hem t1 hem de t2 içindeki alanların değerleri, ilgili alanlar olmasına rağmen (bir onay işaretini göstermelidir) genellikle farklı onay işaretlerine atıfta bulunabilir.

Brr, temel sınırlama nedir?
Örneğinizdeki yapı burada gereksiz, doldurulması gerekmiyor.

Soketten bir değer geldi, onu _Ask, _Bid vb. değişkene yazdık. yapıya göre.
_Sor != _Size göre sorun?
Kısıtlama, biraz zaman alan yapıyı doldurursanız gerçekleşir.
Doldurmanıza gerek yok, ancak doğrudan _Ask, _Bid, vb. verin.

 
Roman :

Brr, temel sınırlama nedir?
Örneğinizdeki yapı burada gereksiz, doldurulması gerekmiyor.

 void f()
{
         double ask1 = _Ask;
         double ask2 = _Ask;
}

Yapı olmadan yeniden yazmak mümkündür. Genel olarak, ask1 ask2'ye eşit değildir

 
A100 :

Yapı olmadan yeniden yazmak mümkündür. Genel olarak, ask1 ask2'ye eşit değildir

Onlar. bunlar senkron olmayan bir ortama yapılan isteklerdir ve cevap ortamın mevcut durumuna göre mi alınır? Ve OnTick mevcut keneyi yakalar ve yalnızca EA'yı çözer, ancak aynı zamanda EA'yı çalıştırırken kene yapısıyla ilgili sorgular sonraki tiklerden yanıt alabilir mi?

 
A100 :

Yapı olmadan yeniden yazmak mümkündür. Genel olarak, ask1 ask2'ye eşit değildir

Yani gerçek sayının son basamağının 0.00000000000000000001 olduğu 100500 basamak kullanmanıza gerek yoktur.
Her değişkenin kendi rakamları vardır, çift fiyatlar için maksimum 8'dir.

 
Renat Fatkhullin :

Önemli olandan beta 2652'yi yayınladılar:

  • geliştirilmiş derleme iptali (%22 oranında)
  • SymbolInfoTick'e erişimin temel hızlandırılması

%22 - mükemmel.

SymbolInfoTick - bir ev makinesinde, uyarmadığını gözle fark ettim. Ancak Journal'da bu uyarılar hakkında bir filtre yaptım ve bir gün önce aynı dönem için yayınlanan 2650'den çok daha fazla olduğunu gördüm.

Her iki günlüğü de PM'ye gönderdi.

 
Valeriy Yastremskiy :

Onlar. bunlar senkron olmayan bir ortama yapılan isteklerdir ve cevap ortamın mevcut durumuna göre mi alınır? Ve OnTick mevcut keneyi yakalar ve yalnızca EA'yı çözer, ancak aynı zamanda EA'yı çalıştırırken kene yapısıyla ilgili sorgular sonraki tiklerden yanıt alabilir mi?

Evet.

 
Renat Fatkhullin :

Kenelerle toplu çalışma için daha fazla bellek ayarlayın.

Analitik ve araştırma söz konusu olduğunda 4 GB (fiyatı 20 Euro) 2020'de iyi değil.

Bu, CopyTicks'e bir kerelik bir çağrıdır. Gerçek hayatta OnInit'te bu keneler üzerinde sanal bir backtest yapmak ve daha sonra sadece taze keneleri besleyerek gerçek zamanlı olarak devam ettirmek için yapılır.

Bir uzlaşma olarak, OnInit'te CopyTicks çağrıldıktan sonra, Terminal'deki belleği hemen serbest bırakmanızı öneririm. O zaman CopyTicks zorlamalı soğutma fonksiyonuna giremezsiniz.

Şimdi Uyku - bir soğutma seçeneği - çok koltuk değneği. Ancak yukarıda, bu koltuk değneğinin hafızayı nasıl kurtardığını gösterdi.


Şimdi, 20 danışmanın yavaş bir VPS'de bile hızlı bir şekilde sürdüğü ortaya çıktı. Ama başlamaları ciddi bir sorun.


İşte sorunu gösteren bir EA.

 // Демонстрация 10-ти секундного удержания в памяти ненужных данных CopyTicks.
#define PRINT(A) Print ( #A + " = " + ( string )(A))

input datetime inFrom = D'2020.06.01' ; // С какой даты анализировать историю

int OnInit ()
{
   MqlTick Ticks[];
  
   Print ( "Before CopyTicks:" );
  PRINT( MQLInfoInteger ( MQL_MEMORY_USED ));     
  PRINT( TerminalInfoInteger ( TERMINAL_MEMORY_USED ));
  
  PRINT( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , ( long )inFrom * 1000 ));
   ArrayFree (Ticks);
  
   Print ( "After CopyTicks:" );
  
   for ( int i = 0 ; i < 10 ; i++)
  {
    PRINT(i);
    PRINT( MQLInfoInteger ( MQL_MEMORY_USED ));    
    PRINT( TerminalInfoInteger ( TERMINAL_MEMORY_USED ));
    
     Sleep ( 1000 );
  }
  
   return ( INIT_FAILED );
}


Sonuç.

 2020.10 . 14 08 : 49 : 24.016 Before CopyTicks :
2020.10 . 14 08 : 49 : 24.016 MQLInfoInteger ( MQL_MEMORY_USED ) = 0
2020.10 . 14 08 : 49 : 24.031 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 864
2020.10 . 14 08 : 49 : 25.399 CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 14372119
2020.10 . 14 08 : 49 : 25.465 After CopyTicks :
2020.10 . 14 08 : 49 : 25.465 i = 0
2020.10 . 14 08 : 49 : 25.465 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 25.499 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 26.594 i = 1
2020.10 . 14 08 : 49 : 26.594 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 26.630 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 27.729 i = 2
2020.10 . 14 08 : 49 : 27.729 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 27.762 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 28.852 i = 3
2020.10 . 14 08 : 49 : 28.852 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 28.884 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 29.977 i = 4
2020.10 . 14 08 : 49 : 29.977 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 30.009 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 31.102 i = 5
2020.10 . 14 08 : 49 : 31.102 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 31.136 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 32.224 i = 6
2020.10 . 14 08 : 49 : 32.225 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 32.257 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 33.348 i = 7
2020.10 . 14 08 : 49 : 33.348 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 33.381 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 34.468 i = 8
2020.10 . 14 08 : 49 : 34.468 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 34.501 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1796
2020.10 . 14 08 : 49 : 35.593 i = 9
2020.10 . 14 08 : 49 : 35.593 MQLInfoInteger ( MQL_MEMORY_USED ) = 1
2020.10 . 14 08 : 49 : 35.605 TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 860
 
fxsaber :

%22 - mükemmel.

SymbolInfoTick - bir ev makinesinde, uyarmadığını gözle fark ettim. Ancak Journal'da bu uyarılar hakkında bir filtre yaptım ve bir gün önce aynı dönem için yayınlanan 2650'den çok daha fazla olduğunu gördüm.

Her iki günlüğü de PM'ye gönderdi.

Büyük paralel erişim durumlarında onlarca kat daha hızlı.

Diğer durumlarda, yalnızca işlemci, bellek ve işletim sistemlerinin yükseltilmesi.

Neden: