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

 
vladmirad:

谢谢你的建议,我知道这些功能。

你知道为什么这么多人,包括你在内,回复那些对mql了如指掌的人吗?而他们却无视有识之士的建议?如果你没有,请查看这个提示。

关于交易、自动交易系统和策略测试的论坛。

初学者对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论

Artyom Trishkin, 2020.06.29 00:03

你好。
首先在OnChartEvent()中监控图形的状态https://www.mql5.com/ru/docs/event_handlers/onchartevent
有几个事件是你需要的:
CHARTEVENT_OBJECT_CREATE 创建图形对象
CHARTEVENT_OBJECT_CHANGE 通过属性对话框改变图形对象的属性
CHARTEVENT_OBJECT_DELETE 删除图形对象
https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
在添加/修改/删除图形对象时,记录OnChartEvent()处理器的所有参数并查看其值。这将为你提供去哪里的方向。

 
vladmirad:

谢谢你的提示,我知道这些功能。
但是,如果我们不预先知道一个对象的名称,我们怎么能用它们来自动找到图表上的一个对象并读取其参数呢?
当用鼠标在图表上画一个对象时,系统会给出它的名字。

当然,从对象的属性表中手动输入对象的所有必要数据并不困难,但为什么要实现自动化?
但如何以编程方式给EA一个对象的名称,然后可以使用你提到的所有功能,我仍然不清楚......

如上所述,与图表事件一起工作。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool applyObject(const string _objName) {
  if(MessageBox("Сохранить параметры объекта \"" + _objName + "\" для эксперта?", "ObjChange", MB_YESNO) == IDYES) {
    objName = _objName; // Запись имени изменяемого объекта
    // Запись других параметров изменяемого объекта ...
    return true;
  }
  return false;
}

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam
) {
//---
  if(id == CHARTEVENT_OBJECT_CREATE || id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE) {
    applyObject(sparam);
  }
}
附加的文件:
ObjChange.mq5  5 kb
 
Artyom Trishkin:
你好。首先在OnChartEvent()中跟踪图表的状态
https://www.mql5.com/ru/docs/event_handlers/onchartevent
有几个你需要的事件: CHARTEVENT_OBJECT_CREATE 创建一个图形对象 CHARTEVENT_OBJECT_CHANGE 通过属性对话框改变一个图形对象的属性 CHARTEVENT_OBJECT_DELETE 删除一个图形对象



https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
当你添加/修改/删除图形对象时,记录OnChartEvent()的所有参数并查看其值。这将为你提供去哪里的方向。

非常感谢你,我已经采纳了你的建议。

 
Mihail Matkovskij:

你可以找到并记录给定类型的对象,其坐标如下。

你可以将任何数据保存到一个文件中。并在专家顾问中制作一个加载器,将添加适当的对象,然后将文件中的数据加载到其中。但你至少要为你的具体任务勾勒出一个源代码,并在这里发布。

也谢谢你,迈克尔,谢谢你的实际帮助!"。
 
Mihail Matkovskij:

如上所述,与图表事件一起工作。

迈克尔,你和@Artyom Trishkin的 帮助非常有帮助!

现在我们需要弄清楚如何找到价格图表和找到的对象之间的交叉点,在这种情况下,趋势线。

该算法如下:
1.使用趋势线的读数坐标,我们计算出所选TF每1条的趋势增加系数。
2.计算趋势线在当前柱子上的价格坐标,并监测在选定的TF期间该点在图表上的交叉事实。
3.如果有,我们就着手处理这一事件,例如,开立一个订单。如果不是,则对下一个小节重复这一程序。

但也许MT4(5),由于这个系统的特殊性,有一个更简单的解决方案?

 
Alexey Viktorov:

你知道为什么这么多人,包括你,对那些了解mql的人像斧头一样的回应吗?而且他们无视那些知道的人的建议。在你的情况下,它是这个建议。


亲爱的阿列克谢,你对我对MQL的了解完全正确。然而,你说我不注意内部人士的建议是错误的,因为我第一次接触的是@Artyom Trishkin,我相信他是杰出的MQL专业人士之一,你对他很了解。

他的建议使我立即明白了如何解决我的问题,并为我的进一步行动开了眼界。而@Mihail Matkovskij 让我的生活变得更加轻松!

 
vladmirad:

迈克尔,你和@Artyom Trishkin的 帮助非常有帮助!

现在我们需要弄清楚如何找到价格图表和找到的对象之间的交叉点,在这种情况下,趋势线。

该算法如下:
1.使用趋势线的读数坐标,我们计算出所选TF每1条的趋势增加系数。
2.计算趋势线在当前柱子上的价格坐标,并监测在选定的TF期间该点在图表上的交叉事实。
3.如果有,我们就着手处理这一事件,例如,开立一个订单。如果不是,则对下一个小节重复这一程序。

但也许MT4(5),由于这个系统的特殊性,有一个更简单的解决方案?

正如我上面所说的,勾画一个源代码,以便有东西可以开始。此外,你已经有一些关于如何在图表上获得对象数据的知识。没有人愿意从头开始为你做一切。通过这种方式,可以补充专家工作的不足......

 
vladmirad:

迈克尔,你和@Artyom Trishkin的 帮助非常有帮助!

现在我们需要弄清楚如何找到价格图表和找到的对象之间的交叉点,在这种情况下,趋势线。

该算法如下:
1.使用趋势线的读数坐标,我们计算出所选TF每1条的趋势增加系数。
2.计算趋势线在当前柱子上的价格坐标,并监测在选定的TF期间该点在图表上的交叉事实。
3.如果有,我们就着手处理这一事件,例如,开立一个订单。如果不是,则对下一个小节重复这一程序。

也许在MT4(5)中的解决方案,由于该系统的特殊功能,要简单得多?

不太清楚你想找到什么。你想通过某个条形图上的价格找到穿越趋势线的点?为此,有一些函数用于获取条形图上的线的值。但我会使用直线方程。

关于交易、自动交易系统和交易策略测试的论坛

初学者的常见问题 MQL5 MT5 MetaTrader 5

Artyom Trishkin, 2020.05.02 12:27

使用直线方程。

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) 
  {
   return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
  }
//+------------------------------------------------------------------+

指定左边的点的条数和价格,指定右边的点的条数和价格(在这些点上画一条虚拟线),并指定你要寻找的条数
该函数将返回你所寻找的酒吧的价格。


不需要真实物体的存在。
 
Artyom Trishkin:

.....有一些函数用于获取条形图上的线值。但我会使用直线方程。

.....

Artyom,请在这里提供更多细节。

要么是我以前不是很注意,要么是文件被调整了......我不知道。

但我一直认为ObjectGetDouble返回的是某一栏的行价(我指的是准确的价格)。在这里,我决定做一个小脚本来检查它,我看到了什么?

1.在参数中没有条形号码,应该在其上读取数值。

2.财产标识符。

OBJPROP_PRICE

价格协调

修改器=锚点的数量


它只是一个锚点!

是的,基本上,如果我在代码中画出这条线,我就已经有了这些点!为什么我需要了解他们?事实上,这有什么意义呢?

我怎样才能在其他地方获得这条线路的价格价值?


事实证明,这是

榰_modifier

[in] 指定属性的修改器。对于第一个选项,修改器的默认值是0。大多数属性不需要修改器。表示斐波那契工具 和安德鲁斯的Pitchfork图形对象中的一个水平数。级别的编号从零开始。

这难道一点意义都没有吗?它是在寻找任何风扇线的连接点吗?那是胡说八道。请原谅。

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Сергей Таболин:

Artyom,你能在这里说得更详细一点吗?

要么是我以前不是很注意,要么是文件被调整了......。我不知道。

但我一直认为ObjectGetDouble返回的是某一特定条形上的行价(我是说价格)。在这里,我决定做一个小脚本来检查它,我看到了什么?

1.在参数中没有条形号码,应该在其上读取数值。

2.财产标识符。

OBJPROP_PRICE

价格协调

修改器=锚点的数量


它只是一个锚点!

是的,基本上,如果我在代码中画出这条线,我就已经有了这些点!为什么我需要了解他们?事实上,这有什么意义呢?

我怎样才能在其他地方获得这条线路的价格价值?


事实证明,这是

榰_modifier

[in] 指定属性的修改器。对于第一个选项,修改器的默认值是0。大多数属性不需要修改器。表示斐波那契工具 和安德鲁斯的Pitchfork图形对象中的一个水平数。级别的编号从零开始。

这难道一点意义都没有吗?它是在寻找任何风扇线的连接点吗?那是胡说八道。请原谅我。

我没怎么接触过这种物体。根据指定的条形时间,这个函数将返回什么趋势?我没有时间去检查它。即使是在一个小剧本中完成...

通过时间获取价值(ObjectGetValueByTime)。

Документация по MQL5: Графические объекты / ObjectGetValueByTime
Документация по MQL5: Графические объекты / ObjectGetValueByTime
  • www.mql5.com
Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду...
原因: