Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 221

 
fxsaber # :

İşlevselliği (alt alan ve yöntem) ve uygun kullanımı nasıl koruyacağımı bilmiyorum. Belki de bu seçenek ihtiyaçlarınızı karşılayacaktır.


Başvuru.

Bu çok hızlıydı ve şimdi gayet iyi çalışıyor, teşekkür ederim!


Rusya'ya sevgilerle❤️! ;-)

 
MQL5'e girdikten sonra böyle bir makro yazmak kolaydı.
 class MqlRatestime
{
public :
   static void f( MqlRates &Value ) { Print (Value.time); }
};

class MqlTicktime
{
public :
   static void f( MqlTick &Value ) { Print (Value.time); }
};

void OnStart ()
{  
   MqlRates Rates;
   MqlTick Tick;
  
  MACROS(Rates, time); // MqlRatestime::f(Rates);
  MACROS(Tick, time);   // MqlTicktime::f(Tick);
}


MQL5'in şu anki sürümünde bu mümkün mü? Bu engeli aşmak için becerikli değildim:

 template declarations are allowed on global, namespace or class scope only
 
fxsaber # :
MQL5'e girdikten sonra böyle bir makro yazmak kolaydı.


MQL5'in şu anki sürümünde bu mümkün mü? Bu engeli aşmak için becerikli değildim:

Görevi anlamadım - MqlRatestime sınıfının (bunun için şablon) makro ikamesi içinde bildirilmesi gerekli mi?
 
mktr8591 # :
Görevi anlamadım - MqlRatestime sınıfının (bunun için şablon) makro ikamesi içinde bildirilmesi gerekli mi?
Bana öyle geliyor ki, farklı türlerdeki parametreler için farklı bir makro ikamesi gerekli.
Sadece bunun neden makro ikame ile yapılması gerektiğini anlamıyorum ve aşırı işlev yüklemesi değil.
 
mktr8591 # :
Görevi anlamadım - MqlRatestime sınıfının (bunun için şablon) makro ikamesi içinde bildirilmesi gerekli mi?

Hayır, sınıflar zaten açıklandı. Yorumlar, almak istediğiniz sonucu belirtir. Makronun girdisi bir nesnedir ve çıktıya bu nesnenin türünün adını içeren bir sınıf denir.

 
Sergey Gridnev # :
Bana öyle geliyor ki, farklı türlerdeki parametreler için farklı bir makro ikamesi gerekli.
Sadece bunun neden makro ikame ile yapılması gerektiğini anlamıyorum ve aşırı işlev yüklemesi değil.

Görev bundan doğdu.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

fxsaber , 2022.02.11 15:44

ArraySortStruct_Define( MqlRates , open)
ArraySortStruct_Define( MqlRates , high)
ArraySortStruct_Define( MqlRates , time)

void OnStart ()
{
   MqlRates Rates[];
  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 5 , Rates); // Взяли бары
  
   Print ( "\nБары без сортировки - как получили." );
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по open-цене." );
  ArraySortStruct( MqlRates , Rates, open);
   ArrayPrint (Rates);

   Print ( "\nСортируем по high-цене." );
  ArraySortStruct( MqlRates , Rates, high);
   ArrayPrint (Rates);

   Print ( "\nСортируем по времени." );
  ArraySortStruct( MqlRates , Rates, time);
   ArrayPrint (Rates);
}

Türü belirtmeye zorlandığı giriş parametresini vurguladı. Bu, makroda üç girişle sonuçlanır. Ve iki tane istiyorum - tipsiz.

 
fxsaber # :

Hayır, sınıflar zaten açıklandı. Yorumlar, almak istediğiniz sonucu belirtir. Makronun girdisi bir nesnedir ve çıktıya bu nesnenin türünün adını içeren bir sınıf denir.

Bu sorunu nasıl çözeceğimi bilmiyorum.

Ve iki parametreli ArraySortStruct'a - işte böyle çalışır:

 #define ArraySortStruct(ARRAY, FIELD) SortOnField_ ##FIELD::SORT::Sort(ARRAY)

ArraySortStruct_Define(SortOnField_, open)
ArraySortStruct_Define(SortOnField_, high)
ArraySortStruct_Define(SortOnField_, time)


void OnStart ()
  {

   MqlRates Rates[];

   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 5 , Rates); // Взяли бары

   Print ( "\nБары без сортировки - как получили." );
   ArrayPrint (Rates);

   Print ( "\nСортируем по open-цене." );
   ArraySortStruct(Rates, open);
   ArrayPrint (Rates);

   Print ( "\nСортируем по high-цене." );
   ArraySortStruct(Rates, high);
   ArrayPrint (Rates);

   Print ( "\nСортируем по времени." );
   ArraySortStruct(Rates, time);
   ArrayPrint (Rates);
  }
 
mktr8591 # :

Ve iki parametreli ArraySortStruct'a - işte böyle çalışır:

Haklısın, teşekkürler! Birden fazla abarttım. Sıralama seçeneğinizi bırakacağım.

 // Сортировка массива структур и указателей на объекты по полю.
#define ArraySortStruct_Define(FIELD)                                            \
namespace SortOnField_ ##FIELD                                                     \
{                                                                                \
   class SORT                                                                     \
  {                                                                              \
   private :                                                                       \
     template < typename T>                                                        \
     static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
       const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
                                                                                 \
     template < typename T>                                                        \
     static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
       int Marker = Start;                                                        \
                                                                                 \
       for ( int i = Start; i <= End; i++)                                         \
         if (Array[i]. ##FIELD <= Array[End]. ##FIELD)                               \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return (Marker - 1 );                                                       \
    }                                                                            \
                                                                                 \
     template < typename T>                                                        \
     static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
       if (Start < End)                                                           \
      {                                                                          \
         const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1 );                                \
        SORT::QuickSort(Array, Pivot + 1 , End);                                  \
      }                                                                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
                                                                                 \
   public :                                                                        \
     template < typename T>                                                        \
     static void Sort( T &Array[], int Count = WHOLE_ARRAY , const int Start = 0 ) \
    {                                                                            \
       if (Count == WHOLE_ARRAY )                                                  \
        Count = :: ArraySize (Array);                                              \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1 );                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
  };                                                                             \
}

#define ArraySortStruct(ARRAY, FIELD) SortOnField_ ##FIELD::SORT::Sort(ARRAY)


Başvuru.

 ArraySortStruct_Define(open)
ArraySortStruct_Define(high)
ArraySortStruct_Define(time)

void OnStart ()
{
   MqlRates Rates[];
  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 5 , Rates); // Взяли бары
  
   Print ( "\nБары без сортировки - как получили." );
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по open-цене." );
   ArraySortStruct(Rates, open);
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по high-цене." );
   ArraySortStruct(Rates, high);
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по времени." );
   ArraySortStruct(Rates, time);
   ArrayPrint (Rates);
}


ZY Yazık, bir alt alanda veya bir yöntemde imkansız.

 
Bu bazıları için yeni olmayabilir ama benim için sürpriz oldu.
DLL farklı MT5 programlarında aynı anda kullanılıyorsa,
daha sonra onu kullanan ilk çalışan program tarafından bir kez yüklendiğini unutmayın.
Yani, DLL ortamı, kaç kez içe aktarırsanız aktarın , tek bir ortak işlemdedir.
Amaç ne? DLL'de kullanılan genel işaretçilerin ortak bir işlemin alanında olması.
Ve çok uygun.
 
Roman # :
Bu bazıları için yeni olmayabilir ama benim için sürpriz oldu.
DLL farklı MT5 programlarında aynı anda kullanılıyorsa,
daha sonra onu kullanan ilk çalışan program tarafından bir kez yüklendiğini unutmayın.
Diğer bir deyişle, DLL'nin durumu, onu kaç kez içe aktarırsanız aktarın , paylaşılan bir işlemde bulunur.
Amaç ne? DLL'de kullanılan genel işaretçilerin ortak bir işlemin alanında olması.
Ve çok uygun.

Bu haber değil, doğuştan hep böyle çalışıyorlar.

yalnızca veriler __atomic__'den büyükse, kritik bölümlerle (veya std::thread terminalindeki muteks) ona erişmek/korumak gerekir

Neden: