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

 

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

Простой и быстрый способ создания графических окон при помощи редактора Visual Studio с последующей интеграцией в код MQL советника. Статья расчитана на широкий круг читателей, и не требует каких-либо познаний в C# и технологии .Net.

Тестер стратегий в MetaTrader 5 имеет ряд особенностей, которые должен учитывать разработчик графических интерфейсов на языке программирования MQL. Главной особенностью является тот факт, что функция обработки графических событий OnChartEvent не вызывается вовсе. Эта особенность логична, т.к. графическая форма подразумевает работу с пользователем в режиме реального времени. Однако есть тип панелей, который было бы крайне интересно реализовать именно в тестере. Это так называемые торговые плееры, с помощью которых люди могли бы тестировать свои торговые стратегии в ручном режиме. Например, тестер стратегий в ускоренном режиме генерировал текущие рыночные цены, а пользователь нажимал бы на кнопки купить или продать и тем самым симулировал свои торговые действия на истории. Именно к такому типу панелей можно отнести созданную нами TradePanel. Не смотря на свою простоту, она вполне может быть простым плеером торговли с самым необходимым функционалом. 

Но давайте подумаем, как наша панель будет работать в тестере стратегий MetaTrader 5. Графическое окно панели TradePanel существует в виде независимой сборки Net. Следовательно оно никак не зависит от текущего окружения MetaTrader 5 и даже самого терминала. Строго говоря, его можно запустить из любой другой программы, а сборки размещенные в exe-контейнере может запустить даже сам пользователь.

Таким образом, нашей программе не требуется вызов OnChartEvent. Более того, обновлять данные в окне и получать новые приказы от пользователей можно в любой функции-обработчике событий, которая регулярно запускается в тестере стратегий. К таким функциям относятся OnTick и OnTimer. Именно через них и работает наша панель. Следовательно, разработанная для работы в режиме реального времени, наша панель будет также хорошо работать и в тестере стратегий. Делать какие-либо изменения для этого не потребуется. Давайте проверим данное утверждение, запустив нашу панель в тестере и совершим несколько сделок в ней:

Автор: Vasiliy Sokolov

 

На этой картинке

хорошо видно, что приходится делать, чтобы увидеть график баланса/эквити при визуальной торговле.


ЗЫ Что это за две доп. кнопки в правом-верхнем углу каждого окна?

 
fxsaber:

На этой картинке

хорошо видно, что приходится делать, чтобы увидеть график баланса/эквити при визуальной торговле.

Для тех у кого два монитора очень удобно на самом деле. У меня их два, но для картинки пришлось делать такую компановку.

fxsaber:

ЗЫ Что это за две доп. кнопки в правом-верхнем углу каждого окна?

 Дополнительная утилита для удобной работы с двумя мониторами. В данном случае она не должна была попасть в гифку, но за всем не углядишь.  

 
Найдите скомпилированный файл MtGuiController.dll в папке MtGuiController\bin\debug и скопируйте его в каталог библиотек MetaTrader 5
Это не дебаг-версия?
 
Первая строка говорит компилятору о том, что будет использованы вызовы к открытым статическим методам класса, располагающимся в MtGuiController.dll. Обратите внимание, что указывать к каким именно методам мы будет обращаться в этой сборке не нужно. Эту работу выполнит за нас компилятор в автоматическом режиме.
В режиме редактора возможно ли получить список этих методов?
 

хорошая статья, но почему то думаю, что уровень совсем не для начинающих, хотя как инструкция что и как очень подробная, спасибо!

ЗЫ: форму с кнопками и без сторонних dll ( GuiController.dll  ) пользователь может создать средствами VS2017 в буквальном смысле в 2 клика: создать проект - библиотека классов Net и потом  проект -добавить форму Windows

в первом окне "Библиотека классов" пишем код, который запускает графическую форму в несколько строк, примерно так:

using System;
using System.Threading; 
public class MainForm
    {
        static Form1 mainform;
        static Thread threadmainform;
        
public static void Init()
        {
            if (mainform == null)
            {
                threadmainform = new Thread(NewForm);
                threadmainform.Start();
            }
        }

public static void DeInit(int reason)
		{
            if (reason == 3 || reason == 5) return;
            if (mainform!=null) {mainform.Close(); Thread.Sleep(1000);}
			if(threadmainform!=null) threadmainform.Join();
			mainform=null;
			threadmainform=null;
		}

private static void NewForm()   {   mainform = new Form1();   mainform.ShowDialog();   }
}

если скомпилировать этот десяток строк в VS2017, то в МТ5 уже можно создать графическую форму (все элементы которые будут добавлены на форму будут "кликабельны" ) и можно удалить ее (DeInit () ), останется только наладить обмен данными между формой - которая "крутится" в отдельном потоке и самим МТ5

с МТ4 намного все грустнее, но все равно можно добиться запуска dll написанной на .Net


 

Спасибо за пример с github. Возможен ли такой же принцип с MT5?

#include <Include.mqh> // ShareProject-путь

Когда ME автоматически синхронизирует mqh-файл по прописанному комментарию в пути?

 

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


Мысли по применению

  • Из приложения возможно останавливать выполнение одиночного прохода даже не в режиме визуализации. Например, идет зацикленное МО-обучение в OnTester. Формой удобно остановить его, когда посчитал нужным.
  • Хорошо видно, что очень просто написать полноценный торговый API для С#. После чего все советники писать на C# и запускать их в Терминале/Тестере. И на основе этого API можно создавать альтернативные Терминалы с кастомными скинами, например. Огромные возможности для приложений, нацеленных на простых юзеров. Можно собирать их хотелки и реализовывать: тиковые графики, Тестеры и т.д.
  • Возможно легко встроить панель в свой советник в качестве дополнения ручной торговли в Визуализаторе. Это позволяет эмулировать для алго-советника стрессовые ситуации (удалил его ордер, выставил свой и т.д.). Но что еще приятнее, все ручные действия легко записать и проигрывать их далее без формы и, соответственно, нажатия на кнопки. Что позволяет в дебаг-режиме отлаживать советник для устойчивости ручного вмешательства.


Как будет происходить взаимодействие, если будет запущено несколько таких форм-советников?

 
fxsaber:

Спасибо за пример с github. Возможен ли такой же принцип с MT5?

#include <Include.mqh> // ShareProject-путь

Когда ME автоматически синхронизирует mqh-файл по прописанному комментарию в пути?

То что Вы описали, могло бы быть весьма интересной и крутой фичей для ME, но так конечно не работает.

Однако, MQL4 и MQL5 поддерживаются GitHub напрямую.

Также есть утилиты, в первую очередь Git Bash, которые позволяют делать все, что есть в VisualStudio и даже больше. Они прекрасно работают с проектами на MQL. Что уж говорить, если с помощью github пишутся целые книги.

Т.е. на самом деле, разработка проектов MQL на github поддерживается уже давно и на высоком уровне.

 
Vasiliy Sokolov:

То что Вы описали, могло бы быть весьма интересной и крутой фичей для ME, но так конечно не работает.

Однако, MQL4 и MQL5 поддерживаются GitHub напрямую.

Также есть утилиты, в первую очередь Git Bash, которые позволяют делать все, что есть в VisualStudio и даже больше. Они прекрасно работают с проектами на MQL. Что уж говорить, если с помощью github пишутся целые книги.

Т.е. на самом деле, разработка проектов MQL на github поддерживается уже давно и на высоком уровне.

К сожалению, для таких нубов, как я, все это темный лес. В Вашей статье показано классное применение гитхаба. Наверное, это всего 1% от его возможностей, но он увидился полезным.

По приведенным ссылкам так и не понял, как это может помочь в MQL5. Наверное, у программистов это must-have, но есть и далекие от программирования, каким сам являюсь.

Если бы была статья на эту тему для MQL5, было бы полезно.

 
fxsaber:

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

Мысли по применению

  • 1) Из приложения возможно останавливать выполнение одиночного прохода даже не в режиме визуализации. Например, идет зацикленное МО-обучение в OnTester. Формой удобно остановить его, когда посчитал нужным.
  • 2) Хорошо видно, что очень просто написать полноценный торговый API для С#. После чего все советники писать на C# и запускать их в Терминале/Тестере. И на основе этого API можно создавать альтернативные Терминалы с кастомными скинами, например. Огромные возможности для приложений, нацеленных на простых юзеров. Можно собирать их хотелки и реализовывать: тиковые графики, Тестеры и т.д.
  • 3) Возможно легко встроить панель в свой советник в качестве дополнения ручной торговли в Визуализаторе. Это позволяет эмулировать для алго-советника стрессовые ситуации (удалил его ордер, выставил свой и т.д.). Но что еще приятнее, все ручные действия легко записать и проигрывать их далее без формы и, соответственно, нажатия на кнопки. Что позволяет в дебаг-режиме отлаживать советник для устойчивости ручного вмешательства.

4) Как будет происходить взаимодействие, если будет запущено несколько таких форм-советников?

1) Да, совершенно верно. Фишка внешнего приложения позволяет проделывать все эти штуки.

2) Написать действительно можно. Вот только пропихивать все торговое окружение в C# является плохой идеей. Советники лучше писать все же на чистом MQL, а вот снабжать их нужными "обвесами" можно и на c#.

3) Да, и такое можно сделать. 

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

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