文章 "利用 MQL5 的交互式 GUI 改进您的交易图表(第 III 部分):简易可移动交易 GUI"

 

新文章 利用 MQL5 的交互式 GUI 改进您的交易图表(第 III 部分):简易可移动交易 GUI已发布:

加入我们的《利用 MQL5 的交互式 GUI 改进您的交易图表》系列的第 III 部分,我们将探索将交互式 GUI 集成到 MQL5 中的可移动交易仪表板之中。本文建立在第 I 部分和第 II 部分的基础上,指导读者将静态交易仪表板转换为动态、可移动的。

您好,欢迎回到我们系列的第 3 部分《利用 MQL5 的交互式 GUI 改进您的交易图表》。

在我们进入新领域之前,我们先快速回顾一下我们在第 I 部分和第 II 部分中涵盖的内容:

1. 在第 I 部分中,我们从理解图表事件概念开始,然后在同一图表上创建了两个简单的可移动仪表板。

2. 至于第 II 部分,我们更进一步。我们利用 .mqh 文件中的类令我们的代码更加高效和通用,准备好与满级的 EA/指标集成。


现在,我们已经准备好了第 III 部分!在该部分中,我们把重点放在通过将 GUI 集成到仪表板中来增强仪表板。因为若无 GUI,仪表板就无法达到其预期目的。

作者:Kailash Bai Mina

 

卡利什,你好、


有趣的方法,祝贺你完成了你的系列文章。 OnEvent 编码是实现这一切的关键。 你的第一篇文章让我兴奋不已,我开发了我自己的一个版本的可移动面板。 这是一个基类,每个面板类型都有自己的继承类。其次,由于我已经根据 MQL 帮助文件中的示例创建了一个控件 头文件,因此我选择使用它而不是创建一个 Text 类来进行继承,而且效果很好。 我计划为 GUI 类再创建两个方法:保存和初始化。 保存将读取和更新 CSV 文件,并设置起始位置和数据。 初始化将读取 CSV 文件,并设置初始位置。

为了便于您查看,我附上了我当前 EA 标题和两个面板的屏幕截图。 第一个是我将使用的 "活跃订单",而样本则是用于其他面板模板的基本版本。


祝您今后一切顺利,我会关注的


科达角

附加的文件:
 

文章写得很好。说理透彻,解释清楚。我很喜欢。😁👍

 
CapeCoddah 控件 头文件,因此我选择使用它而不是创建一个 Text 类来进行继承,而且效果很好。 我计划为 GUI 类再创建两个方法:保存和初始化。 保存将读取和更新 CSV 文件,并设置起始位置和数据。 初始化将读取 CSV 文件,并设置初始位置。

为了便于您查看,我附上了我当前 EA 标题和两个面板的屏幕截图。 第一个是我将使用的主动订单,而样本则是用于其他面板模板的基本版本。


祝您今后一切顺利,我会关注的


科达角

我很高兴你能从我的文章中受益。

事实上,是你激励我写下了这第三部分,否则我可能会因为缺乏动力而花费更多时间。

非常感谢你。

也祝您今后工作顺利。

 
Daniel Jose #:

文章写得很好。说理透彻,解释清楚。我很喜欢。😁👍

这是我的荣幸。感谢您抽出时间。

 

你好,凯拉什、

我希望你能关注这篇文章,因为我不知道如何发私信。

无论如何,我已经将你的概念融入到了一个更好的 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;
  }
//+------------------------------------------------------------------+
 
Alexander Slavskii #:
它能工作,这很好:)

感谢您的建议。

 
Aleksandr Slavskii OOP 而使用 OOP 的一个明显例子。

结果发现它既麻烦又不方便(我个人认为)。但它能工作,这已经很不错了:)


您需要添加 OBJPROP_ZORDER,否则按钮偶尔会被按下。

这根本不是 OOP。这些都是在类中重新包装的终端方法。

如果程序员想制作一个不同的图形用户界面(通过其他文章中介绍的 WebSocket),他什么也做不了。他只会扔掉文章中的所有代码,重新写一篇。

如果要彻底改变可视化部分,但使用的是同一个 ObjectCreate(xx) - 则必须重写所有代码。

或者如何禁用图形用户界面,使其不占用 VDS-ka 的 CPU。

可重用性在哪里? 为什么图形用户界面与其他代码穿插在一起......我们甚至不能谈论样式,至少是颜色。

使用文章中的库,一个典型 EA 的代码变得更短了吗? 但不可能,它不是为此而写的 :-)

 
Maxim Kuznetsov #:

根本不是 OOP。这些都是用类重新包装的终端方法。

如果程序员想制作不同的图形用户界面(通过其他文章中介绍的 WebSocket),他什么也做不了。他只会扔掉这篇文章中的所有代码,然后再写另一篇。

如果要彻底改变可视化部分,但使用的是同一个 ObjectCreate(xx),则仍需重写所有代码。

或如何禁用图形用户界面,使其不占用 VDS-ka 的 CPU。

可重用性在哪里? 为什么图形用户界面与其他代码穿插在一起......我们甚至不能谈论样式,至少是颜色。

使用文章中的库,典型 EA 的代码变得更短了吗? 但不可能,它不是为此而写的 :-)

好吧,我认为在这里讨论颜色是不太正确的。

但事实上,买入和卖出按钮是反向放置的,这会误导用户。


如果是手动交易面板, 为什么要关闭图形用户界面就 不清楚了。不过,如果它不是一个交易面板,而是一个信息面板,那么最好还是考虑禁用它。

我喜欢 RectangleLabel::OnEvent 和 RectangleLabel::Add 函数的组织方式,它漂亮、清晰、易读。

我在我的面板中使用了同样的原则,但我的代码有点乏味。总的来说,它并不美观。所以我决定使用文章中的代码来制作一个新的面板。

面板最终完成了,但我花在上面的时间比从头开始写还要多。

总的来说,结论如下:这篇文章很有趣,也很有用,但文章中的代码部分没有经过深思熟虑。

 
Aleksandr Slavskii #:

关于颜色,我觉得在这里讨论颜色不太合适。

但事实上,买入和卖出按钮的位置是相反的,这可能会误导用户。


如果是手动交易面板, 不清楚为什么要关闭图形用户界面。不过,如果它不是一个交易面板,而是一个信息面板,那么是的,最好考虑禁用它。

我喜欢 RectangleLabel::OnEvent 和 RectangleLabel::Add 函数的组织方式,它们漂亮、清晰、易读。

我在我的面板中使用了同样的原则,但我的代码有点乏味。总的来说,并不美观。因此,我决定将文章中的代码用于一个新的面板。

最后,我完成了面板,但我花在上面的时间比从头开始写还要多。

总的来说,结论如下:这篇文章很有趣,也很有用,但文章中的代码部分没有经过深思熟虑。

有很多经过深思熟虑的方法,都有漂亮的箭头 "如何实现用户界面,使其不痛苦":-)MVC 和类似方法。因此,前端(win,gtk,qt,web)有时只需动动手就能改变。

在 MQL 中,它们都没有实现。一切都被钉死了,比 TurboVision 还糟糕--尽管有来自 Adam 的类,但那里有模型。

个人多年来一直在写 "简单易行 "和 "界面简洁",但这与本文中的 内容如出一辙。大量的代码并没有让任何事情变得更简单。唯一的效果就是给作者的账户加分。