四目观天下

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

期货量化交易软件:GUI 改进您的交易图表

[复制链接]
发表于 2024-4-17 08:07:31 | 显示全部楼层 |阅读模式
您好,欢迎回到我们系列的第 3 部分《利用 MQL5 的交互式 GUI 改进您的交易图表》。赫兹量化期货交易软件进入新领域之前,我们先快速回顾一下我们在第 I 部分和第 II 部分中涵盖的内容:1. 在第 I 部分中,我们从理解图表事件概念开始,然后在同一图表上创建了两个简单的可移动仪表板。2. 至于第 II 部分,我们更进一步。我们利用 .mqh 文件中的类令我们的代码更加高效和通用,准备好与满级的 EA/指标集成。现在,赫兹量化期货交易软件已经准备好了第 III 部分!在该部分中,我们把重点放在通过将 GUI 集成到仪表板中来增强仪表板。因为若无 GUI,仪表板就无法达到其预期目的。以下的快速概览,就是我们将在本文中解决的问题:
1 b, ?$ z( X) h9 L) {9 m我们在创造什么?7 J7 S/ h7 q/ l8 Y3 P+ q
创建简易的静态交易仪表板
; r) z. a; c. ?. |2 ]2 c讨论令我们其中包含所有元素的静态仪表板能够移动的方式。$ O9 s! G# V$ N
使用讨论的方式来移动我们的静态仪表板
5 s. ~6 t: g' ]结束语
' P. ~$ h5 n' H5 [我们在创造什么?我们瞄准的目标是创建一个带有 GUI 的可移动仪表板,为此,我们需要决定我们将要创建的内容。我选择了一个简单的 EA,特别是简易交易 EA,作为我们的基础。首先,我们需要构建这个静态仪表板,即简易交易 EA。有效地做到这一点至关重要,因为赫兹量化期货交易软件正在创建一个成熟的 EA。至于效率,我指的是我们不能仅开一个文件,并在那里编写所有代码。取而代之,我们需要一个经过深思熟虑的计划,允许我们跨若干规划良好的 .mqh 文件,并在每个文件里编写最少的代码。最重要的是,在为我们的可移动仪表板创建所需的静态 GUI 时,我们必须避免重复相同的代码。以下是我们将为此目的创建的基础静态仪表板:8 t8 e. r2 v7 B6 L* C/ [9 u: |2 h
  k: K" m( K1 ~' S
期货量化交易软件:GUI 改进您的交易图表-1.jpg 添加图片注释,不超过 140 字(可选)图例 1. 简易静态仪表盘
2 k. [# {5 ~6 t, F0 G$ s其构成:
7 t+ D* A" ]+ \* s9 R元素 说明: G! x% X/ F: L) Q
Label 1 标题文本(Simple Trading EA V1.0)
. y% P# E6 c& b' G0 @7 V3 a: |标签就是这样。 手数
/ V, t" v. l; K% d+ V% KEdit 1 您在上图中看到的白色编辑框,里面写着 0.01。6 K) {0 t0 a2 j8 z; A' A6 K+ a7 W
Button 1 绿色的 “Buy(买入)”按钮。7 Q9 v& Z9 i2 s% B( b% m* Q3 v: G
Button 2 红色的 “Sell(卖出)” 按钮。
4 E% z' i9 B" d  r& ]- d% i2 ORectangle Label 1 标题栏,写有 “Simple Trading EA V1.0” 字样的深蓝色栏。
* s0 x& d; h/ I: y2 N& @Rectangle Label 2 主仪表板区域,浅蓝色仪表板。
/ c! y% Q2 E' S' W4 r7 X因此,赫兹量化期货交易软件的仪表板由这七个组件构成。如果您问我,我会说这是我们创建的一个非常漂亮的仪表板,仅结合了七个元素。现在,我们开始编写仪表板代码。7 Q" O' U4 s7 _  W4 w+ \8 G
创建简易的静态交易仪表板我们要编写什么样的类?我们想想......我们需要 2 个标签、2 个按钮、1 个编辑框、和 2 个矩形标签。故此,我们创建 4 个 .mqh 文件,每种元素一个文件。以下是我们项目的文件夹结构:1 U5 D6 v. U; e% V, w9 x4 a& k
Simple Trading EA/
% `9 s' h! r3 ^8 J" Y5 ySimpleTradingEA.mq5
$ W4 Z2 `, v6 ^* L: v( K$ IButton.mqh( e8 s0 m+ x$ m9 \/ |
Label.mqh1 j* u9 j+ @9 ]( v8 q: T
Edit.mqh
( O( \  L8 ^" _% F" z  sRectangleLabel.mqh
& [5 j; [8 s5 W- b这些就是我们将在其中编写代码的文件。现在,我们创建第一个文件 “SimpleTradingEA.mq5”,其为我们的主要 EA 文件。我已经删除了 OnTick() 函数,因为在这个项目中我们不需要它。以下是文件此刻的样子://+------------------------------------------------------------------+//| Expert initialization function                                   |//+------------------------------------------------------------------+int OnInit()   {    return(INIT_SUCCEEDED);   }//+------------------------------------------------------------------+//| Expert deinitialization function                                 |//+------------------------------------------------------------------+void OnDeinit(const int reason)   {   }//+------------------------------------------------------------------+现在我们制定一个计划。我们将按以下顺序构建静态仪表板:" P2 |# T& a4 r
标题栏- k, \) M5 P! L7 |3 Q- P
主仪表板实体# A, B0 y9 G* G0 A6 e# S* P; R5 V
标题文本4 [$ |4 F, B6 J6 |& v0 Q% q3 L
“Lot Size:” 文本
% l+ @6 I+ Z" P: X2 l编辑框
' b: A( K8 R( k1 j( c: U0 t买入和卖出按钮4 Y* R  u; h* c+ e9 w1 \3 l
添加任何必要的收尾润色
$ I8 j5 \9 w' V( J; q& ^- ?5 z这看似是一个合理的后续顺序。我们开始吧,5 e* N4 V9 A! k' n/ @0 g' f
标题栏为了创建标题栏,我们需要使用矩形标签对象。故此,我们创建一个类来处理与矩形标签对象相关的所有事宜。赫兹量化期货交易软件将创建一个 .mqh 文件;从简起见,我们将其命名为 “RectangleLabel.mqh”,且再为简约而将该类命名为 “RectangleLabel”。下面是我们创建的空类://+------------------------------------------------------------------+ //| Class Definition: RectangleLabel                                 | //+------------------------------------------------------------------+ class RectangleLabel    { public:                      RectangleLabel(void);                     ~RectangleLabel(void);    };  //+------------------------------------------------------------------+ //| Constructor: RectangleLabel                                      | //+------------------------------------------------------------------+ RectangleLabel::RectangleLabel(void)    {    }  //+------------------------------------------------------------------+ //| Destructor: RectangleLabel                                       | //+------------------------------------------------------------------+ RectangleLabel::~RectangleLabel(void)    {    } //+------------------------------------------------------------------+我们将需要一些函数,我们看看
0 z! C5 Q1 g7 [; y' @Create             -> 创建矩形标签1 E' U$ ]4 \$ n+ x$ l, i
Destroy            -> 注销仪表板* H, R0 |% k- ?, z1 ^# N3 h
SetBorderType  -> 设置边框类型3 V0 Z" ?0 n2 m  G' i' v
SetBGColor       -> 设置背景颜色9 s5 e- Y2 N# L/ Q& W5 Z* i. x" d
我们在成员函数清单中声明上述函数。现在我们的类看起来像这样://+------------------------------------------------------------------+ //| Class Definition: RectangleLabel                                 | //+------------------------------------------------------------------+ class RectangleLabel    { public:                      RectangleLabel(void); // Constructor                     ~RectangleLabel(void); // Destructor void             Create(string name, int xDis, int yDis, int xSize, int ySize); //Creates a Rectangle Label with the given parameters void             Destroy(); // Destroys the Rectangle Label void             SetBorderType(ENUM_BORDER_TYPE borderType); // Sets the border type of the Rectangle Label void             SetBGColor(color col); // Sets the background color of the Rectangle Label    }; //+------------------------------------------------------------------+我们编写一个基本的创建函数://+------------------------------------------------------------------+ //| RectangleLabel Class - Create Method                             | //+------------------------------------------------------------------+ void RectangleLabel::Create(string name, int xDis, int yDis, int xSize, int ySize)    {     ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, 0, 0, 0); // Create the Rectangle Label object ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xDis); // Set the X-axis distance ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yDis); // Set the Y-axis distance ObjectSetInteger(0, name, OBJPROP_XSIZE, xSize); // Set the X size ObjectSetInteger(0, name, OBJPROP_YSIZE, ySize); // Set the Y size    } //+------------------------------------------------------------------+我们在同一行中创建 Destroy、SetBorderType 和 SetBGColor,因为它们只需要一行。此处我们更新的类://+------------------------------------------------------------------+ //| Class Definition for the Rectangle Label                         | //+------------------------------------------------------------------+ class RectangleLabel    { private:     string           _name; // Name of the rectangle label public:                      RectangleLabel(void); // Constructor                     ~RectangleLabel(void); // Destructor void             Create(string name, int xDis, int yDis, int xSize, int ySize); // Method to create a rectangle label with given dimensions void             Destroy() {ObjectDelete(0, _name);} // Method to delete the object using the object's name void             SetBorderType(ENUM_BORDER_TYPE borderType) {ObjectSetInteger(0, _name, OBJPROP_BORDER_TYPE, borderType);} // Method to set the border type for the rectangle label void             SetBGColor(color col) {ObjectSetInteger(0, _name, OBJPROP_BGCOLOR, col);} // Method to set the background color for the rectangle label    }; //+------------------------------------------------------------------+还有,我们添加了一个名为 “_name” 的私密变量,因为 ObjectDelete 需要一个名称,故我们在 Create 函数中设置了 “_name”,现在它如下所示://+------------------------------------------------------------------+ //| Rectangle Label Creation Method                                  | //+------------------------------------------------------------------+ void RectangleLabel::Create(string name, int xDis, int yDis, int xSize, int ySize)    {     ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, 0, 0, 0); // Create rectangle label object ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xDis); // Set X distance ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yDis); // Set Y distance ObjectSetInteger(0, name, OBJPROP_XSIZE, xSize); // Set X size ObjectSetInteger(0, name, OBJPROP_YSIZE, ySize); // Set Y size     _name = name; // Assign the name to the member variable    } //+------------------------------------------------------------------+我们简单地在最后一行加上 “_name = name;”,即可在 _name 变量里设置创建矩形标签时的名称。如果您正在犹豫,代码在何处可令它移动,我们此刻忽略了这个方面,是为了保持简单,直到我们创建一个简易静态仪表板。现在,我们在主文件(即 SimpleTradingEA.mq5)中使用这个类来查看结果:我们首先使用 “#include” 包含 RectangleLabel.mqh 文件,并创建了一个名为 TitleBar 的类实例,因为我们会用这个 RectangleLabel 类实例创建仪表板的标题栏,我们将还会将其用于主仪表板实体。然后,赫兹量化期货交易软件用该实例在图表上创建一个矩形标签,坐标为(100,100),尺寸为 200x20。然后我们将其边框设置为平坦 (BORDER_FLAT),因为在我看来这更好;您可以根据自己的喜好进行更改。然后我们调用 ChartRedraw(0) 函数重绘图表;这样,仪表板会立即在图表上创建。否则,它可能会等待下一次价格更新,即跳价来临时。这一切都在 OnInit() 中,即,仅一次性执行就可在图表上创建和显示仪表板。最后,我们在 OnDeinit() 里,即从图表中删除 EA 时,调用已创建的 Destroy() 函数注销仪表板。结果:
  J# O2 K- J, P; Q+ [& d 期货量化交易软件:GUI 改进您的交易图表-2.jpg 添加图片注释,不超过 140 字(可选)
http://www.simu001.cn/x288450x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Archiver| ( 桂ICP备12001440号-3 )|网站地图

GMT+8, 2026-6-29 04:37 , Processed in 0.826338 second(s), 34 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表