文章 "基于 .Net 框架和 C# 开发图形界面(第二部分):另外的图形元素"

 

新文章 基于 .Net 框架和 C# 开发图形界面(第二部分):另外的图形元素已发布:

本文是之前发表的“基于.NET框架和C为EA交易和指标开发图形界面”的后续部分,它引入了新的图形元素来创建图形界面。

从第二个版本开始,控制器支持消息框,这是一个标准的用户信息元素。它还向用户提供多个选项,并以所选选项的形式接收响应。

要启动消息窗口的演示,请在启动EA时选择 Windows 窗体元素类型参数中的“按钮和消息框(Buttons and MessageBox)”选项。启动EA后,会出现一个表单,提示您选择以下选项之一:

图 3. 调用消息框的示例窗体 

这个窗体以及随后的所有窗体都是示范形式,因此不具备交易逻辑。但是,按下任何按钮后,EA会发送一条警告消息,请求确认所选操作。例如,单击“卖出(SELL)”时将显示以下消息窗口:


图 4. 交易EA要求确认开立新的空头头寸

作者:Vasiliy Sokolov

 
一切都很好,文章、图形用户界面和 C# 的无限可能性,但为什么没有表格呢,瓦西里?使用表格有什么困难吗?
 
Реter Konow:
一切都很好,文章、图形用户界面和 C# 的无限可能性,但为什么没有表格呢,瓦西里?有什么困难吗?

材料量太大了,而 C# 中的表格是一个非常复杂的元素。这就像三级跳。你需要通过实现基本元素来加速,然后再尝试复杂的表格。

 
Vasiliy Sokolov:

材料量太大,而 C# 中的表格是一个非常复杂的元素。这就像三级跳远。你需要通过实现基本要素来加速,然后再向复杂的表格发起冲击。

好的
 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Не удается найти указанный файл. (Exception from HRESULT: 0x80070002)
   at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence)
   at System.Reflection.Assembly.LoadFile(String path)
   at MtGuiController.GuiController.GetGuiController(String assembly_path, String form_name)
   at MtGuiController.GuiController.ShowForm(String assembly_path, String form_name)
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Wrapper.Wrapper.Call(MethodInfo method, Int64 owner, Int64 parameters, Int64 result)
.Net runtime error

从文章中启动智能交易系统时出错。

 
fxsaber:

运行文章中的智能交易系统时出错。

程序文件的路径是绝对路径,因此需要将其更改为实际路径。无法像在 MT 中那样制作通用目录。

 
Vasiliy Sokolov:

程序文件的路径是绝对路径,因此需要将其改为实际路径。不可能像 MT 那样制作通用目录。

string assembly = "c:\\Users\\Bazil\\source\\repos\\DemoForm\\DemoForm\\bin\\Debug\\DemoForm.exe";

我没有在任何地方找到这个文件。也无法从提供的 C# 源码中编译它。

 
fxsaber:

我没有在任何地方找到这个文件。我也无法从提供的 C# 源码中编译它。

奇怪,我可能忘了把它附加到存档中。我过几个小时再把它贴上去。

 
附在档案中
附加的文件:
DemoForm.zip  8 kb
 
Vasiliy Sokolov:
附在档案中

谢谢,成功了。

// 我把 DemoForm.exe 放到了库中
string assembly = TerminalInfoString(TERMINAL_PATH) + "\\MQL5\\Libraries\\DemoForm.exe";


我发现了使用 C# 窗口时的一个非常严重的错误。如果连续移动 C# 窗口,终端会在几秒钟后从屏幕上消失,而且 terminal64.exe 的 CPU 核心负载会超过 100%。我有 8 个内核,因此任务管理器中 CPU 的全内核负载为 12%-13%。当 C# 窗口移动时,则为 19%。


我有一块 CPU 内置显卡,没有显卡。我认为问题出在显示器上。这就是我测试顾问的原因。

int handle = INVALID_HANDLE;

void OnInit()
{
  if (EventSetTimer(1))
    handle = FileOpen(__FILE__, FILE_WRITE | FILE_TXT);
}

void OnDeinit( const int )
{
  if (handle != INVALID_HANDLE)
    FileClose(handle);
}

void OnTimer()
{
  if (handle != INVALID_HANDLE)
    FileWriteString(handle, (string)TimeCurrent() + "\n");
}

它每秒从市场观察中写入时间。这是它移动 C# 窗口时的记录。

2019.06.11 16:22:09
2019.06.11 16:22:11
2019.06.11 16:22:11
2019.06.11 16:22:19
2019.06.11 16:22:23
2019.06.11 16:22:24
2019.06.11 16:22:26
2019.06.11 16:22:28
2019.06.11 16:22:31
2019.06.11 16:22:33
2019.06.11 16:22:34
2019.06.11 16:22:36
2019.06.11 16:22:37
2019.06.11 16:22:45
2019.06.11 16:22:45
2019.06.11 16:22:48
2019.06.11 16:22:51
2019.06.11 16:23:07
2019.06.11 16:23:08
2019.06.11 16:23:10

您可以清楚地看到,OnTimer 在几秒钟内都没有执行。也就是说,移动 C# 窗口会导致终端中的智能交易系统停止执行。


这个问题不仅涉及本文中的 C# 窗口。

 
Vasiliy Sokolov:

通过终端菜单手动移除GuiControllerElementsDemo 会导致几秒钟的冻结。