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

 
fxsaber #:
Eklendi.

Eskiden const kullanmadan yazanlar artık bunu yapamayacaklar. Aksi takdirde hata oluşacaktır.

template <typename T>
bool IsMqlTick( const T& ) // Без этого const будет неверно работать.
{
  return(typename(T) == "struct MqlTick");
}

void OnStart()
{
  const MqlTick Value1 = {};
  MqlTick Value2 = {};
  
  Print(IsMqlTick(Value1)); // true
  Print(IsMqlTick(Value2)); // true
}

Görünen o ki yenilik daha önce yazılmış kodlarda ciddi hatalar vaat ediyor.

 

Üzgünüm."TRADE_EVENT_POSITION_OPEN =0x1" x1 olay listesinin ilk bitidir???? Yani, enum olay kısmında, her biti bu şekilde kullanılabilir hale getirebilir misiniz?


Lütfen bana bildirin.

 

ABD/Avrupa saatini çeviren iki tür broker vardır. Bu nedenle, özellikle devir süresi kaydırılır.

Broker türü otomatik olarak belirlenebilir.

// Вычисление типа брокера (USA/Europe).

bool IsEuropeBroker()
{
  MqlCalendarValue Value[1];
  
  CalendarValueHistoryByEvent(840030016, Value, D'2022.11.03', D'2022.11.05');
  
  return(Value[0].time == ChartNewsTime(Value[0].time)); // https://www.mql5.com/ru/forum/357793/page5#comment_44225999
}

void OnStart()
{
  Print(AccountInfoString(ACCOUNT_SERVER) + " - " + (IsEuropeBroker() ? "Europe" : "USA"));
}


Bazı brokerlerde sonuçları başlatın.

RannForex-Server - Europe
MetaQuotes-Demo - Europe
FXOpen-MT5 - USA
Alpari-MT5 - Europe
Tickmill-Live - USA
ICMarketsSC-MT5-2 - USA
Darwinex-Live - USA
 

Merhaba!

Sorumu doğru başlıkta sorup sormadığımı bilmiyorum...

Sorunun özü - Standart kütüphaneden AppDialog'a dayalı düğmeler, giriş alanları ve etiketler içeren bir panel yaptım.

Müşteri, Windows kişiselleştirme ayarları aracılığıyla yakınlaştırma yaparken,

panelde sadece yazı tipleri ölçeklendiriliyor, ancak kontrollerin kendileri ölçeklendirilmiyor, sonuç olarak yazılar kontrol sınırlarının ötesine geçiyor.

Sorunu nasıl çözebilirim, böylece sadece yazı tipleri değil, aynı zamanda panel öğelerinin boyutları ve panelin kendisi de ölçeklenir?

Tabii ki, küçük bir rezervim var ve öğelerin boyutunu biraz artırabilirim, sonra ekran parametrelerini% 125'e çıkarırsam

her şey sığacak, ancak %150'ye çıkarırsam hiçbir şey sığmayacak.

Bu yüzden sorunu kökten çözmek istiyorum, böylece panelin öğeleri ve panelin kendisi de ölçekle orantılı olarak artar. Bunu nasıl yapabilirim?

Bir şekilde, muhtemelen WIN IP aracılığıyla bu ölçek rakamını elde etmek için gerekli olduğunu anlıyorum -% 100 veya% 125 veya% 150. Asıl soru, bunun EA kodunda nasıl uygulanacağı?



Not: Açıklama için. Program standart MQL5 kütüphanesini kullanıyor, ancak MQL4 ile yazılmış.


Cevap verecek herkese şimdiden minnettarım....

 
Vitaliy Davydov Standart kütüphaneden AppDialog'a dayalı düğmeler, giriş alanları ve etiketler içeren bir panel yaptım.

Müşteri, Windows kişiselleştirme ayarları aracılığıyla yakınlaştırma yaparken,

panelde yalnızca yazı tipleri ölçeklendirilir, ancak kontrollerin kendileri ölçeklendirilmez, sonuç olarak yazılar kontrol sınırlarının ötesine geçer.

Yalnızca yazı tiplerinin değil, panel öğelerinin boyutlarının ve panelin kendisinin de ölçeklendirilmesi için sorunu nasıl çözebilirim?

Tabii ki, küçük bir rezervim var ve öğelerin boyutunu biraz artırabilirim, sonra ekran parametrelerini% 125'e yükselttiğimde.

her şey sığacak, ancak %150'ye çıkarırsam hiçbir şey sığmayacak.

Bu yüzden sorunu kökten çözmek istiyorum, böylece panelin öğeleri ve panelin kendisi de ölçekle orantılı olarak artacak. Bunu nasıl yapacağım?

Bu ölçek rakamını elde etmek için bir şekilde, muhtemelen WIN IP aracılığıyla -% 100 veya% 125 veya% 150 - gerekli olduğunu anlıyorum. Asıl soru, bunun EA kodunda nasıl uygulanacağı?



Not: Açıklama için. Program standart MQL5 kütüphanesini kullanmaktadır, ancak MQL4 ile yazılmıştır.


Yanıt verecek herkese şimdiden minnettarım....

TextSetFont() ve TextGetSize() kullanarak nesneleri oluşturmadan önce metin boyutunu tanımlamaya çalışın

 
Alexey Viktorov #:

Nesneleri oluşturmadan önce TextSetFont() ve TextGetSize() aracılığıyla metnin boyutunu tanımlamaya çalışın

TextGetSize() yardımcı oldu, teşekkürler.
 

Uygulamaya koyduğum bir bisiklet konstrüksiyonunu bir araya getirmeyi başardım. Kısaca anlatmaya çalışacağım.

Bir veri tabanı ile böyle bir çalışma var.

// Элемент БД.
class DATA
{
private:
  static int Count;
  
public:
  int Num;
  
  DATA() : Num(DATA::Count++) {}
};

static int DATA::Count = 0;

#define  SIZE 5

// БД.
class A
{
private:  
  static DATA DataArray[SIZE]; // База данных.
  static DATA* Data;           // Выбранный элемент БД.
  
public:
  static void Set( const int Num ) // Выбор элемента и перемешение элементов БД.
  {
    A::Data = &A::DataArray[Num % SIZE];
    
    ::ArrayReverse(A::DataArray); // Перемешение элементов БД.
  }
  
  static int Get() { return(A::Data.Num); } // Получение значения элемента.
};

static DATA A::DataArray[5];
static DATA* A::Data;

Veritabanından her bir öğe seçildiğinde öğeleri karıştırılıyor. Yapay olarak ama anlatmak gerekiyor.


Ve burada şunları yapmamız gerekiyor.

void OnStart()
{  
  A::Set(2);
  Print(A::Get()); // Какое-то значение Value.

  // Перемешиваем БД.
  MathSrand((int)TimeLocal());
  for (int i = MathRand(); i >= 0; i--)
    A::Set(i);
    
  Print(A::Get()); // Что-то образовалось.  
  
  Print(A::Get()); // Здесь хочется получить Value.
}

Kodun açıklaması: bir öğeyi ilk kez seçersiniz, sonra bunu birçok kez yaparsınız. Ve ilk kez seçilen öğeyi almamız gerekiyor.


Bunu yapabilmemiz için bir şekilde bir DB sınıfı eklememiz gerekiyor. Aynı zamanda elemanın işaretçisine (DATA*) erişim vermek imkansızdır.

 
fxsaber #:

Kod açıklaması: bir öğeyi ilk kez seçtik, sonra bunu birçok kez yaptık. Ve ilk kez seçilen öğeyi almamız gerekiyor.

Bunu mümkün kılmak için bir şekilde bir veritabanı sınıfı eklememiz gerekiyor. Aynı zamanda elemanın işaretçisine (DATA*) erişim vermek imkansızdır.

Çözüm, DB sınıfına birkaç satır eklemektir.

// БД.
class A
{
// Тело класса до решения задачи.
// .....

// В БД-класс дописываются эти строки.
public:
  class POINTER
  {
  private:
    DATA* Data;
    
  public:
    POINTER() : Data(A::Data) {}
    
    void Set() const { A::Data = this.Data; }
  };  
};


Bundan sonra OnStart şu şekilde görünür.

void OnStart()
{  
  A::Set(2);
  Print(A::Get()); // Какое-то значение Value.

  A::POINTER Pointer; // Запоминание элемента без доступа к нему.

  // Перемешиваем БД.
  MathSrand((int)TimeLocal());
  for (int i = MathRand(); i >= 0; i--)
    A::Set(i);
    
  Print(A::Get()); // Что-то образовалось.  
  
  Pointer.Set(); // Запомненный элемент становится выбранным в БД.
  Print(A::Get()); // Здесь хочется получить Value.
}

Bunu yapmak mümkündür çünkü ana sınıfın gövdesinde tanımlanan sınıfın bu ana sınıfın gizli statik üyelerine erişimi vardır.

 
fxsaber #:

Bir ana sınıfın gövdesinde tanımlanan sınıf, o ana sınıfın gizli statik üyelerine erişebilir.

Umarım bu MQL dilinin bir kusuru değil, uygun bir standarttır (özelliktir).

class A
{
  private: static int Num;
    
  public: struct B { static int Get() { return(A::Num); } };
};

static int A::Num = 5;

void OnStart()
{
  Print(A::B::Get()); // 5
}
 
fxsaber #:

Umarım bu MQL dilinde bir kusur değil, uygun bir standarttır (özellik).

C++ ile benzerlik gösterir. İç içe geçmiş bir sınıf, dahil olan sınıf için bir arkadaştır. Orada standartta yazıyor. Burada da yardım bölümüne yazılması iyi olur)
Neden: