Discussão do artigo "Criando interfaces gráficas baseadas no .Net Framework e C# (Parte 2): elementos gráficos adicionais"

 

Novo artigo Criando interfaces gráficas baseadas no .Net Framework e C# (Parte 2): elementos gráficos adicionais foi publicado:

O artigo é uma continuação lógica da publicação anterior "Criando interfaces gráficas para EAs e indicadores baseados no .Net Framework e C#" e introduz os leitores a novos elementos gráficos para criar interfaces gráficas.

Começando com a segunda versão, o controlador suporta caixas de diálogo ou MessageBox. Este é um elemento de informações do usuário padrão. Com ele, também é possível oferecer ao usuário várias opções de ação e obter uma resposta na forma de opção escolhida por ele.

Para iniciar a exibição de caixas de diálogo, selecione a opção 'Buttons and MessageBox' no parâmetro "Windows Form Element Type" ao iniciar o EA. Depois de iniciar o EA, aparecerá um formulário solicitando escolher uma das seguintes opções:

Fig. 3. Formulário de demonstração chamando caixas de mensagem. 

Este formulário, assim como todos os subsequentes, é de demonstração, portanto, não possui lógica de negociação. No entanto, depois de pressionar qualquer um dos botões, o EA enviará uma mensagem de aviso solicitando confirmação das ações selecionadas. Por exemplo, ao pressionar o botão SELL, é exibida a seguinte caixa de mensagem:


Fig. 4. O EA solicita a confirmação da abertura de uma nova posição curta.

Autor: Vasiliy Sokolov

 
Tudo está bem, o artigo, a GUI e as infinitas possibilidades do C#, mas por que não há tabelas, Vasily? Há alguma dificuldade com elas?
 
Реter Konow:
Tudo está bem, o artigo, a GUI e as infinitas possibilidades do C#, mas por que não há tabelas, Vasily? Há alguma dificuldade com elas?

O volume de material é muito grande, e as tabelas em C# são um elemento muito complicado. É como um salto triplo. Você precisa acelerar implementando elementos básicos e depois tentar uma tabela complexa.

 
Vasiliy Sokolov:

A quantidade de material é muito grande, e as tabelas em C# são um elemento muito complexo. É como um salto triplo. Você precisa acelerar implementando os elementos básicos e, em seguida, dar uma tacada em uma tabela complexa.

Está bem.
 
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

Erro ao iniciar o Expert Advisor a partir do artigo.

 
fxsaber:

Erro ao executar o Expert Advisor do artigo.

Os caminhos para o arquivo do programa são absolutos, portanto, você precisa alterá-los para os caminhos reais. Não é possível criar catálogos universais como no MT.

 
Vasiliy Sokolov:

Os caminhos para o arquivo do programa são absolutos, portanto, você precisa alterá-los para caminhos reais. Não é possível criar catálogos universais como no MT.

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

Não encontrei esse arquivo em lugar algum. Ainda não é possível compilá-lo a partir dos códigos-fonte C# fornecidos.

 
fxsaber:

Não encontrei esse arquivo em lugar algum. Ainda não consigo compilá-lo com os códigos-fonte C# fornecidos.

Estranho, acho que me esqueci de anexá-lo ao arquivo. Vou publicá-lo em algumas horas.

 
Anexado no arquivo
Arquivos anexados:
DemoForm.zip  8 kb
 
Vasiliy Sokolov:
Anexado no arquivo

Obrigado, funcionou.

// Coloquei o DemoForm.exe nas bibliotecas
string assembly = TerminalInfoString(TERMINAL_PATH) + "\\MQL5\\Libraries\\DemoForm.exe";


Encontrei um erro muito grave ao trabalhar com janelas C#. Se você mover a janela C# continuamente, o Terminal desaparecerá da tela após alguns segundos, e a carga do núcleo da CPU do terminal64.exe excederá 100%. Tenho 8 núcleos, portanto a carga total do núcleo no TaskManager na CPU é de 12-13%. Quando a janela C# está se movendo, ela é de 19%.


Tenho uma placa de vídeo embutida na CPU, sem placa de vídeo. Achei que o problema estava na tela. Foi por isso que executei esse teste de conselheiro

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");
}

Ele grava a hora do Market Watch a cada segundo. Isso é o que ele registrou quando moveu a janela 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

Você pode ver claramente que o OnTimer não foi executado por vários segundos. Ou seja, mover a janela C# faz com que a execução dos Expert Advisors no Terminal seja interrompida.


Esse problema não se refere apenas à janela C# deste artigo.

 
Vasiliy Sokolov:

A remoção manual do GuiControllerElementsDemo pelo menu Terminal causa alguns segundos de congelamento.