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

 
Roman :

Tamam, yeniden ifade edeceğim. İşlemcinin saat hızına bağlı olarak mql içinde bu kabaca mümkündür.
Peki ya PWM? - sabit frekans ve değişken görev döngüsü darbe sinyali.
Kalıcılık sağlamaz mı?

Başlamak için WinAPI Uyku işlevinin ne olduğunu ve gerçekte ne yaptığını okuyun.

PS Windows gerçek zamanlı bir sistem değil

 
Slava :

Başlamak için WinAPI Uyku işlevinin ne olduğunu ve gerçekte ne yaptığını okuyun.

PS Windows gerçek zamanlı bir sistem değil

Hmm, sormaktan utanıyorum, WinAPI Sleep'in bununla ne ilgisi var?
Bir mikro saniye kaymasından bahsettiğimizde
İşlemciniz için ayrı ayrı zamanlayıcının frekansını belirleyebilir ve tekrar sayısını hesaplayabilirsiniz.
Yani, kendi MicrosecondCount'unuzu mql olarak yazabilirsiniz, ama ne anlamı var? Standart olan yeterli.

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman :

Hmm, sormaktan utanıyorum, WinAPI Sleep'in bununla ne ilgisi var?
Bir mikro saniye kaymasından bahsettiğimizde
İşlemciniz için ayrı ayrı zamanlayıcının frekansını belirleyebilir ve tekrar sayısını hesaplayabilirsiniz.
Yani, kendi MicrosecondCount'unuzu mql olarak yazabilirsiniz, ama ne anlamı var? Standart olan yeterli.

Bağlam anahtarı olmadan bekleyen uykusu, çekirdeğini %100 tüketir.

Bu korkunç bir programlama tekniği. Allah korusun böyle bir kod piyasaya sızacak.

 
Renat Fatkhullin :

Bağlam anahtarı olmadan bekleyen uykusu, çekirdeğini %100 tüketecektir.

Korkunç bir programlama tekniği. Allah korusun böyle bir kod piyasaya sızacak.

Ve kimse bu hardcore'u inkar etmedi   ))
Bir bağlam değiştirme örneği gösterirseniz, geliştirilebilir mi?

Yalnızca 2 çekirdekli, 4 iş parçacığı ayrılmış VirtualBox'ta µsSLEEP(µsRange) için CPU kullanımı.
Madenciler daha kötü yanar))

cp

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Kitaplıklar: Sıra

fxsaber , 2020.10.13 12:54

Çoğu VPS'yi öldürecek bir EA örneği.
 #include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

#define PRINT(A) Print ( #A + " = " + ( string )(A))

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

void OnInit ()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
     MqlTick Ticks[];
    
    PRINT( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_ALL , ( long )inFrom * 1000 ));
    PRINT( TerminalInfoInteger ( TERMINAL_MEMORY_USED ));
    
     Sleep ( 10000 ); // Ждем освобождения CopyTicks-данных.
  }
}


Farklı sembollerden oluşan birkaç çizelgede başlatıyoruz. Bu eylemi otomatikleştirmek için bu betiği inAmount = 5 ile kullandım.


Sonuç.

 2020.10 . 13 13 : 26 : 53.199 Test9 (AUDCAD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 5406953
2020.10 . 13 13 : 26 : 53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 2838
2020.10 . 13 13 : 26 : 53.528 Test9 (EURCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 3430958
2020.10 . 13 13 : 26 : 53.807 Test9 (EURCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 3144
2020.10 . 13 13 : 26 : 53.924 Test9 (EURUSD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 4244747
2020.10 . 13 13 : 26 : 54.214 Test9 (EURUSD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 3464
2020.10 . 13 13 : 26 : 54.344 Test9 (AUDCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 4327679
2020.10 . 13 13 : 26 : 54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 3797
2020.10 . 13 13 : 26 : 54.864 Test9 (GBPCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 5340006
2020.10 . 13 13 : 26 : 55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 4308
2020.10 . 13 13 : 26 : 55.666 Test9 (EURAUD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 7730155
2020.10 . 13 13 : 26 : 55.756 Test9 (EURAUD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 4316

Bu altı Uzman Danışmanı çalıştırmak için Terminal tarafından 4 Gb'den fazla bellek gerekliydi. Bunun yalnızca başlatma için gerekli olduğunu, ancak bu Uzman Danışmanların çalışması için gerekli olmadığını unutmayın. İçinde Uzman Danışmanların asılı olduğu bir Terminal başlattığınızı hayal edin. Dürüst ücretsiz 4 Gb RAM yoksa - neredeyse bir felaket.


Şimdi kaynak koddaki bu satırın yorumunu kaldıracağız.

   if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

Böylece, Expert Advisors'ın sıralı başlatılmasını sağlar.


Sonuca bakıyoruz (yeniden derlemeden sonra).

 2020.10 . 13 13 : 27 : 24.002 Test9 (AUDCAD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 5406980
2020.10 . 13 13 : 27 : 24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1234
2020.10 . 13 13 : 27 : 35.407 Test9 (EURUSD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 4244772
2020.10 . 13 13 : 27 : 35.422 Test9 (EURUSD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1095
2020.10 . 13 13 : 27 : 46.886 Test9 (GBPCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 5340072
2020.10 . 13 13 : 27 : 46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1224
2020.10 . 13 13 : 27 : 58.293 Test9 (AUDCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 4327724
2020.10 . 13 13 : 27 : 58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1114
2020.10 . 13 13 : 28 : 09.683 Test9 (EURCHF,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 3430999
2020.10 . 13 13 : 28 : 09.696 Test9 (EURCHF,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1015
2020.10 . 13 13 : 28 : 21.339 Test9 (EURAUD,H1)       CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_ALL ,( long )inFrom* 1000 ) = 7730313
2020.10 . 13 13 : 28 : 21.363 Test9 (EURAUD,H1)       TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1519


Expert Advisors'ın piyasaya sürülmesiyle, Terminal'in bellek tüketimini 2,5 Gb'den fazla azaltmak mümkün oldu. Bir VPS felaketi (ve zayıf ev makineleri) olasılığı büyük ölçüde azaltıldı.


Her iki fırlatma da dinamik olarak böyle görünüyor.

Sıralı başlatma, genel başlatmayı zaman içinde uzattı, ancak Terminal'i büyük RAM tüketiminden korumayı başardı.


Üst ve alt grafikler, paralel başlatma (yüksek sol tepe) ve ardışık altı başlatma (altı orta tepe) sürecini açıkça göstermektedir.


Tehdit Deneyler sırasında, Uyku ile ilgili hoş olmayan bir nüans ortaya çıktı - kaynağa bakın.


CopyTicks'i kullandıktan sonra belleğin zorla boşaltılmasına bir şekilde izin vermenizi rica ediyorum. Böyle Uyku koltuk değneği yaratmamak için.

 
Lütfen belirli bir aralıktaki kenelerin geçmişini sorgulamak için bellek tüketimi açısından en ucuz yolu önerin.
 
fxsaber :
Lütfen belirli bir aralıktaki kenelerin geçmişini sorgulamak için bellek tüketimi açısından en ucuz yolu önerin.

bence ucuz değil, hafızayı hızlı bir şekilde boşaltmanın bir yolunu arıyorsunuz

kontrol etmek için bir seçenek olarak:

- dinamik bir MqlTick Ticks[] dizisini bir sınıfa sarın ve yeni (yani aynı zamanda dinamik bir nesne) aracılığıyla bir nesne oluşturun, gerekmediğinde silin

- aynı, ancak bir yapıyla, ancak yerel kapsamda (bir işlev veya yerel bir blok { } - veya bir yinelemeli bir döngü? ), yapılar sınıflar gibi çalışmaz - EA kodunun çoğunu şu şekilde yeniden yazdı: sınıflardan uzaklaşmak ve veri yapılarını değiştirmek, optimizasyon hızını önemli ölçüde artırdı - belki öznel olarak - belki yeni yapılar daha hızlı çalışır

- yıkıcıya ArrayFree() eklemeyi deneyin

 
Igor Makanu :

bence ucuz değil, hafızayı hızlı bir şekilde boşaltmanın bir yolunu arıyorsunuz

Terminal belleği serbest bırakmaz. MQL değişkenlerinin bununla hiçbir ilgisi yoktur.

 
fxsaber :

Terminal belleği serbest bırakmaz. MQL değişkenlerinin bununla hiçbir ilgisi yoktur.

ve boyutu ayarlamak için zorlarsanız = 1 ?

ve eğer yaparsan

 MqlTick   Tick[];
MqlTick   ZeroTick[ 1 ] = { 0 };
.....
ArrayResize (Tick, 1 );
ArrayCopy (Tick,ZeroTick)
 
Igor Makanu :

ve eğer

CopyTicks'i çağırdıktan sonra, Terminal tüm verileri birkaç saniyeliğine hafızasında tutar. Birisi kene geçmişinin bir parçasını yeniden okumak isterse diye.

Onlar. Terminal tarafından tüketilen bellek miktarı hiçbir şekilde MQL değişkenlerinin boyutlarına bağlı değildir.


Görev, Terminal'i boş belleği zorlamaya zorlamaktır.