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

 
Maksim Emeliashin 静态数组 和在这个数组中的字符串搜索。

对于MQL来说,这个功能将无法正常工作

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

https://www.mql5.com/ru/docs/strings/stringcompare

参数

绳子1

[in] 第一个字符串。

绳子2

[in] 第二个字符串。

大小写敏感=true

[在]区分大小写模式。如果是真的,那么 "A">"a"。如果是 假的,那么"A"="a"。默认值为真。

如果enum中会有两个常数,例如ENUM1和enum1,那么在i_str:"enum1"函数可以返回常数ENUM1 的值。为什么要用StringCompare?如果可以按以下方式进行。

template<typename T>
bool StringToEnum(const string i_str, T &o_val)
{
   for(int i = INT_MIN; i <= INT_MAX && !IsStopped(); i++) // перебор всех возможных значений int
      {
         o_val = (T)i;
         if(i_str == EnumToString(o_val))
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}
 
Amon1953 平仓 的原因。

我需要它来决定下一步该怎么做。

在MT5终端的历史窗口,你可以选择一个交易、订单或头寸。

在交易历史中,你需要寻找一个DEAL_REASON等于DEAL_REASON_SL的交易。


补充:可以简化--在OnTradeTransaction中只需捕捉交易TRADE_TRANSACTION_DEAL_AD,并调用交易历史寻找创建此交易的DEAL。然后同样的配方:...DEAL_REASON等于DEAL_REASON_SL

 
Mihail Matkovskij #:

对于MQL,该函数将无法正常工作

https://www.mql5.com/ru/docs/strings/stringcompare

如果enum中有两个常数,例如ENUM1和enum1,那么通过i_str:"enum1",函数可以返回常数ENUM1 的值。我们到底为什么需要StringCompare?如果可以按以下方式进行。

还有一个更快的变体。

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);
}

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

这一切是为了什么?你想用你自己的数值替换ENUM_TIMEFRAMES的数值吗?还是什么?

那么,现在我需要在数据库中写入指标和EA的参数设置。同时,我希望能有。

1. 人类可读的记录

2.机器可读的记录

3.在自定义枚举中添加新值的稳定性,不一定在最后。

记录--EnumToString没有问题,但开发者没有制作反向函数,这与所有其他类型不同。

 
Mihail Matkovskij #:

还有更快的版本。

我同意关于大小写不敏感的比较,我为自己写了一个更通用的自行车,用于我自己的枚举,在这里我不使用小写。

但如果对于ENUM_TIMEFRAMES运行这个变体。

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
你可以有时间喝杯咖啡,同时它也在回升,例如PERIOD_MN1 :)
 
Valeriy Yastremskiy #:

从每个条形图上的直线中获取价格,并进行比较或找出差异,在交叉差异的标志发生变化的地方)顺便说一下,条形图上可能没有相等的东西。

那是用什么函数来做的?MqlRates?如果我使用ObjectGet,那么我必须在那里指定对象属性,如果我采取OBJPROP_PRICE,那么我怎样才能使它获得当前柱子之前的价格。
 
12345678902003 #:
请帮助,我画了两条江恩线,它们相交于某一点,我需要知道这些线的交点的坐标。
如果你能确定江恩线第二点的价格,那么KimIV 可以进一步帮助你
 
Maksim Emeliashin #:

我同意关于忽略大小写的比较,我为自己写了一个更通用的自行车,用于我自己的枚举,在这里我不使用小写。

但如果对于ENUM_TIMEFRAMES来说,运行这个变体。

你可能有时间在它恢复之前喝咖啡,例如在PERIOD_MN1 :)

那么,在ENUM_TIMEFRAMES,最小和最大的值是已知的这就是为什么它们可以被明确地指定。

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

 
Maksim Emeliashin #:

现在,我需要将指标设置和EA参数写入数据库。同时,我希望能有。

1. 人类可读的记录

2.机器可读的记录

3.稳定地在其自定义枚举中添加新的值,不一定在最后。

记录--EnumToString没有问题,但开发者没有做一个反向函数,这与所有其他类型不同。

你有没有试过打印一个枚举表?

Print(PERIOD_M5);

你认为会印什么?


但以编程方式创建一个枚举......是的。这将是有趣的。

 
x572intraday #:
为什么我们不能通过输入 参数进行循环?你为什么要这样惩罚我们?
这当然是一个拐杖,但我使用它:通过一些给定的分隔符将所有需要的数据输入一个字符串输入变量,然后使用StringSplit 将其溢出到一个数组中。
原因: