mql5言語の特徴、微妙なニュアンスとテクニック - ページ 228

 
fxsaber #:
追記。

今までconstを使わずに書いていた人は書けなくなりました。さもないとエラーになる。

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
}

この技術革新は、これまで書かれていたコードに深刻なバグをもたらすことを約束しているようだ。

 

すみません。「TRADE_EVENT_POSITION_OPEN =0x1" x1ってイベントリストの最初のビット?つまり、そのenumイベント部分では、そのようにすべてのビットを使用可能にすることができますか?


教えてください。

 

ブローカーには2つのタイプがあり、米国と欧州の時間を翻訳します。このため、特に、ロールオーバーの時間がずれます。

ブローカータイプは自動的に決定されます。

// Вычисление типа брокера (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"));
}


いくつかのブローカーで起動結果。

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

こんにちは!

このスレッドで質問するのが正しいのかどうか分かりませんが・・・。

質問の本質 -標準ライブラリの AppDialogをベースに、ボタン、入力フィールド、ラベルを備えたパネルを作りました。

顧客は、Windowsの個人設定によってズームインしたときに、フォントだけが拡大表示されることに不満を述べています、

パネルのフォントだけが拡大され、コントロール自体は拡大されません。

フォントだけでなく、パネル要素やパネル自体のサイズも拡大縮小されるようにするには、どうすればよいでしょうか?

もちろん、私は小さな予備を持っており、要素のサイズをわずかに大きくすることができます。

しかし、150%にすると、何も収まりません。

そこで、この問題を根本的に解決して、パネルの要素やパネル自体もスケールに比例して大きくしたいのです。どうすればいいでしょうか?

どうにかして、おそらくWINのIPを通して、100%、あるいは125%、150%というスケールの数値を得る必要があることは理解しています。問題は、それをEAのコードにどのように実装するかということです。



追伸:明確にするために。このプログラムは標準MQL5ライブラリを使用していますが、MQL4で書かれています。


ご回答いただける皆様に感謝いたします。

 
Vitaliy Davydov 標準ライブラリの AppDialogに基づいてボタン、入力フィールドとラベルを持つパネルを作りました。

顧客は、Windowsの個人設定によってズームインしたときに、次のような不満を述べました、

パネルのフォントだけが拡大され、コントロール自体は拡大されません。

フォントだけでなく、パネル要素やパネル自体のサイズも拡大縮小されるようにするには、どのように問題を解決すればよいでしょうか。

もちろん、私は小さな予備を持っており、要素のサイズをわずかに増加させることができ、その後、画面パラメータを125%に増加させたとき。

しかし、150%にすると、何も収まりません。

そこで、この問題を根本的に解決して、パネルの要素やパネル自体もスケールに比例して大きくしたいのです。どうすればいいでしょうか?

どうにかして、おそらくWINのIPを通して、100%、あるいは125%、150%というスケールの数値を得る必要があることは理解しています。問題は、それをEAのコードにどのように実装するかということです。



追伸:明確にするために。このプログラムは標準のMQL5ライブラリを使用していますが、MQL4で書かれています。


ご回答くださる皆様に感謝いたします。

TextSetFont()とTextGetSize()を使ってオブジェクトを作成する前に、テキストのサイズを定義してみてください。

 
Alexey Viktorov #:

オブジェクトを作成する前に、TextSetFont() や TextGetSize() でテキストのサイズを定義するようにしましょう。

TextGetSize()は役に立ちました。
 

なんとか自転車の構造を組み立て、実践してみた。簡単に説明しよう。

データベースを使ったこんな作業がある。

// Элемент БД.
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;

データベースからアイテムを選択するたびに、その要素がミックスされる。人為的なものだが、説明する必要がある。


そして、ここでは次のようにする必要がある。

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.
}

コードの説明:最初に要素を選択し、それを何度も繰り返す。そして、最初に選択された要素を取得する必要がある。


そのためにはDBクラスを追加する必要がある。同時に、要素へのポインタ(DATA*)にアクセスすることは不可能である。

 
fxsaber #:

コードの説明:ある要素を初めて選択し、それを何度も繰り返した。そして、最初に選択された項目を取得する必要がある。

そのためには、データベース・クラスを追加する必要がある。同時に、要素へのポインタ(DATA*)にアクセスすることは不可能である。

解決策は、DBクラスに数行を追加することだ。

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

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


その後、OnStartは次のようになる。

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.
}

メイン・クラスの本体に定義されたクラスが、このメイン・クラスの隠れた静的メンバにアクセスできるため、このようなことが可能になる。

 
fxsaber #:

メイン・クラスの本体で定義されたクラスは、そのメイン・クラスの隠れた静的メンバにアクセスできる。

これはMQL言語の欠陥ではなく、便利な標準(機能)であってほしい。

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 #:

これがMQL言語の欠陥ではなく、便利な標準(機能)であることを願う。

C++とのアナロジーで。ネストされたクラスはインクルードされたクラスの友である。そちらでは標準に書かれている。ここでもヘルプに書くといいだろう)
理由: