Kütüphaneler: MultiTester - sayfa 30

 
Stanislav Korotky #:

Kaynak değişikliklerinde pano ile ilgili bir şey yapıldığını görmedim.

  static bool GetSettings2( string &Str, const int Attempts = 10 )
  {
    bool Res = false;

    if (MTTESTER::LockWaiting())
    {
      Res = MTTESTER::GetSettings(Str, Attempts);

      MTTESTER::Lock(false);
    }

    return(Res);
  }

Optimizasyonu çalıştırırsanız, mevcut tüm çekirdekleri bir kerede almaz mı? Tek bir testin optimizasyondan bir çekirdeği nasıl "aldığını" anlamıyorum (aslında, MT'yi optimize eden 2 ajan bile devre dışı olarak işaretlenmiştir).

Sanırım hemen yazdım. Optimize Edici Terminal'in iki devre dışı ajanı vardır. Her etkin ajan bir çekirdek alır.

 
fxsaber #:

Sanırım hemen yazdım. Optimising Terminal'in iki devre dışı aracı vardır. Etkinleştirilen her ajan bir çekirdek alır.

Açıkça manuel devre dışı bırakma (veya aracıların diğer yapılandırmaları) hakkında hiçbir şey söylemiyor - ve bu nüans hala atlanıyor. Paralel çalışmanın ne kadarının otomatikleştirildiği konusunda soru sormamın nedeni de bu. Konudan ve blog açıklamasından safça tam otomasyonun yapıldığını düşündüm.

LockWaiting görüldü - dosya işini kilitleme olarak formüle ettiğim şey buydu. Kilidin pano dahil kaynaklara erişmek için kullanılabileceği açıktır. Terminolojik karışıklık.

NOT. Belki bir şeyi yanlış anlıyorum, ancak panoya yalnızca özel erişim gerekiyorsa, aynı kilidi (periyodik kontrollere sahip bir döngü) panonun kendi işlevleri üzerinde yapmak daha mantıklıdır (OpenClipboard, kaynak kodda zaten belirtilmiştir).

 
Stanislav Korotky #:

Açıkça, aracıların manuel olarak devre dışı bırakılması (veya başka bir şekilde yapılandırılması) hakkında hiçbir şey söylemiyor - ve bu nüans hala atlanıyor. Paralel çalışmanın ne kadarının otomatikleştirildiği konusunda soru sormamın nedeni de bu. Konudan ve blog açıklamasından safça tam otomasyonun yapıldığını düşündüm.

MQ tarafında tam otomasyon. Herhangi bir makinede, tek terminalle çalışıyor olsam bile, 1-2 aracıyı kapatıyorum, böylece makinede gecikme olmadan çalışabiliyorum.


Terminal1 (Optimizasyon): Ajanlar 3000-3017 - etkin, 30018-3019 - devre dışı. Yani tüm terminallerde, çünkü diğer tüm terminaller ilkinin tam bir kopyasıdır. Hiçbir manuel ayar yapılmaz.

Terminal2 - tek geçişler için.


İki senaryo.

  1. Önce Terminal1'de optimizasyonu çalıştırdım, 3000-3017 açıktı. Sonra Terminal2'de tekli geçişler - 3018 çalışıyor.
  2. Önce Terminal2'de tekli geçişler çalıştırıldı, 3000 açıldı. Sonra Terminal1'de optimizasyon - 3001-3018 çalışıyor.
MQ tarafında her şey otomatiktir. Kontrol etmeniz bir dakika sürer. Diyalog çok daha fazla zaman aldı.
 
Stanislav Korotky #:

NOT. Muhtemelen bir şeyleri yanlış anlıyorum, ancak panoya yalnızca istisnai erişim gerekiyorsa, aynı kilidi (periyodik kontrollerle döngü) panonun kendi işlevleri üzerinde yapmak daha mantıklı olacaktır (OpenClipboard, kaynaklarda zaten belirtilmiştir).

Böyle bir çözümde mantık göremiyorum.

 
fxsaber #:

MQ tarafında tam otomasyon. Herhangi bir makinede, tek terminalle çalışsam bile, 1-2 ajanı kapatıyorum, böylece makinede gecikme olmadan çalışabiliyorum.


Terminal1 (Optimizasyon): Temsilciler 3000-3017 - etkin, 30018-3019 - devre dışı. Yani tüm terminallerde, çünkü diğer tüm terminaller ilkinin tam bir kopyasıdır. Hiçbir manuel ayar yapılmaz.

Terminal2 - tek geçişler için.


İki senaryo.

  1. Önce Terminal1'de optimizasyonu çalıştırdım, 3000-3017 açık. Sonra Terminal2'de tekli çalıştırdım - 3018 çalışıyor.
  2. Önce Terminal2'de tekli çalıştırdım, 3000 çalışıyor. Ardından Terminal1 - 3001-3018 üzerinde optimizasyon çalışır.
MQ tarafında her şey otomatiktir. Kontrol etmeniz bir dakika sürer. Diyalog çok daha fazla zaman aldı.

Bu açıklama blogda yer alsaydı, hiçbir soru olmazdı. Yine, bu açıklama aracıların manuel olarak yapılandırılması anlamına geliyor, otomasyon değil. Kontrol edilecek bir şey yok.

 
Stanislav Korotky #:

Bu açıklama blogda yer alsaydı, hiçbir soru olmazdı. Yine, bu açıklama aracıların manuel olarak yapılandırılması anlamına geliyor, otomasyon değil. Kontrol edilecek bir şey yok.

Manuel yapılandırma yoktur. Aracılarla hiçbir şey yapamazsınız, davranış değişmez. Şaşırtıcı.

 
fxsaber #:

Manuel yapılandırma yoktur. Aracılara hiçbir şey yapamazsınız, davranışları değişmez. Şaşırtıcı.

"Paralel Testçilerle çalışırken olası çatışmaları önlemek için" denmiştir. Bu ifade çekirdekler bağlamında yanıltıcıdır, çünkü aslında yapılan şey aracıların manuel olarak yapılandırılmasıdır. Bazı nedenlerden dolayı bağlantı noktası tahsisini çekirdeklerle ilişkilendirmekte ısrar ediyorsunuz. Portlar çakışamaz, ancak çekirdekler (süreçler) çakışabilir - bu sadece ön yapılandırmaya bağlıdır. Sanırım paralel süreçler arasında otomatik çakışma çözümü konusunda farklı kavramlara sahibiz.

 
Stanislav Korotky #:

"Paralel Testçilerle çalışırken olası çatışmaları önlemek için" denilmiştir. Bu ifade çekirdekler bağlamında yanıltıcıdır, çünkü aslında aracıların yapılandırılması manuel olarak yapılır.

"Atlatma" kelimesini yanlış yorumlamışsınız. Sorun, birden fazla terminal aynı anda pano ile çalıştığında ortaya çıkar. Eskiden bir terminaldeki işler yanlışlıkla başka bir terminale girebilirdi. Şimdi bu engellenmiştir.

 

MTTester.mqh'de aşağıdaki değişiklikler mevcuttur.

  • GetLastTstCacheFileName artık yol olmadan tst dosyasının adını döndürür.
  • GetLastTstCache, yeni tamamlanan geçişe karşılık gelen tst dosyasını getirme özelliğine sahiptir. Bu, hatalı tst dosyalarının getirilmesini önler.
  • ClickStart, Test Cihazı Başlat düğmesine basıldığında anında tepki verdiğinde bile doğru şekilde çalışır. Bu gibi durumlarda ClickStart, Başlat düğmesine yine de başarıyla basıldığını algılar.
 

Bazen aynı şeyi çalışan terminallerde de yapmanız gerekir. Bu eylemin otomasyonu aşağıdaki örnekte gösterilmiştir.


Benzer bir RunMe.mq5 betiğini çalıştırarak her terminalde veri toplamak gerekir.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/tr/code/26132
  
void OnStart()
{
  if (MTTESTER::LockWaiting()) // Eylemleri sırayla gerçekleştirmek istiyorsanız.
  {
    const int handle = ::FileOpen(__FILE__, FILE_WRITE | FILE_READ | FILE_ANSI | FILE_COMMON);

    // Gerekli verileri dosyaya yazın.
    if (handle != INVALID_HANDLE)      
    {
      FileSeek(handle, 0, SEEK_END);
      FileWriteString(handle, "Account = " + (string)AccountInfoInteger(ACCOUNT_LOGIN) + ", " +
                              "Balance = " + (string)AccountInfoDouble(ACCOUNT_BALANCE) + "\n");
      
      FileClose(handle);
    }

    MTTESTER::Lock(false); // Paralel yürütme kilidini serbest bırakın.
  }
}


Bu şekilde yapılır.

// Komut dosyasını tüm terminallerde çalıştırın.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/tr/code/26132
  
void OnStart()
{
  HANDLE Handles[]; 
  
  // Tüm terminalleri çalıştırın
  for (int i = MTTESTER::GetTerminalHandles(Handles) - 1; i >= 0; i--)
    MTTESTER::RunEX5("Scripts\\RunMe.ex5", Handles[i], true); // ve her birinde uygun komut dosyasını çalıştırın.
}


Sonuç olarak tek bir tıklama ile tüm terminallerden veri toplamış olduk. MTTESTER::RunEX5 sayesinde - EX5'i gerekli terminalde çalıştırır (taşınabilir).