int _OnInit()
{
//------------------------------------------------//Open the window "Settings example 1".//------------------------------------------------w_6_Settings_example_1();//------------------------------------------------
//Get state of button "Start":
//------------------------------------------------intButton_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);//------------------------------------------------
//Print out:
//------------------------------------------------
Print("Button state: ",Button_state);
//------------------------------------------------
结果:得到与状态 v_NEUTRAL_STATE对应的值 15 。
2.2. 记录按钮按下和松开时的状态:
为此
在 API 文件中找到按钮。
为按下 和释放 两种情况编写_GET_STATE 请求。
case Settings_example_1___Start:
//------------------------------------------------------------------------------------------------------//What to do when the button is pressed or released?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//------------------------------------------------------------------------casepressed:
{
//Get button's state when it pressed:
intButton_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
//Print out the result:
Print("Button state: ",Button_state);
}
break;
//------------------------------------------------------------------------casereleased:
{
//Get button's state when it released:
intButton_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
//Print out the result:
Print("Button state: ",Button_state);
}
break;
//------------------------------------------------------------------------
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
//------------------------------------------------//Open the window "Settings example 1".//------------------------------------------------w_6_Settings_example_1();
//------------------------------------------------//Get the state of the checkbox when it checked:intCheckbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
//Print out the result:Print("Checkbox state: ",Checkbox_state);
//------------------------------------------------
结果:得到值 15,对应中性状态v_NEUTRAL_STATE(复选框所在位置)。
2.2. 接下来,我们来查询复选框在按下和释放事件中的状态。
为此
在 API 文件中找到"设置选项"复选框。
针对选中 和未选中 两种 情况编写_GET_STATE 查询。
case Settings_example_1___Set_an_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked? //------------------------------------------------------------------------------------------------------casechecked:
{
//Get checkbox state when it checked:intCheckbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
//Print out the result:
Print("Checkbox state: ",Checkbox_state);
}
break;
//------------------------------------------------------------------------caseunchecked:
{
//Get checkbox state when it unchecked:intCheckbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
//Print out the result:
Print("Checkbox state: ",Checkbox_state);
}
break;
//------------------------------------------------------------------------------------------------------
//Your comment:
//------------------------------------------------------------------------------------------------------
break;
//Getting state of the first element:int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);//Getting state of the second element:int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);//Setting conditions for both elements when they're simultaneously ON:if(Button_state == v_ACTIVATED_STATE)
{
//Is the checkbox was already on:if(Checkbox_state == v_ACTIVATED_STATE)
{
Function_1();
}
//If the checkbox was the last pressed element and still highlighted:if(Checkbox_state == v_ACTIVATED_HIGHLIGHTED)
{
Function_2();
}
}
例 2:
//Getting state of the first element:int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);//Getting state of the second element:int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);//Setting conditions for one element being ON, while the other is OFF:if(Button_state == v_ACTIVATED_STATE)
{
//If the checkbox was already off:if(Checkbox_state == v_NEUTRAL_STATE)
{
Function_A();
}
//If the checkbox was just turned off and still highlighted:if(Checkbox_state == v_NEUTRAL_HIGHLIGHTED)
{
Function_B();
}
}
v_NEUTRAL_STATE - это нейтральное состояние в котором элемент находится неопределенное время.
v_NEUTRAL_HIGHLIGHTED - это нейтральное состояние в которое элемент перешел ТОЛЬКО ЧТО, после отжатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED.
同样适用于激活状态:
v_ACTIVATED_STATE - это активированное состояние в котором элемент находится неопределенное время.
v_ACTIVATED_HIGHLIGHTED - это активированное состояние в которое элемент перешел ТОЛЬКО ЧТО, после нажатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED.
int _OnInit()
{
//------------------------------------------------//Open the windows "Settings example 1" and "Settings example 2".//------------------------------------------------w_6_Settings_example_1();w_7_Settings_example_2();//------------------------------------------------
2.获取元素的状态:
//------------------------------------------------//Get the states of the elements S_EDIT, H_SLIDER, EDIT and D_LIST//------------------------------------------------//1. State index is type int, S_EDIT's function is double. Convert the types.intS_edit_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_GET_STATE);//2. Getting the slider's state. intH_slider_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);//3.State index is type int, EDIT's function is string. Convert the types. intEdit_state = (int)w7_s_p4_EDIT_Comment_3(get_s,p4_GET_STATE);//State index is type int, D_LIST's function is string. Convert the types.intD_list_state = (int)w7_s_p6_D_LIST_D_LIST_1(get_s,p6_GET_STATE);//------------------------------------------------//Print out the results:Print("S_edit_state = ",S_edit_state);
Print("H_slider_state = ",H_slider_state);
Print("Edit_state = ",Edit_state);
Print("D_list_state = ",D_list_state);
//------------------------------------------------
case Settings_example_1___Set_an_option:
switch((int)action)
{
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked? //------------------------------------------------------------------------------------------------------casechecked:
{
//-----------------------------------------------//Locking EDIT:w7_s_p4_EDIT_Comment_1(p4_LOCK);
//Locking H_SLIDER:w6_i_p3_H_SLIDER_Roll_the_value(p3_LOCK);
//Locking S_EDIT:w6_d_p5_S_EDIT_Spin_the_value(p5_LOCK);
//-----------------------------------------------//Getting state of EDIT:intEDIT_state = (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
//Getting state of H_SLIDER:intH_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);
//Getting state of S_EDIT:intS_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE);
//-----------------------------------------------//Printing results:Print("EDIT_state = ",EDIT_state);
Print("H_SLIDER_state = ",H_SLIDER_state);
Print("S_EDIT_state = ",S_EDIT_state);
//-----------------------------------------------
}
break;
//------------------------------------------------------------------------caseunchecked:
{
//-----------------------------------------------//Unlocking the element EDIT:w7_s_p4_EDIT_Comment_1(p4_UNLOCK);
//Unlocking H_SLIDER:w6_i_p3_H_SLIDER_Roll_the_value(p3_UNLOCK);
//Unlocking S_EDIT:w6_d_p5_S_EDIT_Spin_the_value(p5_UNLOCK);
//-----------------------------------------------//Getting state of EDIT:intEDIT_state = (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
//Getting state of H_SLIDER:intH_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);
//Getting state of S_EDIT:intS_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE);
//-----------------------------------------------//Printing results:Print("EDIT_state = ",EDIT_state);
Print("H_SLIDER_state = ",H_SLIDER_state);
Print("S_EDIT_state = ",S_EDIT_state);
//-----------------------------------------------
}
break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
查找 API 文件 中的 EDIT、S_EDIT、H_SLIDER 元素,并规定在输入值时获取状态,查看其函数是否返回HIGHLIGHTED ( 高亮)索引。
开始:
case Settings_example_2___Comment_1:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
{
//Getting state of EDIT:intEDIT_state = (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
//Printing the results:Print("EDIT_state = ",EDIT_state);
}
//------------------------------------------------------------------------------------------------------//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//------------------------------------------------------------------------------------------------------
{
//Getting state of H_SLIDER:intH_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);
//Printing results:Print("H_SLIDER_state = ",H_SLIDER_state);
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------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//------------------------------------------------------------------------------------------------------
{
//Getting state of S_EDIT:intS_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE);
//Printing results:Print("S_EDIT_state = ",S_EDIT_state);
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
13.查询元素状态 _GET_STATE.
通常情况下,需要通过编程来获取界面中 一个或另一个元素的 状态。为了解决这个问题,我们创建了标识符_GET_STATE。
//--------------------------------------------------------------------------------------------------------------------
*重要:在请求_GET_STATE 时,函数将返回元素当前状态的索引。
//--------------------------------------------------------------------------------------------------------------------
下图显示了元素状态列表。
1.状态标识符 :
(在下一版本 中,前缀 v_ 将被前缀 s_ 取代 )2.
输出到日志中的索引:
让我们测试一下元素状态的查询和检索:
打开窗口,获取 "开始 "按钮的初始状态:
结果:得到与状态 v_NEUTRAL_STATE 对应的值 15 。
2.2. 记录按钮按下和松开时的状态:
为此
结果:在按下/释放事件中,当前的状态索引将被打印到日志中。
提醒
//----------------------------------------------------------------------------------------------------------------
3.让我们用复选框重复查询。
1.我们来获取复选框在窗口打开时的状态:
结果:得到值 15,对应中性状态v_NEUTRAL_STATE(复选框所在位置)。
2.2. 接下来,我们来查询复选框在按下和释放事件中的状态。
为此
结果:我们将得到值 66 (v_NEUTRAL_HIGHLIGHTED) 和 67 (v_ACTIVATED_HIGHLIGHTED), 即高亮显示 的 中性状态和高亮显示 的 按下状态。
//-----------------------------------------------------------------------------------------------
本主题的第一部分到此结束。
在第二部分中,我们将返回D_LIST 下拉列表、H_SLIDER 滑块以及S_EDIT 和EDIT 输入字段的状态。
13.状态请求 _GET_STATE。
第二部分:获取D_LIST、H_SLIDER、EDIT、S_EDIT 元素的状态。
在上一部分中,我们了解了如何通过编程返回BUTTON 按钮和CHECKBOX 复选框的状态。我们使用了_GET_STATE 查询,并显示了函数返回的状态名称列表。一共有六个名称,每个名称都以前缀v_ 开头。(值的 缩写,将由s_ 代替--状态的 缩写)。
回顾一下状态索引:
在这种情况下,具体的索引号并不重要。当用户需要将一个特定的状态放入一个条件时,他会使用一个标识符。
例 1:
例 2:
//-----------------------------------------------------------------------------------------------------------------
*非常重要:
让我来解释一下v_NEUTRAL_STATE 和v_NEUTRAL_HIGHLIGHTED 状态之间, 以及v_ACTIVATED_STATE 和 v_ACTIVATED_HIGHLIGHTED 之间的 本质区别:
v_NEUTRAL_STATE - это нейтральное состояние в котором элемент находится неопределенное время. v_NEUTRAL_HIGHLIGHTED - это нейтральное состояние в которое элемент перешел ТОЛЬКО ЧТО, после отжатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED.
同样适用于激活状态:
v_ACTIVATED_STATE - это активированное состояние в котором элемент находится неопределенное время. v_ACTIVATED_HIGHLIGHTED - это активированное состояние в которое элемент перешел ТОЛЬКО ЧТО, после нажатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED.
这种差异带来了很大的不同。
目前,按钮和其他一些元素只返回v_NEUTRAL_STATE 和v_ ACTIVATED _STATE,而不 像复选框那样返回 HIGHLIGHTED 状态。这就意味着,用户无法知道项目是在刚才被点击/取消点击,还是在不确定的时间之前被点击/取消点击。不过,用户可以在 API 文件中捕捉到它们被按下的瞬间。是的,但这一功能在程序的其他部分还不可用。在下一个版本中,所有 互动元素都 将加入高亮 状态返回。这样,用户在 程序的任何地方都 能知道某个元素是刚 被按下/未被按下,还是已经处于该状态很长时间了。
//----------------------------------------------------------------------------------------------------------
下面进入实际操作部分:
1. 打开窗口:
2.获取元素的状态:
结果: D_LISTcnome 的所有元素的 状态索引 都是 15(中性状态 v_NEUTRAL_STATE)。 D_LIST 返回错误 (-1)。
原因: 中心函数未指定返回该元素的状态。 技术缺陷。将在下一版本中修正。
由于D_LIST 函数 还 没有返回状态索引,因此我们将重点放在成功接收到状态的三个项目上: EDIT 、S_ EDIT 和 H_SLIDER。
检查什么?
我们刚刚验证了EDIT、S_EDIT 和 H_SLIDER 元素函数返回的是窗口打开时中性状态的索引。 剩下的就是检查其他状态。由于这些元素理论上只能处于中性、锁定 和高亮 状态(不像按钮和复选框有更多状态),我们必须检查以下两种可能的状态:锁定 和高亮。另外还有一组"光标下"状态,为了避免混淆,我暂时还不想添加。在下一个版本中,我将创建一个特殊的前缀,用于打开每种元素可能状态的单独列表。这将使编程工作更加轻松。
我们将如何检查EDIT、S_EDIT 和 H_SLIDER 阻塞和高亮状态的返回:
1.在 API 文件中 找到"设置选项 " 复选框,并在其内 写入EDIT、S_EDIT 和 H_SLIDER 元素的锁定/解锁 状态。然后,通过 Print() 输出状态。
结果:
//--------------------------------------------------------------------------------------------------
2.第二项任务:
开始:
结果:
//-----------------------------------------------------------------------------------------------------
结果:
总的来说,结果令人满意。各元素都能如期返回中性和锁定状态的索引。但也存在一些不足:
结论:
我们有可能添加新的元素状态。例如,"中性指向" 和 "激活指向"( 在光标下为中性,在光标下为激活), 但 这有一个实用性和用户是否真正需要这些功能的问题。在没有收到此类要求之前,我不会添加新的状态。
本主题到此结束。
请继续关注以下主题。
我最近一个星期都在研究如何使用WinForm编写界面并嵌入到MT5图表里。今天终于实现了。
需要考虑的一般主题列表:
1. intellisense 列表中的方向和选择右侧窗口的功能。
2.以编程方式打开和关闭窗口 3.
3. 以编程方式打开可用窗口元素列表。
4. 打开单个元素属性列表
5.解析元素名称和窗口包装函数 6.
将 元素参数值返回 到其类型的变量中 7.
7.为不同类型的元素参数设置值
8.在不同元素参数之间返回、更改和转发值。考虑不同类型的元素和值,并测试不同窗口中不同类型元素之间的转发。
9.返回前一个值 (_V_LAST)。何时以及在何种情况下需要最后一个值(不要与当前值混淆)。
10.测试不同元素类型的ON、OFF、LOCK_ON、LOCK_OFF、LOCK、UNLOCK 状态的设置。
11. 测试元素值变化的绑定和同步性:如带有按钮和滑块的输入框。这样,当一个元素(手动或软件)的值发生变化时,第二个元素的值也会相应变化。
测试软件获取/设置滑块 和带按钮字段的范围边界(属性_V_MIN、_V_MAX、_V_STEP、_DIGITS)。
13.测试项目状态查询 (_GET_STATE) 的操作。
14.将文本和边框颜色与间隔值边界联系起来
15.API 文件中的方向
16.实现消息和警告窗口外观的简单程序逻辑。
//------------------------------------------
已考虑的主题以黄色标出。
目前还有一些问题有待考虑:
14.将文本和框架颜色与间隔值边界联系起来。
15.API 文件中的方向。
16.实现消息和警告窗口外观的简单程序逻辑。
//------------------------------------------
我建议将主题 14 与主题 16 联系起来。如果超出参数值的设定范围,首先会发出信号,改变部分元素(文本、底色、边框、条纹等)的颜色,然后打开对话窗口,最后打开警告窗口。同时,警告窗口会阻止对元素值的更改,直到用户手动关闭为止。
另外,我还想添加一个主题:
17. 当用户点击 "取消 "按钮时,取消已输入的设置。
很久以前,人们就开发了通过点击 "取消 "按钮 取消用户设置的技术,并在一定程度上进行了测试。目前,我们还不知道以前的功能能在多大程度上发挥作用。因此,有必要进行测试。
由于主题重叠,审查顺序如下:
14.实施交错参数边界保护:
15.让我们详细看看新的 API 文件打印输出。
//----------------------------------------------------------------------------------------------------
接下来,我将收集所有发现的错误或缺陷,并为下一个版本列出任务清单。
在下一个包含修复和添加内容的版本发布后,我将把重点放在表格上,因为我认为表格是引擎进一步开发的主要方向之一。
上周我一直在学习如何使用 WinForm 编写界面并将其构建到 MT5 图表中。今天,我终于找到了方法。
您将如何使界面与您的编程代码通信?
如何在界面和程序代码之间建立联系?
还有几个问题:
原则上,每个人都可以使用自己熟悉的工具。我对自己的界面很满意,这也是我开发它的原因。换句话说,我打算在自己的算法交易 中使用它。在论坛上发布解决方案会增加动力。如果我的界面对别人有用,那很好,如果没用,对我也没什么坏处。
在这个界面中,我看到了一个强大的工具,它与 MT5 的算法功能相结合,将使我能够扩大正确 交易的结果。是的,在这个漫长的过程中,我正在 "走向市场"。这需要数年时间,但无论如何,我都需要时间来开发智力。在市场上交易,光有钱没脑子是没有意义的,不是吗?
在我看来,决定使用 WinForms 或类似软件在本质上是不完整的。它导致从技术上脱离 MT5,建立一个独立的多窗口 Windows 应用程序。在第一阶段,它将像脐带一样通过数据通道连接到平台。用户将使用 DLL 轮询, 甚至可能 成功。如果需要,他还可以创建上下文菜单,并使用一些模板快速创建窗口.....。但最终......他将同时在两三个集成开发环境中工作,并使用不同的编程语言。那么,这样做有什么好处呢?更重要的是,它如何变得更简单?
此外,有了多窗口 Windows 应用程序,用户可以直接将其连接到另一个交易平台的 API。因此,对他来说,这比通过计时器工作更容易。此外,还应提及市场。他的产品在那里是不被允许的。总之,各取所需。
您将如何使界面与您的编程代码通信?