新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1878

 
Mihail Matkovskij #:

那么,在ENUM_TIMEFRAMES,最小和最大的值是已知的因此,它们可以被明确地设置。

对于其他枚举,只要知道它们的大致取值范围即可。如果在枚举 声明中没有指定常量,那里的值通常从0开始。i_max_enum可以由任何两位或三位数的数字设置:50、100、255。

你也可以通过实验得到最小和最大的枚举值。把它们写下来,并在StringToEnum中指定它们,以获得最理想的速度。

int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
  int min, max;
  min = INT_MAX; max = INT_MIN;
  nEnum = 0;
  for(int i = _minEnum; i <= _maxEnum && !IsStopped(); i++) {
    enum_ = (T)i;
    if(StringFind(EnumToString(enum_), "::", 0) >= 0)
      continue;
    if (i < min)
      min = i;
    if (i > max)
      max = i;
    nEnum++;
  }
  if (min != INT_MAX && max != INT_MIN) {
    __min = min;
    __max = max;
    return true;
  }
  return false;
}

template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN, INT_MAX); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  int min, max;
  if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))
    printf("enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d", min, max, nEnum);
  else
    Print("enumFindMinMax Error!");
}

脚本的结果。

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37, max: 52, Count: 14

打开ENUM_ACCOUNT_INFO_DOUBLE,看到。常量的数量是数(14)。因此,在应用程序的开始,你可以处理所有必要的枚举,写出它们的最小和最大值,并以最佳速度 使用StringToEnum对应的最小和最大值

P.S. enumFindMinMax的第二个变体是INT_MIN和INT_MAX,真的非常慢。我一开始就试过了。然后我厌倦了等待enumFindMinMax 的完成,将数值从-500设置到500。

if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))

因此,我得出一个结论:根本没有必要使用整个int范围。

附加的文件:
 

我正面临着终端的一个奇怪行为。

情况如下:一个专家顾问在一个图表中工作,在某一时刻打开另一个图表,并在新的图表上设置某个寺庙。后一个模板已被定义为在新图表上启动第二个EA。

在一周中一切正常,但当市场关闭时,在周末,新的庙会在新的图表上启动(在改变图表的外观时可以看到),但第二个EA并没有在那里启动。"推动 "第二个专家顾问的唯一方法是手动启动,在任何图表上,任何脚本,甚至一个绝对空的脚本。然后第二位专家开始制作一个新的图表。

我在第一个专家顾问中使用ChartOpen和ChartApplyTemplate 函数以及CChart类编写了这段代码--结果总是一样,在一个封闭的市场中,新图表上的第二个专家顾问不会启动,直到我以某种方式手动 "推动 "终端。

谁可能面临过这样的情况?如何应对,以何种方式 "挖掘"?

 
akskarabey ChartApplyTemplate 函数以及CChart类编写了这段代码--结果总是一样,在一个封闭的市场中,新图表上的第二个专家顾问不会启动,直到我以某种方式手动 "推动 "终端。

谁可能面临过这样的情况?如何处理,以何种方式 "挖掘"?

你怎么知道它不能启动?

P.S.

试试这样的方式

int OnInit()
{
....
....

 ChartRedraw();
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij #:

你可以用蛮力函数找到enum中的常数(与 的原理相同),用EnumToString翻译并与所需的常数进行比较。剩下的就是返回结果。

我们能不能有一个例子(或至少是一个关键的句子),因为我没有想到什么?你是否也要翻阅大量的价值清单,筛选出所有的左撇子,还是只找有用的?目前我不认为有什么可以筛选的,名单中没有左手的...但我无法把握住这个想法。

 
x572intraday #:

你能给我一个例子吗(或者至少是一个关键行),因为我想不出来。它也会是一个巨大的价值清单,在左边的价值中筛选出正确的价值,或者只筛选出有用的价值?目前我不认为有什么可以筛选的,名单中没有左手的...但我无法把握住这个想法。

为了避免翻阅所有可能的枚举值(因为它真的很长),应该做以下准备工作(类似于缓存)。那么在这个函数 的帮助下,你可以很容易地将字符串/行转化为枚举,知道所有需要的枚举的范围。或者可以在一个相对较小的范围内搜索enum

template<typename T>
bool StringToEnum(const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for(int i = i_min_enum; i <= i_max_enum && !IsStopped(); i++) {
     o_val = (T)i;
     if(i_str == EnumToString(o_val))
       return(true);
   }
   o_val = WRONG_VALUE;
   return(false);
}


template<typename T>
bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
 
Vitaly Muzichenko #:

你是如何确定它没有启动的,你怎么能知道?

P.S.

试试这样的方式

OnInit部分的第二个专家在日志中做出了结论,没有日志信息。日志中甚至没有来自终端的关于专家顾问启动的信息。而专家顾问的名字并没有出现在右上角的图表中。

 
12345678902003 #:
那么用于这一目的的功能是什么?MqlRates?如果我使用ObjectGet,我应该在那里指定对象属性;如果我采取OBJPROP_PRICE,我应该如何使它获取到当前栏的价格。

得到就是得到。有一个函数可以通过对象的名称或对象的类型和名称获得对象的某一属性,来获得价格或时间。使用的不是条形数字,而是从零开始的偏移量。

 
Valeriy Yastremskiy #:

得到就是得到。有一个函数可以通过对象的名称或对象的类型和名称获得对象的某一属性,来获得价格或时间。使用的不是条形数字,而是从零开始的偏移量。

这可以用ObjectGetValueByTime()函数来完成。

例子

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
我有以下问题 - Terminal\MQL4\Indicators文件夹在其指标列表中有指标,但终端MQL4在其列表中没有这些指标,这些指标被拖到图表中。如何使这些指标出现在终端列表中,以便它们可以在MQL4 终端的图表中使用?在右边的截图中,是那些MQL4 终端 中可用的指标,左边是MQL44/Indicators 文件夹中同一终端的指标 (作为例子)
附加的文件:
 
Halina Okopna-Pecuch #:
我有以下问题 - Terminal\MQL4\Indicators文件夹中的指标列表包含指标,但在终端MQL4的列表中,这些指标被拖到图表上,它们却没有。如何使这些指标出现在终端列表中,以便它们可以在MQL4 终端的图表中使用?在右边的截图中,是那些MQL4 终端 中可用的指标,左边是MQL44/Indicators 文件夹中同一终端的指标 (作为例子)。

这些可能都不是指标。

原因: