Создание GUI для MQL в графическом режиме. - страница 5

 

Вот пример простой формы, нарисованной на шарпе за 10 минут с советником. Форма получает тики с графика, напрямую из советника как с нативной dll, без сокетов, файлов и прочего. Причем форма прикреплена к графику. С прикреплением есть некоторая проблема, которую нужно решить. Но можно и не прикреплять, тут кому что нравится.

 
Алексей Барбашин:

Вот пример простой формы, нарисованной на шарпе за 10 минут с советником. Форма получает тики с графика, напрямую из советника как с нативной dll, без сокетов, файлов и прочего. Причем форма прикреплена к графику. С прикреплением есть некоторая проблема, которую нужно решить. Но можно и не прикреплять, тут кому что нравится.

Расскажи каким компилятором с ГитХаба пользовался. Или руками шарповый компил редактировал? На фиг нужно. Проще С++ ДЛЛ написать в смешанном коде (управляемый+ неуправляемый).

 
Yuriy Asaulenko:

Расскажи каким компилятором с ГитХаба пользовался. Или руками шарповый компил редактировал? На фиг нужно. Проще С++ ДЛЛ написать в смешанном коде (управляемый+ неуправляемый).

Я в предыдущем посте написал: все штатными средствами VS делается. Я использую VS 2017 Community. Просто в начале работы с проектом к нему подключается библиотека DllExport с Nuget. Ничего после компиляции проекта дорабатывать руками не требуется, от слова СОВСЕМ.

Шаблон от R.Giesecke не рекомендую. Вот с ним реальные танцы с бубном, если вообще получится запустить. С этой библиотекой вы даже разницы не почувствуйте. Ваша dll сама "станет native" в процессе обычной компиляции.

 
Алексей Барбашин:

Я в предыдущем посте написал: все штатными средствами VS делается. Я использую VS 2017 Community. Просто в начале работы с проектом к нему подключается библиотека DllExport с Nuget. Ничего после компиляции проекта дорабатывать руками не требуется, от слова СОВСЕМ.

Да, да, точно с Nuget. Мне он не подошел, но там нестандартная ДЛЛ была для взаимодействия с Си-АПИ, + еще функции обратного вызова. Не знаю, почему-то мне запомнилось, что это компилятор, или то было другое решение.

А в данном случае, решение действительно хорошее и простое.

 
Алексей Барбашин:

Почему же левый? Все делается штатными средствами VS. На Nuget есть библиотека DllExport, которая один раз модифицирует класс System.Runtime.InteropServices в составе сборки и далее все компилируется штатно. Так что никаких танцев с бубном не требуется, обертки не требуются. Создание форм намного проще в c#, чем прописывать их еще в дополнительном файле, как это предлагает Максим. Я уважаю Максима и его труд, но в данном случае нам открыт мир Net без дополнительных трудностей.

Это интересно, сами проверяли? Я в свое время делал связь МТ4 - C++dll - C#dll, напрямую загрузить C#dll не смог.

https://www.nuget.org/packages/DllExport/ - оно?

DllExport 1.6.0
DllExport 1.6.0
  • www.nuget.org
The open implementation of unmanaged exports for .NET ( DllExport )        Source code and all details here: https://github.com/3F/DllExport                To configure projects via current package:        ========================================================        DllExport -action Configure -dxp-version 1.6.0...
 
Алексей Барбашин:

Я в предыдущем посте написал: все штатными средствами VS делается. Я использую VS 2017 Community. Просто в начале работы с проектом к нему подключается библиотека DllExport с Nuget. Ничего после компиляции проекта дорабатывать руками не требуется, от слова СОВСЕМ.

Шаблон от R.Giesecke не рекомендую. Вот с ним реальные танцы с бубном, если вообще получится запустить. С этой библиотекой вы даже разницы не почувствуйте. Ваша dll сама "станет native" в процессе обычной компиляции.

Тезка, можно подробнее? Задача для примера - сделать панель на C#, получающая инфу с советника и посылающая ему команды. Как для этого использовать dllexport?

Разжевывать не надо, просто шаги, что и как друг с другом реагирует?

 
Alexey Volchanskiy:

Это интересно, сами проверяли? Я в свое время делал связь МТ4 - C++dll - C#dll, напрямую загрузить C#dll не смог.

https://www.nuget.org/packages/DllExport/ - оно?

Конечно проверял. Я же выше пример создания dll с формой привел.

 
Алексей Барбашин:

Конечно проверял. Я же выше пример создания dll с формой привел.

Это картинка - пример?

Ясно, сам разберусь

 
Alexey Volchanskiy:

Тезка, можно подробнее? Задача для примера - сделать панель на C#, получающая инфу с советника и посылающая ему команды. Как для этого использовать dllexport?

Разжевывать не надо, просто шаги, что и как друг с другом реагирует?

1. Создаем проект на c# Библиотека классов (net Framework)

2. Добавляем в проект библиотеку DllExport из NuGet. Лучше скачать с сервера. Положить батник в папку с проектом.

3. Запускаем через командную строку эту библиотеку (видео есть на хабе) и модифицируем класс System.Runtime.InteropServices.

На этом все подготовки закончены. Перезапускаем проект

4. Создаем экспортируемую функцию и перед ней прописываем модификатор [DllExport]ю При правильно выполненном шаге 3 компилятор не будет ругаться на модификатор

5. Добавляем в проект форму, оформляем как требуется.

6. Добавляем в класс экспортируемых функций (создан на шаге 1) функцию открытия формы, например Start

7. Создаем функцию открытия формы, например OpenDialog как это делается в функции main при создании приложения на windows form

8. В функции Start создаем поток, для которого указываем в качестве исполняемого метода функцию OpenDialog 

9. Создаем советник/индикатор/скрипт и подключаем dll как обычно. ))

10 Вызываем из mql функцию Start

Форма запустится в отдельном потоке и не вызовет остановки процесса в mql, как это бы сделал обычный модальный диалог

Передача данных из mql в форму выполняется так же как передача данных между классами и потоками самого приложения.

1. Создаем в "экспортируемом" классе функцию, которую будет вызывать mql для передачи данных, например SendTick

Необходимо помнить что mql будет видеть только те методы классов (функции), у которых установлен модификатор [DllExport]

2. Создаем в этом классе делегат события с параметрами

3. В форме подписываемся на событие экспортного класса

4. При вызове метода SendTick из mql вызываем созданное событие, с передачей параметров

5. В форме "перехватываем событие" созданным обработчиком и выводим данные на форму, ну или что-то еще делаем.

Все. Больше ничего не требуется.

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

У кого получится, прошу поделиться "результатом" и впечатлениями от простоты. )))

Самым "сложным" во всем этом деле будет установка библиотеки. )))

 
Alexey Volchanskiy:

Это картинка - пример?

Ясно, сам разберусь

Алексей, я подробно расписал. )) Если еще будут вопросы, спрашивай, постараюсь ответить!

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