卡利什,你好、
有趣的方法,祝贺你完成了你的系列文章。 OnEvent 编码是实现这一切的关键。 你的第一篇文章让我兴奋不已,我开发了我自己的一个版本的可移动面板。 这是一个基类,每个面板类型都有自己的继承类。其次,由于我已经根据 MQL 帮助文件中的示例创建了一个控件 头文件,因此我选择使用它而不是创建一个 Text 类来进行继承,而且效果很好。 我计划为 GUI 类再创建两个方法:保存和初始化。 保存将读取和更新 CSV 文件,并设置起始位置和数据。 初始化将读取 CSV 文件,并设置初始位置。
为了便于您查看,我附上了我当前 EA 标题和两个面板的屏幕截图。 第一个是我将使用的 "活跃订单",而样本则是用于其他面板模板的基本版本。
祝您今后一切顺利,我会关注的
科达角
文章写得很好。说理透彻,解释清楚。我很喜欢。😁👍
为了便于您查看,我附上了我当前 EA 标题和两个面板的屏幕截图。 第一个是我将使用的主动订单,而样本则是用于其他面板模板的基本版本。
祝您今后一切顺利,我会关注的
科达角
我很高兴你能从我的文章中受益。
事实上,是你激励我写下了这第三部分,否则我可能会因为缺乏动力而花费更多时间。
非常感谢你。
也祝您今后工作顺利。
你好,凯拉什、
我希望你能关注这篇文章,因为我不知道如何发私信。
无论如何,我已经将你的概念融入到了一个更好的 EA 组织方式中。 这是我的旧版本和使用你的可移动面板概念的版本的截图,其中使用了你的第二部分概念,并带有多个子类。 虽然它仍处于初步开发阶段,但它将允许我在模型测试期间显示更多相关数据。
现在,我为每个面板(包括控制器) 都设置了一个单独的子类。
clsGUI GUI; clsAO AO; clsBOB BOB; clsCTL CTL; clsXO XO; clsATR ATR; clsRSI RSI; clsMM MM; clsTS TS; //clsAO Guis[egElements]; //clsGui GuiS[egElements]; //object Guis[egElements];
虽然这种方法已经足够,但它会导致许多单独的函数来处理 EA 面板中的各种任务。 一种更好的方法是拥有一个子类数组,并将其用作减少函数调用的参数。 我曾尝试使用前两种方法,但我无法将数组中的元素转换为相应的子类,以便调用其独特的公共函数。这种方法似乎使用了参数元素的元素类定义,而不是数组的类定义。
int Wrapper(object &theobject){ return(theobject.aninteger): } int i=Wrapper(Guis[5]);
这种方法对 Guis[5].Create_Controls(......) 无效;
我所看到的唯一可行的方法是使用 c_array 创建一个对象指针数组并将其添加到数组中,然后通过调用 c_array AT(location) 函数的函数将数组指针赋值给本地声明的对象的本地指针,以便在本地访问子变量。
您或任何人是否知道如何解决这个问题,或者是否可以提供 MQL 文章或文档的参考,以解决子类数组而不是单类数组的问题?
非常非常感谢,我期待着您的下一篇文章。
科达角
这是一个为 OOP 而使用 OOP 的好例子。
结果发现它既麻烦又不方便(我个人认为)。但它能工作,这已经很不错了:)
您应该添加 OBJPROP_ZORDER,否则按钮偶尔会被按下。
void Button::Create(string name, int xDis = 0, int yDis = 0, int xSize = 0, int ySize = 0) { ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xDis); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yDis); ObjectSetInteger(0, name, OBJPROP_XSIZE, xSize); ObjectSetInteger(0, name, OBJPROP_YSIZE, ySize); ObjectSetInteger(0, name, OBJPROP_ZORDER, 1); _name = name; } //+------------------------------------------------------------------+
结果发现它既麻烦又不方便(我个人认为)。但它能工作,这已经很不错了:)
您需要添加 OBJPROP_ZORDER,否则按钮偶尔会被按下。
这根本不是 OOP。这些都是在类中重新包装的终端方法。
如果程序员想制作一个不同的图形用户界面(通过其他文章中介绍的 WebSocket),他什么也做不了。他只会扔掉文章中的所有代码,重新写一篇。
如果要彻底改变可视化部分,但使用的是同一个 ObjectCreate(xx) - 则必须重写所有代码。
或者如何禁用图形用户界面,使其不占用 VDS-ka 的 CPU。
可重用性在哪里? 为什么图形用户界面与其他代码穿插在一起......我们甚至不能谈论样式,至少是颜色。
使用文章中的库,一个典型 EA 的代码变得更短了吗? 但不可能,它不是为此而写的 :-)
这根本不是 OOP。这些都是用类重新包装的终端方法。
如果程序员想制作不同的图形用户界面(通过其他文章中介绍的 WebSocket),他什么也做不了。他只会扔掉这篇文章中的所有代码,然后再写另一篇。
如果要彻底改变可视化部分,但使用的是同一个 ObjectCreate(xx),则仍需重写所有代码。
或如何禁用图形用户界面,使其不占用 VDS-ka 的 CPU。
可重用性在哪里? 为什么图形用户界面与其他代码穿插在一起......我们甚至不能谈论样式,至少是颜色。
使用文章中的库,典型 EA 的代码变得更短了吗? 但不可能,它不是为此而写的 :-)
好吧,我认为在这里讨论颜色是不太正确的。
但事实上,买入和卖出按钮是反向放置的,这会误导用户。


如果是手动交易面板, 为什么要关闭图形用户界面就 不清楚了。不过,如果它不是一个交易面板,而是一个信息面板,那么最好还是考虑禁用它。
我喜欢 RectangleLabel::OnEvent 和 RectangleLabel::Add 函数的组织方式,它漂亮、清晰、易读。
我在我的面板中使用了同样的原则,但我的代码有点乏味。总的来说,它并不美观。所以我决定使用文章中的代码来制作一个新的面板。
面板最终完成了,但我花在上面的时间比从头开始写还要多。
总的来说,结论如下:这篇文章很有趣,也很有用,但文章中的代码部分没有经过深思熟虑。
关于颜色,我觉得在这里讨论颜色不太合适。
但事实上,买入和卖出按钮的位置是相反的,这可能会误导用户。
如果是手动交易面板, 不清楚为什么要关闭图形用户界面。不过,如果它不是一个交易面板,而是一个信息面板,那么是的,最好考虑禁用它。
我喜欢 RectangleLabel::OnEvent 和 RectangleLabel::Add 函数的组织方式,它们漂亮、清晰、易读。
我在我的面板中使用了同样的原则,但我的代码有点乏味。总的来说,并不美观。因此,我决定将文章中的代码用于一个新的面板。
最后,我完成了面板,但我花在上面的时间比从头开始写还要多。
总的来说,结论如下:这篇文章很有趣,也很有用,但文章中的代码部分没有经过深思熟虑。
有很多经过深思熟虑的方法,都有漂亮的箭头 "如何实现用户界面,使其不痛苦":-)MVC 和类似方法。因此,前端(win,gtk,qt,web)有时只需动动手就能改变。
在 MQL 中,它们都没有实现。一切都被钉死了,比 TurboVision 还糟糕--尽管有来自 Adam 的类,但那里有模型。
个人多年来一直在写 "简单易行 "和 "界面简洁",但这与本文中的 内容如出一辙。大量的代码并没有让任何事情变得更简单。唯一的效果就是给作者的账户加分。
新文章 利用 MQL5 的交互式 GUI 改进您的交易图表(第 III 部分):简易可移动交易 GUI已发布:
加入我们的《利用 MQL5 的交互式 GUI 改进您的交易图表》系列的第 III 部分,我们将探索将交互式 GUI 集成到 MQL5 中的可移动交易仪表板之中。本文建立在第 I 部分和第 II 部分的基础上,指导读者将静态交易仪表板转换为动态、可移动的。
您好,欢迎回到我们系列的第 3 部分《利用 MQL5 的交互式 GUI 改进您的交易图表》。
在我们进入新领域之前,我们先快速回顾一下我们在第 I 部分和第 II 部分中涵盖的内容:
现在,我们已经准备好了第 III 部分!在该部分中,我们把重点放在通过将 GUI 集成到仪表板中来增强仪表板。因为若无 GUI,仪表板就无法达到其预期目的。
作者:Kailash Bai Mina