Обсуждение статьи "Создание графических интерфейсов на базе .Net Framework и C# (Часть 2): Дополнительные графические элементы"

 

Опубликована статья Создание графических интерфейсов на базе .Net Framework и C# (Часть 2): Дополнительные графические элементы:

Статья является логическим продолжением предыдущей публикации "Создание графических интерфейсов для экспертов и индикаторов на базе .Net Framework и C#" и знакомит читателей с новыми графическими элементами для создания графических интерфейсов.

Начиная со второй версии, контроллер стал поддерживать окна сообщений или MessageBox. Это стандартный элемент информирования пользователей. С его помощью можно также предложить пользователю несколько вариантов действий и получить от него ответ в виде выбранного им варианта.

Для того, что бы запустить демонстрацию окон сообщений выберите при запуске эксперта в параметре  "Windows Form Element Type" вариант 'Buttons and MessageBox'. После запуска эксперта появится форма, предлагающая выбрать один из вариантов действий:

Рис. 3. Демонстрационная форма вызывающая окна сообщений. 

Данная форма, как и все последующие, является демонстрационной, поэтому не снабжена торговой логикой. Однако, вслед за нажатием любой из кнопок, эксперт отправит предупреждающее сообщение, запрашивающее подтверждение выбранных действий. Например при нажатии кнопки SELL будет отображено следующее окно сообщений:


Рис. 4. Торговый эксперт просит подтверждение на открытие новой короткой позиции.

Автор: Vasiliy Sokolov

 
Все прекрасно, статья, GUI и бескрайние возможности C#, только почему таблиц нет, Василий? С ними какие то сложности?
 
Реter Konow:
Все прекрасно, статья, GUI и бескрайние возможности 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:

Ошибка при запуске советника из статьи.

Пути к файлу программы указаны абсолютные, следовательно Вам необходимо поменять их на фактические. Сделать универсальные каталоги как в МТ не представляется возможным. 

 
Vasiliy Sokolov:

Пути к файлу программы указаны абсолютные, следовательно Вам необходимо поменять их на фактические. Сделать универсальные каталоги как в МТ не представляется возможным. 

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

Нигде не обнаружил этого файла. Компилировать его из предоставленных C#-исходников пока нет возможности.

 
fxsaber:

Нигде не обнаружил этого файла. Компилировать его из предоставленных C#-исходников пока нет возможности.

Странно, наверное в архив забыл приложить. Выложу через несколько часов.

 
Прикладываю в архиве
Файлы:
DemoForm.zip  8 kb
 
Vasiliy Sokolov:
Прикладываю в архиве

Спасибо, получилось.

// DemoForm.exe закинул в Libraries
string assembly = TerminalInfoString(TERMINAL_PATH) + "\\MQL5\\Libraries\\DemoForm.exe";


Обнаружилась очень серьезная ошибка работы с C#-окнами. Если непрерывно перемещать C#-окно, то через несколько секунд Терминал исчезает с экрана, при этом нагрузка на CPU-ядра у terminal64.exe превышает 100%. У меня 8 ядер, поэтому полная нагрузка ядра в TaskManager у 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 руками через меню Терминала приводит к подвисанию на несколько секунд.

Причина обращения: