Çaydanlıktan gelen sorular - sayfa 86

 

Renat , soru pratikten çok teorikti.

Sis içinde gezinmemek için iFractals yardımından bir örneğe atıfta bulunacağım. Doğru, bir gösterge var, ancak görevi komut dosyası tarafından grafik işaretlemenin tek bir hesaplamasına basitleştirelim.

Diyelim ki tüm tarihteki tüm üst fraktal çubukların zamanını (veya çok sayıda fraktalın olacağı orta bir zaman diliminde önemli bir bölümünde) bulmaya başladığımı varsayalım. FrUpBuffer[shift]!= EMPTY_VALUE ile bir döngüde CopyTime'ı 1 öğe derinliğinde birçok kez bozmanın daha iyi olduğunu doğru anladım mı:

 handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for ( int shift= 0 ; shift<BarsCalculated(handle); shift++)
{
   if (FrUpBuffer[shift]!= EMPTY_VALUE )
   {
      CopyTime ( _Symbol ,PERIOD_H4, shift, 1 , Arr);
     Print (Arr[ 0 ]);
   }
}

bool FillArraysFromBuffers( double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if ( CopyBuffer (ind_handle, 0 , 0 ,amount,up_arrows)< 0 ) return ( false );

   return ( true );
  }

ve CopyTime ile FrUpBuffer'ın derinliğine kadar tek bir hamlede geçmişi yemekten daha hızlı sonuç alın:

 handle=iFractals(_Symbol,PERIOD_H4);
// вызов FillArraysFromBuffers(...)
// ...
// прочёс буфера
for ( int shift= 0 ; shift<BarsCalculated(handle); shift++)
{
   if (FrUpBuffer[shift]!= EMPTY_VALUE )
     Print (TimeUpBuffer[shift]);
}

bool FillArraysFromBuffers( double &up_arrows[],
                           int ind_handle,
                           int amount
                          )
  {
   if ( CopyBuffer (ind_handle, 0 , 0 ,amount,up_arrows)< 0 ) return ( false );
   else CopyTime ( _Symbol , PERIOD_H4 , 0 ,amount,TimeUpBuffer);

   return ( true );
  }
ve sonra, aynı if ile aynı döngüde, Print'i kullanarak fraktal çubukların zaman değerlerini yazdırmanız yeterli mi?

Hem orada hem de orada görevler aynıdır, sadece uygulamalar biraz farklıdır.

Sezgisel olarak, büyük bir çubuk zaman değeri zincirini (hem fraktal hem de boş) arka arkaya bir diziye kopyalamanın daha uzun ve daha pahalı olduğunu anlıyorum; Öte yandan, CopyTime'ı birden çok kez 1 öğe derinliğine çekmek şüpheli bir zevktir.

İlk seçenek daha hızlıysa, o zaman mutlak bir kazanç mı yoksa hepsi yakalanan toplam fraktal sayısına mı bağlı (örneğin, küçük TF'lerde çok daha fazlası var)?

 

Burada https://www.mql5.com/ru/forum/3775/page59#comment_94865 Kodu kısaltmak için bir döngüde benzer birçok tampona deklarasyon, bağlama, başlatma ve diğer eylemlerin yerleştirilmesi hakkında bir soru sordum, okunabilirliği ve yönetilebilirliği iyileştirin. İyi bir örnekle bir cevap alındı (sınıf, yapı), anladım.

Şimdi, aynı prensibi kullanarak, #property türünün çoklu atamasını bozmaya çalıştım:

 #property indicator_label1   "FractalUp1"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrGreen

#property indicator_label2   "FractalDown1"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrGreen
// ---
#property indicator_label3   "FractalUp2"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrBlue

#property indicator_label4   "FractalDown2"
#property indicator_type4   DRAW_ARROW
#property indicator_color4  clrBlue
[...]

ve en az iki sorunu vardı:

1. çünkü global düzeyde izin verilmez, yani en erken kullanım OnInit()'ten daha erken değildir, ancak #property'nin diğer tüm işlevlerden önce global düzeyde bildirildiği bilinmektedir;

2. OnInit() içindeki bir döngüdeki göstergelere özellikler atamaya çalışırken:

 // понимаю, что сочинил бред
for ( int i= 0 ; i<NUMBER; i++)
{
   #property Property_Array[i].indicator_label (string) ("Fractal"+i)
   #property Property_Array[i].indicator_type  DRAW_ARROW
   #property Property_Array[i].indicator_color clrArr[i]
}
derleyici '#' hakkında şikayet ediyor (beklendiği gibi): '#özellik' - beklenmeyen belirteç.
Bu fikrin prensipte uygulanabilir olup olmadığını ve mümkünse nasıl olduğunu söyleyebilir misiniz?
 

Söyle bana, bir şekilde iki boyutlu bir dizi dizisini ilan etmek mümkün mü?

Bunun gibi bir şey:

 double Buffers[ 6 ][ 3 ]={ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] },{ [],[],[] };
 
tol64 :

Söyle bana, bir şekilde iki boyutlu bir dizi dizisini ilan etmek mümkün mü?

alanları dizi olacak bir dizi yapı bildirilebilir, derleyici yapıdaki dinamik dizileri bile atlar:

 struct arr{ double arr_str[];};
arr buffers[ 6 ][ 3 ];
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
tol64 :

Söyle bana, bir şekilde iki boyutlu bir dizi dizisini ilan etmek mümkün mü?

Bunun gibi bir şey:

 #define DIM1_NUMBER 6
#define DIM2_NUMBER 3

struct TBuffer
{
   string Buffer[ 3 ]; // для нагляднсти поменяем double на string
};

TBuffer Buffer_Array[DIM1_NUMBER];

string prefixArr[ 6 ]={ "a" , "b" , "c" , "d" , "e" , "f" };

int OnInit ()
  {
   for ( int j= 0 ; j<DIM1_NUMBER; j++)
   {
       for ( int i= 0 ; i<DIM2_NUMBER; i++)
      {
         string t;
   
         StringConcatenate (t,prefixArr[j],i);
        Buffer_Array[j].Buffer[i]=t;
      }
   }

   Print (Buffer_Array[ 0 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 0 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 0 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 1 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 1 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 1 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 2 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 2 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 2 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 3 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 3 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 3 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 4 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 4 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 4 ].Buffer[ 2 ], "; " ,

         Buffer_Array[ 5 ].Buffer[ 0 ], ", " ,
         Buffer_Array[ 5 ].Buffer[ 1 ], ", " ,
         Buffer_Array[ 5 ].Buffer[ 2 ]
   );

   return ( 0 );
  }
[Düzeltildi.]
 

IgorM, x100gün içi

Seçenekler için teşekkürler. Bence bu işe yaramalı, deneyeceğim.

 
tol64 :

IgorM, x100gün içi

Seçenekler için teşekkürler. Bence bu işe yaramalı, deneyeceğim.

Bu arada, "Tampon" adı "_" veya başka bir zagagulin olarak değiştirilebilir, o zaman genel olarak aramanın tam bir görünürlüğü olacaktır:

Buffer_Array[ 0 ]._[ 0 ]

Buffer_Array[ 0 ].¦[ 0 ]

 
Urain :

Bu arada, "Tampon" adı "_" veya başka bir zagagulin olarak değiştirilebilir, o zaman genel olarak aramanın tam bir görünürlüğü olacaktır:

Teşekkürler İdrar . Ayrıca ilginç bir ek. Daha tanıdık.))
 

Peki tüm bunlar #özellik ile nasıl yapılır? - ilginç...

Gerçekten fikir yok mu?

 
x100intraday :

Ama tüm bunlar #property ile nasıl yapılır? - ilginç...

Gerçekten fikir yok mu?

deşifre etmek