//------------------------------------------------//Open the window "Settings example 1".w_6_Settings_example_1();//------------------------------------------------
*重要提示:元素和窗口的功能应从 UIDATA 文件移至 API 文件的底部,以便 intellisense 正常工作。
case Settings_example_1___Spin_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the value is set?//------------------------------------------------------------------------------------------------------//Min value: NOT SET | Max value: NOT SET | V_step: 1.7 | Default value: 468.99 | Digits: 3//------------------------------------------------------------------------------------------------------w6_i_p3_H_SLIDER_Roll_the_value((int)value);
Alert("S_EDIT Spin_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Slider.//------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------w6_d_p5_S_EDIT_Spin_the_value((double)value);
//Alert("H_SLIDER Roll_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Spin edit.//------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Spin_the_value://------------------------------------------------------------------------------------------------------//What to do when the value is set?//------------------------------------------------------------------------------------------------------//Min value: NOT SET | Max value: NOT SET | V_step: 1.7 | Default value: 468.99 | Digits: 3//------------------------------------------------------------------------------------------------------w6_i_p3_H_SLIDER_Roll_the_value((int)value);
Alert("S_EDIT Spin_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Slider.//------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value://------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------w6_d_p5_S_EDIT_Spin_the_value((double)value);
Alert("H_SLIDER Roll_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Spin edit.//------------------------------------------------------------------------------------------------------break;
//===========================================================================================================================//WINDOW :---: Settings example 1 | #: 6 | PFX: w_6// | |//GET/SET :---: int w_6_Settings_example_1(int value = get_i, int Property = 0)//----------------| |------------------------------------------------------------------------------------------------------//ELEMENT :---: TYPE: CHECKBOX | NAME: Set an option | PAR_TYPE: int | INIT STATE: OFF | PFX: w6// | |------------------------------------------------------------------------------------------------------//LOCATION :---: Window's Main Frame //----------------| |------------------------------------------------------------------------------------------------------//G/S PROPERTIES :---: PFX: p7_ | PROPS: NONE// | |------------------------------------------------------------------------------------------------------//G/S ACTIONS :---: p7_ON | p7_OFF | p7_LOCK_ON | p7_LOCK_OFF | p7_GET_STATE |//----------------| |------------------------------------------------------------------------------------------------------// | |//GET/SET CALL :---: int w6_i_p7_CHECKBOX_Set_an_option(int value = none, int Property = 0)//---------------------------------------------------------------------------------------------------------------------------case Settings_example_1___Set_an_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//1. Lock the "Set another option" checkbox in the state ON.
casechecked: w6_i_p7_CHECKBOX_Set_another_option(p7_LOCK_ON);break;
//2. Unlock "Set another option" checkbox in the state ON.
caseunchecked: w6_i_p7_CHECKBOX_Set_another_option(p7_ON);break;
}
//------------------------------------------------------------------------------------------------------//Your comment: //------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Set_an_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked? //------------------------------------------------------------------------------------------------------switch((int)action)
{
//Lock both checkboxes----
casechecked: w6_i_p7_CHECKBOX_Set_another_option(p7_LOCK_ON);
w6_i_p7_CHECKBOX_And_another_option(p7_LOCK_ON);
break;
//Unlock both checkboxes---
caseunchecked: w6_i_p7_CHECKBOX_Set_another_option(p7_ON);
w6_i_p7_CHECKBOX_And_another_option(p7_ON);
break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Set_another_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//Locking the element---
casechecked: w6_s_p6_D_LIST_D_LIST_1(p6_LOCK); break;
//Unlocking the element---
caseunchecked: w6_s_p6_D_LIST_D_LIST_1(p6_UNLOCK); break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___And_another_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//Locking the element---casechecked: w6_s_p6_C_LIST_C_LIST_1(p6_LOCK); break;
//Unlocking the element---caseunchecked: w6_s_p6_C_LIST_C_LIST_1(p6_UNLOCK); break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___C_LIST_1:
//------------------------------------------------------------------------------------------------------//What to do when an option selected?//------------------------------------------------------------------------------------------------------if(selected_option == "Times_New_Roman"){}
if(selected_option == "Arial"){}
if(selected_option == "Tahoma"){}
if(selected_option == "Dali"){}
if(selected_option == "BatangChe"){}
if(selected_option == "Consolas"){}
if(selected_option == "Courier"){}
if(selected_option == "Courier_New"){}
if(selected_option == "DFKai_SB"){}
if(selected_option == "DotumChe"){}
if(selected_option == "FangSong"){}
if(selected_option == "Fixedsys"){}
if(selected_option == "GulimChe"){}
if(selected_option == "GungsuhChe"){}
if(selected_option == "KaiTi"){}
//Send user's choice to textbox "Comment 2" in another window.w8_s_p4_CELL_Leverage__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------
//Sending the slider's value into the table cell.
w8_s_p4_CELL_Account_balance__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_1:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_number__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_2:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_server__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_3:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_currency__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___C_LIST_1:
//------------------------------------------------------------------------------------------------------//What to do when an option selected?//------------------------------------------------------------------------------------------------------if(selected_option == "Times_New_Roman"){}
if(selected_option == "Arial"){}
if(selected_option == "Tahoma"){}
if(selected_option == "Dali"){}
if(selected_option == "BatangChe"){}
if(selected_option == "Consolas"){}
if(selected_option == "Courier"){}
if(selected_option == "Courier_New"){}
if(selected_option == "DFKai_SB"){}
if(selected_option == "DotumChe"){}
if(selected_option == "FangSong"){}
if(selected_option == "Fixedsys"){}
if(selected_option == "GulimChe"){}
if(selected_option == "GungsuhChe"){}
if(selected_option == "KaiTi"){}
//Sending C_LIST value into the cell.
w8_s_p4_CELL_Account_profit__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
int _OnInit()
{
//------------------------------------------------//Open the window "Settings example 1".//------------------------------------------------w_6_Settings_example_1();//------------------------------------------------
В предыдущей статье разрабатываемая библиотека была пополнена сразу четырьмя довольно часто используемыми в графических интерфейсах элементами управления: «чекбокс», «поле ввода», «поле ввода с чекбоксом» и «комбобокс с чекбоксом». Вторая глава шестой части серии будет посвящена таким элементам управления, как слайдер и двухсторонний слайдер.
需要考虑的一般主题列表:
1. intellisense 列表中的方向和选择右侧窗口的功能。
2.以编程方式打开和关闭窗口。
3. 在 intellisense 列表中确定方向,并在正确的窗口中选择正确的元素。
4. 在单个元素属性列表中导航。
5.解析元素名称和窗口封装函数
6.将 选定元素的参数值返回 到其类型的变量中。考虑几种不同元素的三种类型。
7.设置不同类型元素的参数值。让我们看看这些值将如何出现在这些元素的界面窗口中。
8.返回一个元素的参数值,修改并将该值转发给另一个元素。考虑不同类型的元素和数值,测试不同类型元素在不同窗口中的转发。
9.返回前一个值 (_V_LAST)。何时以及在何种情况下需要最后一个值(不要与当前值混淆)。
10.测试不同类型元素的 ON/OFF/LOCK_ON/LOCK_OFF/LOCK/UNLOCK 状态的设置。
11.让我们尝试将不同类型元素(例如,输入框与按钮和滑块)的值变化联系起来并使其同步。假设一个元素(手动或软件)的值发生变化时,第二个元素的值也会相应变化。
12.让我们尝试通过封装函数以编程方式重置滑块和带按钮输入框的范围边界。我还没有时间进行测试,但有迹象表明这将有效。不过,让我们拭目以待。
13.让我们尝试通过封装函数返回元素状态。它包含在功能中,但我还没来得及测试。所以,让我们拭目以待......结果未知。
14.我们来获取和设置文本和元素基色的颜色。我们可以尝试将这些颜色与一些简单的事件或值边界联系起来。
15.下面我将详细介绍如何浏览和阅读新的 API 文件打印输出。
//------------------------------------------
我们已经介绍过的主题用黄色标出。
今天我们将回顾
11.同步(链接)更改不同类型元素的值:例如,带有按钮和滑块的输入框。这样,当改变一个元素(手动或软件)的值时,第二个元素的值也会相应改变。
12.让我们尝试通过封装函数以编程方式重置滑块和带按钮输入框的范围边界。我还没有时间进行测试,但有迹象表明它可以成功。不过,让我们拭目以待。
13.让我们尝试通过封装函数返回元素状态。它包含在功能中,但我还没来得及测试。所以,让我们拭目以待......结果未知。
11.不同类型元素的参数绑定
细心的人会发现,在多窗口图形用户界面中,不同的元素往往通过参数值、属性和状态联系在一起。例如
//-------------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------
你会觉得这其中一定存在着隐形的元素连接。确实存在。但只有外部观察者才会觉得它是不可见的。对于开发人员来说,它是显而易见的,今天我们就来详细探讨一下。
1.元素连接有两个方面:
图形引擎的存在简化了连接的技术实现。
让我来解释一下:
在传统的 "智能交易系统 "中,每个参数都是 由 用户 发明、 命名、 存储 和 处理的 。这是一项无法绕过的例行工作。然而,在使用图形引擎的情况下,构造函数中创建的项目会自动接收参数以及存储位置和处理/返回函数。此外,用户还能获得它们的属性,如类型、范围、过去值 等。这大大简化了劳动。从理论上讲,可以将 GUI 元素的现成参数用作其他用户参数,将它们直接与交易逻辑相连。例如,手数、追踪止损、止 盈 和其他参数,不是来自它们自己的变量,而是来自负责其值的设置字段。
一些一般性结论
1. 程序 中出现图形控制 = 出现现成的程序参数 + 其属性+返回/设置值的功能。
2. 界面程序窗口中的控件越多, 交易逻辑 和交易信息输入/输出 中涉及的参数 就越多。
3. 设置越多,窗口越多--控制能力越强,市场数据输出带宽越宽(不影响自动化)。
4. 4. 市场数据输出的控制力越强、带宽越宽,交易者的意识就 越强。
5. 意识 乘以自动化和控制 = 交易机会的扩大。
我要补充的是,自动化往往与人工控制相对立。他们说,图形界面意味着手动交易。但事实并非如此。软件界面并不排斥自动化,而是扩大了自动化,增加了一个 "梯度"--它提供了三种选择:手动控制、 半自动交易 和 自主模式。
交易者只需选择一个选项即可。
天哪,为此创建一个窗口简直易如反掌。
//---------------------------------------------------------------------------------------------------
2.下面我们来看看控件参数绑定的技术实现。
我们来看几个实际例子:
1.让我们打开一个熟悉的设置窗口:
2. 打开 API 文件,在 On_Gui_Event() 函数中找到已打开窗口的元素:
提醒: 所有控件事件都会进入 On_Gui_Event() 函数;
为此,我们将在该函数内部写入部分参数链接,在函数体外写入部分参数链接。
1.让我们在带按钮 (S_EDIT) 的 "旋转数值 "字段和带滑块 (H_SLIDER) 的 "滚动数值 "字段之间建立联系:
结果:我们用按钮更改字段中的值,而滑块会自己移动。
(重要提示:滑块只能在其范围内移动(本例中为 0 至 100)。如果超出范围,数值不会改变,但日志中会显示错误)。
//----------------------------------------------------------------------------------------------------------------
3.让我们进行角色转换。滑块将控制输入框中的数值:
结果:移动滑块手柄时,带按钮的字段会同步改变值。
//----------------------------------------------------------------------------------------------------------------
4.我们来编写滑块和带按钮字段之间的相互控制:
结果:滑块和输入字段同时相互控制。
//---------------------------------------------------------------------------------------------------
明天我将发布该主题的第二部分,并添加其他元素。
这东西太棒了!如果有时间,我打算更详细地了解一下这个主题。我以为我的工作已经超越了 mt4 图形用户界面的极限,但你的工作却更上一层楼。
这是一些很好的材料!我打算有空时再详细探讨这个话题。我以为我的工作已经超越了 mt4 图形用户界面的极限,但你的工作却更上一层楼。
非常感谢你的赞誉!
11.不同类型元素的绑定参数
继续本主题。
第二部分
//--------------------------------------------------------------------------------------------------------------------------------
让我们看看能否将所示绑定方法应用于其他元素。例如,复选框。
1.让我们锁定顶部的复选框,并解锁其下方的复选框:
要做到这一点
1.在 API 文件中找到"设置选项"复选框。
2.2. 为"设置另一个选项"复选框编写一个函数调用,使其锁定/解锁。
结果:复选框按预期锁定和解锁:
//--------------------------------------------------------------------------------------------------------------------------------
2.现在,让复选框锁定并解锁其下方的两个复选框:
结果:复选框锁定并解锁了下面的两个复选框:
这就是动态效果:
//--------------------------------------------------------------------------------------------------------------------------------
3.现在我们来解决下图所示的问题: 复选框应该锁定和解锁其对面的下拉列表。
要做到这一点:
结果:复选框锁定下拉列表,并与主复选框一起锁定自己:
//--------------------------------------------------------------------------------------------------------------------------------
4.我们继续下一个任务:下拉列表应将用户选择的值转换到另一个窗口的字段中。
为此
*结果:两个下拉列表都成功地将其值发送到对面窗口的输入框中:
//--------------------------------------------------------------------------------------------------------------------------------
5.下面的任务如图所示: 您需要切换的单选按钮将其名称发送到对面的输入字段。
为此
*重要提示:由于 KIB 代码中使用了 SWITCH 操作符,因此单选按钮可以切换。因此,所有单选按钮都有一个共同参数,并且在 API 文件中的情况相同。
结果:切换按钮会导致输入框中的文本发生变化。*该选项 存在一个小的技术问题。将在下一版本中修复。
第二部分已经完成。
在第三部分中,我们将使用表格。
参数绑定主题的最后一部分。
让我们把元素参数值传递给表格单元格。
模式:
解决方案:
结果:值被安全地放入选定的表格单元格中。
从上述示例中可以看出,我们已经开发出一种简单方便的解决方案。希望对大家有用。
链接元素参数的话题到此结束。
下列议题尚待解决:
12.以编程方式获取/设置滑块 和按钮字段的值边界(_V_MIN、_V_MAX、_V_STEP、_DIGITS)。
13.查询元素的状态(_GET_STATE)。
14.将文本和边框颜色与间隔值边界联系起来
15.API 文件中的方向
添加主题
16.实现消息和警告窗口外观的程序逻辑
12.以编程方式获取/设置滑块 和 带按钮字段的值边界(_V_MIN、_V_MAX、_V_STEP、_DIGITS) 1.
打开一个窗口,其中包含上述参数的元素:
2.写入_V_MIN、_V_MAX、_V_STEP、_DIGITS 的值并输出到日志中:
结果:滑块参数属性的值被记录下来。
//---------------------------------------------------------------------------------------------------------------------------------------
3.让我们重复带按钮字段的操作。与滑块不同,该字段有其他数字边界,其值类型为双。
结果:带按钮字段的参数属性值将显示在日志中。
//---------------------------------------------------------------------------------------------------------------------------------------
4.设置滑块范围的其他边界(首次测试,结果未知)。
结果:*发现了负数范围的问题(在下一版本中修复)。
让我们用正数范围边界进行检查:
结果:成功更改了范围界限。
要点: 使用滑块的功能可以更改滑块的范围。
**重要:不能将参数值类型从 int 变为 double,反之亦然。
//-------------------------------------------------------------------------------------------------
让我们对输入栏进行类似的实验:
结果:如愿以偿。带按钮的字段接受指定的范围和步长。如果超出范围,则会向日志报告错误。
//--------------------------------------------------------------------------------------------------
5.最后,为带按钮的字段设置 value_DIGITS(由于滑块的参数类型为 int,因此无法使用):
结果:
结果:
本主题到此结束。