Hatalar, hatalar, sorular - sayfa 2652

 
Алексей Тарабанов :

Neyden korkuyorsun? Gelin birlikte faydalı bir şeyler yapalım.

Stanislav , KB'de fevkalade yararlı bir senaryo yayınladı . Dosyaları ve kaynakları içeren MQL işleriyle kolayca arşivler oluşturun.

Yüzlerce mqh dosyası içeren bir EA'm var. Bir script yardımıyla artık kaynak kodlarındaki danışmanı, kontrol versiyonlarını kolayca aktarabiliyor ve başkalarıyla paylaşabiliyorum.

MQL5 Program Packer
MQL5 Program Packer
  • www.mql5.com
This script allows you to assemble a zip-file of your MQL5-program with all dependencies automatically. The dependencies are: included source files via #include directive (both modes of absolute () and relative ("") references are supported); icons linked by #property icon directive; resources (images, sounds, and other types) embedded by...
 
 
Vladislav Andruschenko :
Teşekkür ederim. Grafiğin olayları için seçenekleri analiz etmeye ve kontrol etmeye çalışacağım.

Şubeye bir göz atın, geçenlerde konuyu detaylı bir şekilde çözdüm - https://www.mql5.com/en/forum/327888

EventChartCustom => indicator is too slow
EventChartCustom => indicator is too slow
  • 2019.12.06
  • www.mql5.com
Использую в советнике для получения тиков с других инструментов "индикатор-шпион": Периодически в журнале появляются записи "indicator is too slow...
 
Anton Shpilyuk:

2 ) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы)

 это так?

"Zaman kopya oranlarına göre çubuk indeksi al" konusunda

Korkunç, gerçekten! Görev, göstergenin kendisi M5 zaman diliminde çalışmasına rağmen, göstergedeki M1 zaman çerçevesinin çubuklarını almaktı.

1. Gösterge başlamadan önce yüklenmesi için OnCalculate() içinde gerekli zaman çerçevesini başlatmam gerekiyordu (başlatmadan sonra FirstStartFlag flag = false;). Göstergelerde yüklenmemişse -1 vereceğini veya tam yüklü olmadığını hatırlayalım bu yüzden ne kadar yüklendiğini kontrol ediyoruz, yeterli değilse başlangıç dönüşüne gidiyoruz ( 0 );

dizi bildir MqlRates oranları[]; başında, burada cnt_bars* 5 ; - M1'deki M5 çubuklarının sayısını yeniden hesaplayın

 //--- загрузка данных М1 таймфрейма для поминутной экспирации в оптимизаторе   
   if (FirstStartFlag) 
      {
         int count = cnt_bars* 5 ;
         int copied= CopyRates ( _Symbol , PERIOD_M1 , 0 ,count,rates);
         if (copied> 0 ) 
            {
               if (debug) Print ( "Скопировано баров: " + IntegerToString (copied)+ ", надо было " + IntegerToString (count)); 
               if (copied<count)
                  {
                       Print ( "Не удалось получить достаточно исторических данных, ждем" );
                       return ( 0 );
                  }
                
            }
         else   
            {
               Print ( "Не удалось получить исторические данные, ждем" );
               return ( 0 );
            } 
         ArraySetAsSeries (rates, true );  
      }

Bundan sonra, istenen fonksiyonun gövdesinde, hesaplamalar sırasında her seferinde M1 için geçmiş verileri güncelleriz:

 //--- загрузка актуальных данных М1 таймфрейма для поминутной экспирации в оптимизаторе    
   int count = cnt_bars* 5 ;
   copied= CopyRates ( _Symbol , PERIOD_M1 , 0 ,count,rates);
   if (copied> 0 ) 
      {
         Print ( "cnt_Statist() Скопировано баров: " + IntegerToString (copied)+ ", надо было " + IntegerToString (count)); 
         if (copied<count)
            {
                 Print ( "cnt_Statist() Не удалось получить достаточно исторических данных" );
            }
          
      }
   else   
      {
         Print ( "cnt_Statist() Не удалось получить исторические данные" ); 
      } 
   ArraySetAsSeries (rates, true );  

Daha sonra, M5 çubuğu yineleme döngüsünde, karşılık gelen M1 çubuğunun indeksi için iç içe bir arama döngüsü yaparız, zaman[s] - zaman çerçevesinin geçerli işlenmiş M5 çubuğu :

                           for (h=copied- 1 ;h> 0 ;h--)
                              {
                                 if (rates[h].time == time[s])
                                    {
                                       IndexRates = h;
                                       break ;
                                    }
                              }

O zaman bu dizini M1 çubukları için gerekli verileri bulmak için kullanırız, benim durumumda, oranlar[IndexRates-5].time and Rates[IndexRates-k-4].close

Tanrıya şükür, bu iç içe döngü, çubuklar arasında hızla yinelenir. 90 günlük bir tarihte bile. Ve böylece, ArrayBsearch işlevini kullanarak ikili arama türüne göre Rate[].time dizisindeki çubuk dizinini arayabilmek istiyorum.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aşağıdaki satırlar için derleyici farkları nelerdir?
 Print ( "123" "456" );
Print ( "123" + "456" );
Print ( "123" , "456" );
 
MQL yavaş yavaş moralini bozuyor:
 #ifdef __cplusplus
     #include<iostream>
     #include<stdio.h>
#endif

class input_iterator_tag  {};
class output_iterator_tag {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};

struct MyIterator{
public :
   int index;
   class iterator_category : public random_access_iterator_tag{};
   
   MyIterator( int __index = 0 ):index(__index){}
   
   bool operator !=(MyIterator &it){
       return index != it.index;
   }
   
   int operator -(MyIterator &it){
       return index - it.index;
   };
   
   MyIterator operator ++(){
      index+= 1 ;
#ifdef __cplusplus
       return * this ;
#else
       return this ;
#endif 
   } 
};

template < typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, input_iterator_tag*){
     int __r= 0 ;
     for (; __first != __last; ++__first)
        ++__r;
     return __r;
}

template < typename _RandIter>
int __distance(_RandIter &__first, _RandIter &__last, forward_iterator_tag*){
     return __last - __first;
}


//+------------------------------------------------------------------+
//| MQL realization                                                  |
//+------------------------------------------------------------------+
#ifdef __MQL5__
// Bypass the bug (https://www.mql5.com/ru/forum/1111/page2648#comment_15015191)
template < typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, forward_iterator_tag* __category){
   return __distance(__first, __last, (input_iterator_tag*) __category);
};

template < typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, random_access_iterator_tag* __category){
   return __distance(__first, __last, (bidirectional_iterator_tag*) __category);
};


// Bypass Compilation ERROR: '_InputIter' - struct undefined    
template < typename T>
class GetStructType{
public :
   struct type : public T{};
};


template < typename _InputIter>
int distance_mql(_InputIter &__first, _InputIter &__last){
   //_InputIter::iterator_category category;                      //Compilation ERROR: '_InputIter' - struct undefined  
   GetStructType<_InputIter>::type::iterator_category category;
   GetStructType<_InputIter>::type::iterator_category* ptr = &category;
   
   // Bypass the bug (https://www.mql5.com/ru/forum/1111/page2648#comment_15015191)
   random_access_iterator_tag* ptr_ra = dynamic_cast <random_access_iterator_tag*>(ptr);
   if (ptr_ra != NULL ){
       return __distance(__first, __last, ptr_ra);
   };
   
   bidirectional_iterator_tag* ptr_bd = dynamic_cast <bidirectional_iterator_tag*>(ptr);
   if (ptr_bd != NULL ){
       return __distance(__first, __last, ptr_bd);
   };
   
   forward_iterator_tag* ptr_fw = dynamic_cast <forward_iterator_tag*>(ptr);
   if (ptr_fw != NULL ){
       return __distance(__first, __last, ptr_fw);
   };
   
   input_iterator_tag* ptr_in = dynamic_cast <input_iterator_tag*>(ptr);
   if (ptr_in != NULL ){
       return __distance(__first, __last, ptr_in);
   };
   
   //TODO RAISE EXCEPTION
   return - 1 ;
}

void OnStart (){
   MyIterator it1( 1 );
   MyIterator it2( 5 );
   printf ( "result:%d" , distance_mql(it1, it2));            
}
#endif 


//+------------------------------------------------------------------+
//|  C++ realization, online: https://onlinegdb.com/S1tcVt9XU 	     |
//+------------------------------------------------------------------+
#ifdef __cplusplus
template < typename _InputIter>
int distance_cplusplus(_InputIter &__first, _InputIter &__last){
     return __distance(__first, __last, ( typename _InputIter::iterator_category*)( NULL ));
}

int main(){
   MyIterator it1( 1 );
   MyIterator it2( 5 );
   printf ( "result:%d" , distance_cplusplus(it1, it2)); 
   
   return 0 ;
}
#endif 

Hatanın kısa özeti:
Sınıf mirası olduğunda A <= B <= C <= D
ve örneğin biri A* parametreli ve ikincisi B* parametreli olmak üzere iki aşırı yükleme işlevi uygulanır,
daha sonra MQL'de böyle bir işleve bir C* veya D* nesnesinin geçirilmesi "aşırı yüklenmiş işleve belirsiz çağrı" derleme hatasına neden olur.

Soru: Bu aptalca hata için yukarıda sunulandan daha mantıklı bir çözüm var mı?
 
Sonraki sayfaları gönder "Neden MQL != C++"...
 
Сергей Таболин :
Sonraki sayfaları gönder "Neden MQL != C++"...

Konunun özünü anlamadıysanız neden bir şey hakkında yorum yapıyorsunuz?

 
Sergey Dzyublik :

Sorunun özünü anlamadıysanız neden bir şey hakkında yorum yapıyorsunuz?

Çünkü uzun zaman önce bu tür açıklamalar için konuyu açmıştım (çünkü hiçbiriniz sizin gibi yapamazdı).

Ve sonra, dillerdeki farkın hatalar veya hatalar için geçerli olmadığı !

MQL v C++. Что хотелось бы, чего нет, что не так, куда копать.
MQL v C++. Что хотелось бы, чего нет, что не так, куда копать.
  • 2019.08.02
  • www.mql5.com
Общую тему багов и вопросов просто уже снасильничали такими разборками. Предложил открыть специализированную ветку, никто не чешется...
 
Sergey Dzyublik :
MQL yavaş yavaş moralini bozuyor:

Hatanın kısa özeti:
Sınıf mirası olduğunda A <= B <= C <= D
ve iki işlev uygulanır, örneğin, biri A* parametresi için, ikincisi B* için,
daha sonra MQL'de böyle bir işleve bir C* veya D* nesnesinin geçirilmesi "aşırı yüklenmiş işleve belirsiz çağrı" derleme hatasına neden olur.

Soru: Bu aptalca hata için yukarıda sunulandan daha mantıklı bir çözüm var mı?

Eh, STL bire bir kaydırılmaz. Burada ayrıntılara daha yakından bakmak gerekiyor. En kolay yol, temel sınıf veya arayüzde ve mirasçılarda - ya uygulama ya da =delte - soyut yöntemlerle tüm olası işlevleri yazmaktır. Bu durumda, aynı temel sınıfın türüne sahip işaretçiler veya referanslar yöntemlere iletilir. Doğru, sanal bir masa şeklinde kaçınılmaz bir kötülük var, ama Tanrı onu kutsasın, ancak mimariyi dinamik_cast aracılığıyla hiçbir yerde pahalı dallanma olmayacak şekilde inşa etmek arzu edilir.