Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1333

 
Mikhail Tkachev :

Cevap için teşekkürler, hiç de kötü değilsin)
Şimdi belli oldu.)
UPD
Bu tasarım da işe yarıyor

At() yönteminin ne döndürdüğüne dikkat edin. NULL döndürürse, ölümcül bir hatayla kilitlenir. Bir nesneye bir işaretçi ile erişmeden önce, NULL olmayan bir nesne olup olmadığını kontrol edin.

 
Mikhail Tkachev :

zaten fark ettim)
Yani, çıkış yolu, küresel olarak boş nesneler ilan etmektir ....
Ve eğer önceden bilinmiyorsa, kaç tane olacak? Sadece "bir marjla" ilan etmek mi? :)
PS Yerleşik yardımda, nesneleri bildirmenin böyle bir yolunu bulamadım

Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi

 #include <Arrays\ArrayObj.mqh>
/********************************************************************\
|   Класс Новый бар                                                  |
\********************************************************************/
class CNewBar : public CObject
  {
private :
   string             m_symbol;
   ENUM_TIMEFRAMES    m_timeframe;
   datetime           m_time;
   datetime           Time( void );                                       //  Возвращает время нулевого бара
   string              Symbol ( void )         { return this .m_symbol;    }
public :
   ENUM_TIMEFRAMES    Timeframe( void )      { return this .m_timeframe; }
   datetime           GetTime( void )        { return this .m_time;      } //  Возвращает время последнего обращения
   bool               IsNewBar( void );                                   //  Основная функция класса

                    CNewBar( const string symbol, const ENUM_TIMEFRAMES timeframe);
                   ~CNewBar( void ){;}
  };
//+------------------------------------------------------------------+
//|    Конструктор                                                   |
//+------------------------------------------------------------------+
CNewBar::CNewBar( const string symbol, const ENUM_TIMEFRAMES timeframe) : m_time( 0 )
  {
   this .m_symbol = symbol;
   this .m_timeframe = (timeframe == PERIOD_CURRENT ? Period () : timeframe);
  }
//+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
datetime CNewBar::Time( void )
  {
   datetime array[ 1 ], ret;
   ret = CopyTime ( this .m_symbol, this .m_timeframe, 0 , 1 , array) == 1 ? array[ 0 ] : 0 ;
   return (array[ 0 ]);
  }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar( void )
  {
   datetime tm = this .Time();
   if (tm == 0 )
       return false ;
   if (tm != this .m_time)
     {
       this .m_time = tm;
       return true ;
     }
   return false ;
  }

Ve işte OnInit()'te işaretçiler oluşturma döngüsü

   for ( int i = 0 ; i < ArraySize (Rates); i++)
     {
       CNewBar* nb = new CNewBar(Rates[i].m_Symbols, timefram);
       if (nb != NULL )
         {
          list_new_bar.Add(nb);
           Print (nb.IsNewBar(), " ***** " , Rates[i].m_Symbols, " ***** " , nb.Time());
         }
     }

ve OnTimer'da()

 void OnTimer ()
{
 int total = list_new_bar.Total();
 for ( int i = 0 ; i < ArraySize (Rates); i++)
  {
   CNewBar* nb = list_new_bar.At(i);
   if (nb == NULL )
     continue ;
   bool new_bar = nb.IsNewBar();
   if (new_bar)
    {// и дальше………

ArraySize(Rates), çalışılacak karakterleri listeleyen bir dizi yapı boyutudur .

 
Alexey Viktorov :

Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi

Ve işte OnInit()'te işaretçiler oluşturma döngüsü

ve OnTimer'da()

ArraySize(Rates), çalışılacak karakterleri listeleyen bir dizi yapı boyutudur .

Burada:

 for ( int i = 0 ; i < ArraySize (Rates); i++)

Toplama kadar yapardım - sırf Rates dizisinden karakterleri okuduğunuz için (doğru mu?), yeni bar sınıfının örneklerini oluşturun ve bunları listeye ekleyin.

Herhangi bir ekleme hatası için, yeni çubuk sınıfının örneklerine yönelik işaretçi listesinin boyutu Rates dizisinin boyutuyla eşleşmeyecektir.

Genel olarak, şöyle bir şey:

 void OnTimer ()
  {
   int total = list_new_bar.Total();
   for ( int i = 0 ; i < total; i++)
   {
   CNewBar* nb = list_new_bar.At(i);
   if (nb == NULL )
       continue ;
   if (nb.IsNewBar())
     { // и дальше………

Ve burada listeye eklemenin başarısını da kontrol etmeniz gerekiyor:

   for ( int i = 0 ; i < ArraySize (Rates); i++)
     {
       CNewBar* nb = new CNewBar(Rates[i].m_Symbols, timefram);
       if (nb != NULL )
         {
          list_new_bar.Add(nb);
           Print (nb.IsNewBar(), " ***** " , Rates[i].m_Symbols, " ***** " , nb.Time());
         }
     }

şöyle bir şey:

   for ( int i = 0 ; i < ArraySize (Rates); i++)
     {
      CNewBar *nb = new CNewBar(Rates[i].m_Symbols, timefram);
       if (nb== NULL )
         continue ;
       if (!list_new_bar.Add(nb))
        {
         delete nb;
         continue ;
        }
       Print (nb.IsNewBar(), " ***** " , Rates[i].m_Symbols, " ***** " , nb.Time());
     }
listeye yeni bir nesneye bir işaretçi ekleme başarısız olduğunda bellek sızıntılarını önlemek için
 
Artyom Trishkin :

Burada:

Toplama kadar yapardım - sırf Rates dizisinden karakterleri okuduğunuz için (doğru mu?), yeni bar sınıfının örneklerini oluşturun ve bunları listeye ekleyin.

Herhangi bir ekleme hatası için, yeni çubuk sınıfının örneklerine yönelik işaretçi listesinin boyutu Rates dizisinin boyutuyla eşleşmeyecektir.

Genel olarak, şöyle bir şey:

Ve burada listeye eklemenin başarısını da kontrol etmeniz gerekiyor:

şöyle bir şey:

listeye yeni bir nesneye bir işaretçi ekleme başarısız olduğunda bellek sızıntılarını önlemek için

Teşekkür ederim. anladım öyle düzelteyim ... :))))

Devam ifadesinden nefret ediyorum; ve kullanmamaya çalışın. Sadece acil durumlarda.

       if (nb== NULL )
         continue ;

ondan nasıl farklı

       if (nb!= NULL )
       {
       }
Başka bir şey, eğer bir hata durumunda, başarısız bir işaretçi silinirse ... Ama burada bile devam etmeden yapabilirsiniz, ki bundan nefret ediyorum; sadece Print()'i kaldırarak. Hata ayıklama ve neler olduğunu anlamaya çalışırken gerekliydi ve işlem sırasında bir hata meydana gelirse, kimse için neyin yanlış olduğunu anlamayacağım ... İşletim sistemini yeniden yüklemek benim için günlükleri anlamaktan daha kolay.


Bunu zaten konuştuğumuz için, lütfen bize vahşilere girmeden, bir işaretçinin bir sınıf değişkeninden nasıl farklı olduğunu ve hangisinin tercih edilebilir olduğunu söyleyin. Anlaşılması zor olan ayrıntılarda, tyrnet'te okuyabilirim. deyim yerindeyse yüzeysel bir anlayış bana yeter...

 
Artyom Trishkin :

At() yönteminin ne döndürdüğüne dikkat edin. NULL döndürürse, kritik bir hatayla kilitlenir. Bir nesneye bir işaretçi ile erişmeden önce, NULL olmayan bir nesne olup olmadığını kontrol edin.

Artem, değerli yorumun için teşekkürler)

 
Alexey Viktorov :

Teşekkür ederim. anladım öyle düzelteyim ... :))))

Devam ifadesinden nefret ediyorum; ve kullanmamaya çalışın. Sadece acil durumlarda.

ondan nasıl farklı


Döngünün yinelemesi bitmeyecek ve yenisi başlamayacak, ancak bir sonraki If'ye geçecektir. Mantık değişecek.

 
Alexey Viktorov :

Bir keresinde Artyom bana bu dersi yazmıştı. Nasıl çalıştığını ayrıntılı olarak açıklayamam. Ama Artyom gördüğünde hatırlayacak ve açıklayabilecektir. Genel olarak, işte sınıfın kendisi

 //+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
datetime CNewBar::Time( void )
  {
   datetime array[ 1 ], ret;
   ret = CopyTime ( this .m_symbol, this .m_timeframe, 0 , 1 , array) == 1 ? array[ 0 ] : 0 ;
   return (array[ 0 ]);
 }

Alex, böyle ayrıntılı bir cevap için teşekkürler.
Yukarıdaki kod parçasında ret değişkeninin amacı net değil...
Yöntem yine de dizi[0] döndürürse neden hesaplanır?
ZY
Bunu neden bir sınıf yönteminde kullanıyorsunuz? Bu özel sınıfın üyeleriyle çalışıyoruz...


 
Alexey Viktorov :

Teşekkür ederim. anladım öyle düzelteyim ... :))))

Devam ifadesinden nefret ediyorum; ve kullanmamaya çalışın. Sadece acil durumlarda.

ondan nasıl farklı

Başka bir şey, eğer bir hata durumunda, başarısız bir işaretçi silinirse ... Ama burada bile devam etmeden yapabilirsiniz, ki bundan nefret ediyorum; sadece Print()'i kaldırarak. Hata ayıklama ve neler olduğunu anlamaya çalışırken gerekliydi ve işlem sırasında bir hata meydana gelirse, kimse için neyin yanlış olduğunu anlamayacağım ... İşletim sistemini yeniden yüklemek benim için günlükleri anlamaktan daha kolay.


Bunu zaten konuştuğumuz için, lütfen bize vahşilere girmeden, bir işaretçinin bir sınıf değişkeninden nasıl farklı olduğunu ve hangisinin tercih edilebilir olduğunu söyleyin. Anlaşılması zor olan ayrıntılarda, tyrnet'te okuyabilirim. deyim yerindeyse yüzeysel bir anlayış bana yeter...

Merdivenleri ve dalları çitle çevirmemek için gereksiz parantezlerden kurtulmaya çalışıyorum. Baskı olmadan, parantezlere orada ihtiyaç yoktur - yalnızca nesneyi silmek kalır.

Yeni operatörde, fiziksel olarak "bir yerde" bulunan belirli bir mekanizma yaratırsınız. Yeni operatör bu "bir yerin" adresini döndürür. Ve sadece üzerinde bu "mekanizmaya" dönebilirsiniz.
Ve bu mekanizmanın içindeki cıvata bir değişkendir.
 
Valeriy Yastremskiy :

Döngünün yinelemesi bitmeyecek ve yenisi başlamayacak, ancak bir sonraki If'ye geçecektir. Mantık değişecek.

İçinde bulunduğu döngünün yeni bir yinelemesine gider.
 
Mikhail Tkachev :

Alex, böyle ayrıntılı bir cevap için teşekkürler.
Yukarıdaki kod parçasında, ret değişkeninin amacı net değil...
Yöntem yine de dizi[0] döndürürse neden hesaplanır?


Verdiğim kodda bir şeyi değiştiren Aleksey'di. Ya da gözden kaçırmış olabilirim - basit bir açıklama için "dizlerimin üstüne" yazdım, ne olduğunu hatırlamıyorum.