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

 

Türkçe (orijinal): Bir MQL dil özelliği talebinde bulunmak istiyorum. Eğer bu doğru başlık değilse, lütfen bana bildirin. Orijinal istek İngilizce forumda ...

Rusça (Google çeviri): Bir MQL dil özelliği talebinde bulunmak istiyorum. Eğer bu doğru başlık değilse, lütfen bana bildirin. Orijinal istek İngilizce forumda ...

 

bir dizi tek satırla nasıl doldurulur?

struct clr_struct{
   color uncheck;
};
clr_struct clr[];

//clr[0].uncheck=0x999999;
//clr[1].uncheck=0x999999;

clr[].uncheck={0x999999,0x999999};//как правильно?
 
Pavel Kolchin bir dizi tek satırla nasıl doldurulur?
clr_struct clr[] = {{0x999999}, {0x999999}};
 

Erişim hakları için bir hayat hilesi daha: Bir sınıfın özel alanlarına/fonksiyonlarına başka bir sınıfa erişim vermek için karşı konulmaz bir arzunuz varsa, standart MQL araçlarını kullanarak aşağıdakileri yapabilirsiniz:

Yapmamız gerekenler: B'den A::f1()'e erişim sağlamak

//--------- как было
class   A
  {
   int               m;
   int               f1() {return m;}                       // нужно дать к нему доступ классу B
public:
                     A(int a): m(a) {}
  };

class B {};

Bunu şu şekilde yeniden yazalım:

class A;
class B
  {
private:
   class AB
     {
   public:
      virtual int    CallAf1(A&) const  = 0;
                     AB() {ABptr = &this;}
     } static *ABptr;

   // внутри B используем  этот метод для получения доступа к A::f1()
   static int        CallAf1(A & obj)
     {
      return ABptr.CallAf1(obj);
     }

public:
   class AB2: AB {};

   // вспомогательный метод - только для проверки
   static void       _f1_test(A & obj)
     {
      Print("test ", CallAf1(obj));
     }
  };
B::AB *B::ABptr = NULL;

class   A
  {
   int               m;
   int               f1() {return m;}
public:
                     A(int a): m(a) {}

   //--  добавлено
private:
   class AB3: B::AB2
     {
      int            CallAf1(A &obj) const {return obj.f1();}
     }   static  const     ABlink;
  };
const A::AB3 A::ABlink;

B içinde (A)a.f1()'i çağırmak için CallAf1(a)'yı çağırın. Eğer f1()'in parametreleri varsa, bunları CallAf1()'e ekleriz.

Test edin:

void OnStart()
  {
    A f(2);
    B::_f1_test(f);
  }

CallAf1()'i korumalı yapabilirsiniz, ancak erişim haklarında büyük bir boşluk olacaktır - kodun herhangi bir yerinde B sınıfının bir torununu ve içinde CallAf1()'i çağırmak için bir public yöntem oluşturabilirsiniz - yani herkesin A::f1()'e erişimi olacaktır.


Not: Bu yapı çok hantaldır (isterseniz makrolara sıkıştırabilirsiniz), ancak friend C++'a göre bir avantajı vardır: tüm sınıf üyelerine değil, yalnızca seçilenlere erişim sağlar.

 
mktr8591 #:

Erişim hakları için bir hayat hilesi daha: Bir sınıfın özel alanlarına/fonksiyonlarına başka bir sınıfa erişim izni vermek için dayanılmaz bir arzunuz varsa, bunu standart MQL araçlarını kullanarak yapabilirsiniz

Buna alışmam uzun zaman aldı... sanallaştırma ile iyi hamle, teşekkürler!
 
fxsaber #:
İçine girmek uzun zaman aldı... sanallaştırma ile iyi hamle, teşekkürler!
Başlangıçta yazmadığım tek şey, B::AB2 (ve onun soyundan gelenler) sınıfından daha fazla nesne oluşturamayacağınızdır, aksi takdirde her şey dağılır :-)
 
Bu Uzman Danışmanı Test Cihazında tüm semboller modunda çalıştırma
input int inTmp = 0; // https://www.mql5.com/ru/forum/321656/page90#comment_44727856

bool Res = true;

// Проверяет, нормализована ли цена по алгоритму NormalizeDouble.
bool IsNDPrice( const double &Price )
{
  return(Price == NormalizeDouble(Price, 5));
}

// Проверяет, нормализована ли цена, как при парсинге или ручном вводе.
bool IsNDPrice2( const double &Price )
{
  return(Price == (double)DoubleToString(Price, 5));
}

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
//    Res &= IsNDPrice(Tick.bid) && IsNDPrice(Tick.ask); // OnTester == 1.
    Res &= IsNDPrice2(Tick.bid) && IsNDPrice2(Tick.ask); // OnTester == 0.
}

double OnTester()
{
  return(Res);
}
tüm fiyatların NormalizeDouble algoritması kullanılarak normalleştirildiğini gösterir. Terminalden değil de ayrıştırma veya manuel giriş yoluyla elde edilen fiyatlarla çalışıyorsanız, doğru işlem için normalleştirilmeleri gerekir. Yanılgıya düşmeye gerek yoktur.
 

REASON_ACCOUNT olduğunda (hesap değiştirilmese, sadece yeniden giriş yapılsa bile) Uzman Danışman tamamen boşaltılır ve yeni bir kopya yüklenir.

Bu nedenle OnDeinit'teki ExpertRemove yeni kopyayı etkilemez, çünkü boşaltılmış olana dokunur.

void OnInit() { Print(__FUNCSIG__); }

void OnDeinit( const int ) { Print(__FUNCSIG__); }


Yeniden oturum açtıktan sonra sonuç.

2023.02.07 11:33:12.717 Test5-3 (EURUSD,M1)     void OnDeinit(const int)
2023.02.07 11:33:13.926 Test5-3 (EURUSD,M1)     void OnInit()


Deinit'ten sonra, yeni EA kopyası başlamak için bir saniyeden fazla (iki saniyeye kadar) bekler. Bu kadar uzun süre beklemenin nedenleri nelerdir ve bunu hızlandırmak mümkün müdür?

 

SymbolInfoTick bu üç çağrının her birinde en son tiki döndürecektir. Yani, göstergeler arasında atlama yapmadan tiklerin sözde toplanması en hafif tabirle tartışmalıdır.


Bir gösterge tarafından tik toplamanın imkansızlığının kanıtı (atlama olmadan).

// Аналог Sleep для индикатора.
void Sleep2( const uint Pause )
{
  const uint StartTime = GetTickCount();
  
  while (!IsStopped() && (GetTickCount() - StartTime) < Pause)
    ;
}

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

int OnCalculate( const int rates_total,
                 const int,
                 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[] )
{  
  static const int period = PeriodSeconds();
  
  Sleep2(1000); // Расчеты.
  
  MqlTick Tick[1];
  
  if (SymbolInfoTick(_Symbol, Tick[0]) &&
      ((Tick[0].bid != close[rates_total - 1]) || // Свежий бар не соответсвует последнему тику.
       Tick[0].time / period > time[rates_total - 1] / period))
  {
    ArrayPrint(Tick);
    Print(TOSTRING(time[rates_total - 1]) + TOSTRING(close[rates_total - 1]));
  }

  return(rates_total);
}


Sonuç.

                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2023.02.07 16:28:39 1.54951 1.54959 0.0000        0 1675787319322      98       0.00000
time[rates_total-1] = 2023.02.07 16:28:00 close[rates_total-1] = 1.5495 

                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2023.02.07 16:28:40 1.54948 1.54959 0.0000        0 1675787320719      98       0.00000
time[rates_total-1] = 2023.02.07 16:28:00 close[rates_total-1] = 1.5495 

                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2023.02.07 16:28:41 1.54952 1.54960 0.0000        0 1675787321823     100       0.00000
time[rates_total-1] = 2023.02.07 16:28:00 close[rates_total-1] = 1.54954 

                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2023.02.07 16:28:42 1.54954 1.54961 0.0000        0 1675787322223     102       0.00000
time[rates_total-1] = 2023.02.07 16:28:00 close[rates_total-1] = 1.54951 00000000002 

                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2023.02.07 16:28:43 1.54955 1.54964 0.0000        0 1675787323721     100       0.00000
time[rates_total-1] = 2023.02.07 16:28:00 close[rates_total-1] = 1.54948 

                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2023.02.07 16:28:44 1.54954 1.54962 0.0000        0 1675787324323     100       0.00000
time[rates_total-1] = 2023.02.07 16:28:00 close[rates_total-1] = 1.54952 

                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2023.02.07 16:28:45 1.54956 1.54962 0.0000        0 1675787325421     102       0.00000
time[rates_total-1] = 2023.02.07 16:28:00 close[rates_total-1] = 1.54952
 
Olası MQL5 dili yapılarından biri.

Alım Satım, Otomatik Alım Satım Sistemleri ve Alım Satım Stratejilerinin Test Edilmesi Forumu

Hatalar, hatalar, sorular

fxsaber, 2023.02.14 13:11

input string inStr = "B2";

class A {};

class B1 : public A {};
class B2 : public A {};
// .....
class B100 : public A {};

void OnStart()
{
  A* a = New2(inStr); // создает объект, который прописан в inStr.
}

// Решение.
template <typename T>
A* New( const string &ClassName ) { return((typename(T) == ClassName) ? new T : NULL); }

typedef A* (*TNew)( const string& );
static const TNew FuncNew[] = {New<B1>, New<B2>, /*....,*/ New<B100>};

A* New2( string ClassName )
{  
  A* Res = NULL;
  
  ClassName = "class " + ClassName;
  
  for (int i = ArraySize(FuncNew) - 1; !Res && (i >= 0); i--)
    Res = FuncNew[i](ClassName);  
    
  return(Res);
}

Ne yazık ki, MQL4 henüz bu tür bir işi yapmıyor.