Hatalar, hatalar, sorular - sayfa 577

 
papaklass :

...

TAMAM. Pozisyonunuz açık.
 

Gerçek hayatta tek bir çekirdeğin gücünden yoksun böyle bir danışmanı hayal etmek bile zor. Örneğin, Uzman Danışman test cihazında günde bir sembolün yıllık geçmişini bir kez geçerse (bu çok fazla! Muhtemelen kodun yeniden yazılması gerekiyor!), o zaman gerçek hayatta işlemciyi şu kadar yükleyecektir: ortalama 1/250 güç = %0.4

On sembolle ilgili bir danışman için ortalama yük %4'tür. Diğer kernelleri yüklemenin pek bir anlamı yok.

 

Konstantin ( Lizar ) fikrine gelince, bence fena değil. Ancak bu tür kararlar için, doğrudan grafikten gelen olayları ve özel olarak oluşturulan olayları ayırmaktan zarar gelmez. Onlar. iki olay kuyruğuna ve buna bağlı olarak iki işleyiciye sahip olmak güzel olurdu (özel olaylar için OnUserEvents gibi bir şey).

Ayrıca, özel olaylara ilginç bir ekleme, önceliklerini açıkça belirtme yeteneği olacaktır (0'dan 9'a kadar), bu da kullanıcının belirli olayların önceden alınmasını ve işlenmesini kontrol etmesine izin verebilir. Örneğin, böyle bir fırsat, daha düşük bir değere sahip olayları yürütmeye ve daha büyük bir kuyruktan kaldırmaya izin verir (kuyruk daha önemli olaylarla doluysa, yenileri sıraya alınmaz).

papaklass :

Hiç yazılım geliştirme yapmadım, bu yüzden yazılım geliştiricilerin teknik dilini konuşamam. 4 çekirdekli bilgisayarımdan ve MT5'ten ne almak istediğimi anlatacağım. Genel olarak, şöyle görünür:


1. Birkaç aracı işlemek şu anda bile mümkündür ve burada geliştiriciler tamamen uygulanabilir bir çözüm yaratmışlardır.

2. Test cihazının çalışması ve bir grup çekirdek pahasına. Bu özel bir durumdur ve bu mekanizmayı gerçek ticaretle karşılaştırmak temelde doğru değildir. Sorunu test cihazıyla çözmenin özü, bir uzman için birkaç seçeneğe (veya daha doğrusu bir uzman + bir dizi benzersiz parametre kümesine) sahip olmanın, hesaplamaları mevcut tüm çekirdeklere / aracılara dağıtmanın oldukça mantıklı olmasıdır. Böylece, tüm görev kümesi için eşzamansız hale geliriz, ancak tek bir aracının bakış açısından her şey senkronize edilir.

3. Çoklu kullanım söz konusu olduğunda, aynı anda birkaç sembolü işlemekle ilgili değil, aynı anda birkaç olayı işlemekle ilgilidir (ve belirli bir bireysel Uzman Danışman çerçevesinde). Terminalin birden fazla versiyonunda ne yoktu.

Geliştiriciler de anlaşılabilir: genel giderler çok yüksek, kullanıcıların bileşimi çok "çeşitli", veri senkronizasyonunda "çok iş parçacıklı" bir Uzman Danışmanın erişebileceği çok fazla sorun var, vb.

Öte yandan, olaylarla ilgili fikir mantıksal sonuna getirilmez. Peki, "çoklu iş parçacığı" uygulamak pahalı ve sorunludur, ancak terminalin kendi içinde süreçleri ve bilgi akışlarını mümkün olduğunca paralel hale getirebilirsiniz + maksimum sayıda görevi (ve normal bir parametre kümesiyle) çözmeye yetecek bir dizi işleyici oluşturun ).

 
papaklass :

01/04/2010 - 09/01/2011 dönemi için M5'te 12 para biriminde Uzman Danışmanım 1436 saniyede (24 dakika) tek geçiş yapmakta ve aynı zamanda 5687 işlem yapmaktadır. Bu durumda sadece bir çekirdek yüklenir ve diğer üçü boşta kalır. Yani her geçişte platformun bilgisayarın gücünü kullanmamasından dolayı zamanın 3/4'ünü kaybediyorum. Bir stratejide hata ayıklarken bu, platformun önemli bir dezavantajıdır. Çekirdekler tamamen yalnızca optimizasyon için kullanılır. Ancak optimizasyon, tek çalıştırmalardan çok daha nadirdir. Ve tek seferde çok fazla zaman kaybedilir.

"Zamanın 3/4'ünü kaybetti" yaklaşımı, ne düşündüğünüzü gösterir: çoklu iş parçacığı kullanımı, birdenbire kaçırılan bir fırsattır ve geliştiricinin net bir şekilde gözden kaçırılmasıdır.

Ne yazık ki, sıralı görevlerde çoklu kullanım (ve test cihazının tek geçişi sıralı bir görevdir) ücretsiz değildir. Gerçekte, çoklu kullanım, süreç senkronizasyonu için çok büyük (bazen birden fazla) kayıplara sahiptir. Aslında, paylaşılan kaynaklara tüm erişimlerin senkronizörlerle bağlanması gerekir.

Test cihazının test süresinin neredeyse %99'unda herhangi bir engelleme olmadan tek bir iş parçacığında çalışmasını sağlamak için test cihazını kasıtlı olarak terminalden ayrı bir işleme taşıdık. Bu, hızda önemli bir artış sağladı.

"Her uzmana çoklu görev uygulayalım" cümlesi, bu durumda çoklu kullanım maliyetinin (toplam yavaşlama) ve sonuçlarının (profesyonel olmayan geliştiricilerin %99'u için yavaşlama + çatının yıkılması) tamamen yanlış anlaşılmasından kaynaklanmaktadır.


Terminalde ve test cihazında çoklu görev kullanma sorunlarını etkin bir şekilde çözdük ve uzak aracı ve MQL5 Cloud Network modlarında neredeyse sınırsız güç ölçeklendirme modunu etkinleştirdik.


Terminaliniz hakkında bilgim yok. Benim için, 12 çizelge açıp üzerlerine bir gösterge asarsam, çıplak gözle, zaman içinde bazı noktalarda terminalin nasıl yavaşlamaya başladığını görüyorum. Forumdaki mesajlara bakılırsa, bu sadece benim başıma gelmiyor. Yani bunlar tek göstergeli 12 enstrüman. Aletlerin ve göstergelerin sayısını artırmam gerekirse, terminal düşecek. Ve aynı zamanda, bir çekirdek kullanılacak ve geri kalanı dinlenecek. Peki diğer çekirdekleri yüklemek mantıklı mı? Terminal işlemlerini çekirdekler arasında dağıtırken, yani. bilgisayar gücünün tam kullanımı, farklı bir düzeydeki sorunları çözmek mümkün olacaktır. Ben bundan bahsediyorum.

Farklı sembollere sahip 12 farklı çizelge varsa, o zaman her bir çizelgenin sembolü, diğerlerini etkilemeden açıkça kendi akışında çalışır.

Grafikler yavaşlamaya başlarsa, bunun nedeni banaldır - göstergelerden biri çok ekonomik değildir. Bu durumda, çoklu görev yardımcı olmaz, çünkü kök, alnına göstergeler yazan, verimliliği önemsemeyen bir programcının çalışmasının sonuçlarındadır.

 

Ters grafiği alamıyorum, bir şey anlamıyorum, bu seçenekte yeni çubuk hatalı

Baktığım orijinal göstergeyi ekliyorum

 int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---- проверка количества баров на достаточность для расчета
   for ( int numb= 0 ; numb< 8 ; numb++) if ( BarsCalculated (RSI_Handle[numb])<rates_total) return (RESET);
   if (rates_total<min_rates_total) return (RESET);

//---- объявления локальных переменных 
   int to_copy;

//---- расчеты необходимого количества копируемых данных
   if (prev_calculated>rates_total || prev_calculated<= 0 ) // проверка на первый старт расчета индикатора
      to_copy=rates_total- 1 ;                   // стартовый номер для расчета всех баров
   else to_copy=rates_total-prev_calculated+ 1 ; // стартовый номер для расчета новых баров
   
//---- копируем вновь появившиеся данные в массивы
   if ( CopyBuffer (RSI_Handle[ 0 ], 0 , 0 ,to_copy,Buffer1)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 1 ], 0 , 0 ,to_copy,Buffer2)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 2 ], 0 , 0 ,to_copy,Buffer3)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 3 ], 0 , 0 ,to_copy,Buffer4)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 4 ], 0 , 0 ,to_copy,Buffer5)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 5 ], 0 , 0 ,to_copy,Buffer6)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 6 ], 0 , 0 ,to_copy,Buffer7)<= 0 ) return (RESET);
   if ( CopyBuffer (RSI_Handle[ 7 ], 0 , 0 ,to_copy,Buffer8)<= 0 ) return (RESET);
   
   //мой кусок отсель   
   if (Reverse)
      {
         int start=prev_calculated;
         for ( int i=start;i<rates_total;i++)
            {
               Buffer1[i]= 100 -Buffer1[i];
               Buffer2[i]= 100 -Buffer2[i];
               Buffer3[i]= 100 -Buffer3[i];
               Buffer4[i]= 100 -Buffer4[i];
               Buffer5[i]= 100 -Buffer5[i];
               Buffer6[i]= 100 -Buffer6[i];
            }
         Buffer1[ 0 ]= 100 -Buffer1[ 0 ];
         Buffer2[ 0 ]= 100 -Buffer2[ 0 ];
         Buffer3[ 0 ]= 100 -Buffer3[ 0 ];
         Buffer4[ 0 ]= 100 -Buffer4[ 0 ];
         Buffer5[ 0 ]= 100 -Buffer5[ 0 ];
         Buffer6[ 0 ]= 100 -Buffer6[ 0 ];
       }  
   //досель    

//----     
   return (rates_total);
  }
//+------------------------------------------------------------------+

Dosyalar:
Multi_RSI.mq5  15 kb
 

bana sorunun ne olduğunu söyle

çoklu para birimi yaz

MA gösterge tutamağını al

maHandle_EURUSD= iMA ( "EURUSD" , PERIOD_H1 ,MA_Period_EURUSD,MA_Shift_EURUSD, MODE_SMA , PRICE_CLOSE );

maHandle_GBPUSD= iMA ( "GBPUSD" , PERIOD_H1 ,MA_Period_GBPUSD,MA_Shift_GBPUSD, MODE_SMA , PRICE_CLOSE ); 

Aynısını şampiyonada izin verilen diğer 10 para birimi için yapıyorum, ancak test ederken hemen 4801 hatası veriyor, 12 para biriminin tümü geçmişte (bir çeşit)

Testi EURUSD grafiğinde çalıştırıyorum

danışman GBPUSD çiftini test ediyor (en iyi duruma getirmek için ayarlarda ayarladım)

 
Lazarev :

bana sorunun ne olduğunu söyle

çoklu para birimi yaz

MA gösterge tutamağını al

Aynısını şampiyonada izin verilen diğer 10 para birimi için yapıyorum, ancak test ederken hemen 4801 hatası veriyor, 12 para biriminin tümü geçmişte (bir çeşit)

Testi EURUSD grafiğinde çalıştırıyorum

danışman GBPUSD çiftini test ediyor (en iyi duruma getirmek için ayarlarda ayarladım)

"Piyasa İzleme" SymbolSelect'e sembol eklemeniz gerekiyor
 

papaklass :

Şimdi bana bu basit soruyu cevapla...

Kibarca olmasa da daha basit cevap vereceğim.

Ne yazık ki, kesinlikle temassızsınız ve süreçler hakkında yalnızca yüzeysel fikirler gösteren açıklamalar yapıyorsunuz.

Korkarım ki, teknik argümanlarımızın çoğu anlaşılmayacak, tıpkı temel senkronizasyon sorunu ve onun sağlanmasındaki kayıp bile anlaşılmadığı gibi.

Not: talepte bulunmanıza gerek yok "ve bize argümanları anlatın, biz de akıl yürütelim", durum kesinlikle açık

 

Acemiye söyle ve şu soruların cevaplarını bulamadın:

1) Bir sonraki öğeyi dinamik bir diziye eklerken, ArrayResize kullanılarak genişletilmesi gerekiyor mu?

2) MQL5'te dinamik dizi i'den bir öğeyi kaldırmak için bir işlev var mı (biri - örneğin, dizinin ortasında) ? Değilse, dili kullanarak bunu yapmanın en iyi yolu nedir?

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Fia :

Acemiye söyle ve şu soruların cevaplarını bulamadın:

1) Bir sonraki öğeyi dinamik bir diziye eklerken, ArrayResize kullanılarak genişletilmesi gerekiyor mu?

Dizinin boyutunu biraz kenar boşluğu ile yapın, sınıra yaklaşırken boyutu artırın. Boyutta otomatik artış ve sona ekleme yoktur. ArrayInitialize () işlevi için örneğe bakın