mql5语言的特点、微妙之处以及技巧 - 页 228

 
fxsaber #:
已添加。

以前写作时不使用常量的人现在不能这样做了。否则会出现错误。

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 是事件列表的第一位????。我的意思是,在枚举事件部分,你可以让每个位都像这样可用吗?


请告诉我。

 

有两种类型的经纪商可以转换美国/欧洲时间。因此,过夜时间会发生变化。

经纪商类型可自动确定。

// Вычисление типа брокера (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 个性化设置放大时,只有字体被放大、

面板上只有字体按比例放大,但控件本身却没有按比例放大,因此,题词超出了控件边界。

怎样才能解决这个问题,使字体、面板元素和面板本身的大小都按比例缩放呢?

当然,我有一个小储备,我可以稍微增大元素的尺寸,然后如果我将屏幕参数增加到 125%

一切都会合适,但如果增加到 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++。嵌套类是包含类的朋友。它写在那里的标准中。如果能写在这里的帮助中也会很好)。