Индикаторные панели и диалоги управления
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: Индикаторные панели и диалоги управления

  1. #1
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52

    Индикаторные панели и диалоги управления

    Хотелось бы начать обсуждать все, что связано с классами для создания интерактивных приложений. С обновлением mql4 стали доступны стандартные классы, размещенные в "Include\Controls". В частности, интересует практическая сторона их применения.

    - - - Добавлено - - -

    Если кто-то помнит, некогда был отличный скрипт "mt4mm" для открытия ордеров с различными настройками.

    Скрытый текст

    [свернуть]

    Он использовал dll для создания диалогового окна, различных кнопочек, текстовых окон.
    Кандидат №1 на переделку с помощью стандартных классов Controls

    - - - Добавлено - - -

    Для создания диалогового окна понадобятся два файл:
    1. Влючаемый файл с описанием класса диалогового окна управления
    2. Файл с исходным кодом индикатора/советника.

    Вы не можете благодарить!

  2. #2
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52

    Класс диалога управления.

    В окне навигации в метаедиторе создадим отдельную папку "mt4mm" для будущего проекта.



    С помощью мастера создадим в этой папке включаемый файл с описанием класса



    Получим заготовку для класса. Добавляем включаемый файл <Controls\Dialog.mqh> из состава Стандартной Библиотеки с описанием базового класса CAppDialog и комментарии.



    - - - Добавлено - - -

    Создадим индикатор с выводом в окно графика и обработчиком OnChartEvent
    Код:
    #property indicator_chart_window
    //+------------------------------------------------------------------+
    //| Включаемые файлы                                                 |
    //+------------------------------------------------------------------+
    #include "ControlsDialog.mqh"
    Добавляем включаемый файл с описанием ранее созданого класса CControlsDialog. Объявим глобальную переменную - объект класса.
    Код:
    //+------------------------------------------------------------------+
    //| Глобальные переменные                                            |
    //+------------------------------------------------------------------+
    CControlsDialog ExtDialog;
    Код создания диалога, запуска приложения в тело функции OnInit();

    Код:
    int OnInit()
      {
    //--- indicator buffers mapping
       //--- создаём диалог приложения
       if(!ExtDialog.Create(0,"Money managment",0,20,20,620,570))
         return(-1);
    //--- запускаем приложение
       if(!ExtDialog.Run())
         return(-2);
    //---
       return(INIT_SUCCEEDED);
      }
    В функцию OnDeinit() - код уничтожения диалога.
    Код:
    //+------------------------------------------------------------------+
    //| Деинициализация                                                  |
    //+------------------------------------------------------------------+
    void OnDeinit(const int reason)
      {
    //--- удаляем диалог
       ExtDialog.Destroy(); 
      }
    Код обработчика событий
    Код:
    void OnChartEvent(const int id,
                      const long &lparam,
                      const double &dparam,
                      const string &sparam)
      {
    //--- обрабатываем событие
       ExtDialog.ChartEvent(id,lparam,dparam,sparam);
      }
    //+------------------------------------------------------------------+
    В таком виде индикатор пока что ничего не показывает.

    Вы не можете благодарить!
    Последний раз редактировалось vov4ik; 04.11.2015 в 23:36.

  3. #3
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52

    Какие элементы отображать?

    В стандартной библиотеке доступны следующие классы для создания диалоговых окон и панелей.

    Понадобятся следующие элементы:
    Панель - для логического объединения функционально связаных элементов.
    1-ая панель для выбора торгового инструмента и способа расчета мани менеджмента с дополнительными информационными элементами.
    2-ая панель для выбора типа ордера и лота, также с выводом дополнительной информации.
    3-я панель для установки стопа и профита.
    Кнопка для совершения торговой операции или установки отложенного ордера.
    Кроме панелей и кнопки также в самих панелях будут использоваться текстовые метки, поля ввода а также комбинированные элементы - поле с выпадающим списком, радио-кнопки, поле инкремента/декремента, переключатели.

    Вы не можете благодарить!

  4. #4
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52
    Все элементы создаются программным способом с помощью метода
    Код:
    Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
    ,где x1, x2, y1, y2 - координаты верхнего левого и правого нижнего углов. Вот здесь заморочка - для каждого элемента нужно расчитывать эти координаты. В других визуальных редакторах для создания оконных приложений (таких как, Visual Studio) делается все проще - на форму перетаскивается нужный элемент и задается размер и расположение.

    Вы не можете благодарить!

  5. #5
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52

    Создание окна диалога

    Чтобы наполнить главное окно диалога управления CControlsDialog функциональностью требуется переопределить метод Create родительского класса CAppDialog.
    Объявляем функцию-член класса:
    Код:
    public:
                  ...
       //--- create
       virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
    Первоначально определяем таким:
    Код:
    //+------------------------------------------------------------------+
    //| Create                                                           |
    //+------------------------------------------------------------------+
    bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
      {
    //--- вызываем метод родительского класса
       if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))                           return(false);
    //--- создаём дополнительные элементы
    
    //--- succeed
       return(true);
      }
    Если скомпилировать индикатор теперь и перетянуть на график, то получим


    Вы не можете благодарить!
    Последний раз редактировалось vov4ik; 05.11.2015 в 09:25.

  6. #6
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52

    Графический интерфейс пользователя

    По поводу того, как должен визуально выглядеть GUI(англ. graphical user interface) написано тысячи статей и книг. Интерфейс должен быть интуитивно понятным. Не нужно его усложнять. Самый простой способ - это задание абсолютных значений для расположения элементов внутри диалогового окна. В этом случае они располагаются попиксельно. Можно даже сначала нарисовать как должно выглядеть окно в каком-нибудь графическом редакторе, а дальше перенести в коде все размеры, отступы, выступы, зазоры.

    Для удобства расстановки и дальнейшей возможной перестановки используются именованные константы #define.
    Код:
    //--- для панели
    #define PANEL_WIDTH                         (570)      // размер панели по X
    #define PANEL_HEIGHT                        (150)      // размер панели по Y
    //--- отступы и зазоры
    #define INDENT_LEFT_PANEL                   (10)      // отступ слева  
    #define INDENT_TOP_PANEL                    (5)       // отступ сверху

    Вы не можете благодарить!

  7. #7
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52

    Cоздание панели выбора инструмента и метода рассчета лота

    Что бы функционально объединить элементы в группы применяют панели - прямоугольные метки CPanel. Для создания панели нужно подключить включаемый файл Controls\Panel.mqh из стандартной библиотеки.
    Код:
    #include <Controls\Panel.mqh>
    В классе диалогого окна СControlsDilalog добавляем объект класса СPanel:
    Код:
    private:
       //--- дополнительные элементы
       CPanel            pInst;  //панель для выбора инстрyмента и метода расчета лота
    Добавим метод его создания:
    Код:
    protected:
       //защищенные методы класса
       //--- создание дополнителных элементов
       bool              CreatePanelInstrument(void);
    и соответсвенно, его определение:
    Код:
    //+------------------------------------------------------------------+
    //| Создание панели выбора инструмента и метода мм                   |
    //+------------------------------------------------------------------+
    bool CControlsDialog::CreatePanelInstrument(void)
      {
    //--- координаты
       int x1=INDENT_LEFT_PANEL;
       int y1=INDENT_TOP_PANEL;
       int x2=INDENT_LEFT_PANEL+PANEL_WIDTH;
       int y2=INDENT_TOP_PANEL+PANEL_HEIGHT;
    //--- создаём панель
       if(!pInst.Create(m_chart_id,"pInst",m_subwin,x1,y1,x2,y2))              return(false);
       if(!pInst.BorderType(BORDER_FLAT))                                            return(false);
       if(!pInst.ColorBackground(clrWhite))                                             return(false);
       if(!Add(pInst))                                                                         return(false);
    //--- удача
       return(true);
      }
    Теперь при создании окна диалога последовательно вызываются методы создания дополнительных элементов.
    Код:
    bool CControlsDialog::Create(...)
      {...
    //--- создаём дополнительные элементы
       if(!CreatePanelInstrument())                                                     return(false);
    ...
    }

    Вы не можете благодарить!

  8. #8
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52
    На самой панели инструмента будут следующие элементы:
    1. Текстовые метки, для отображения надписей "Инструмент", "Стоимость тика на 1 лот", "%", "Производить расчет от"
    2. Комбинированные списки для выбора инструмента и валюты в которой будет происходить дальнейший расчет.
    3. Поля ввода для числового отображения стоимости тика, баланса, средств или ввода начальных средств вручную.
    4. Группы переключателей для выбора расчета лота и выбора от чего производить расчет.
    5. Поле инкримента/декримента процента.

    Подключаем необходимые файлы с нужными классами.
    Код:
    #include <Controls\Label.mqh>
    #include <Controls\Edit.mqh>
    #include <Controls\ComboBox.mqh>
    #include <Controls\RadioGroup.mqh>
    #include <Controls\SpinEdit.mqh>
    Добавим элементы в класс CControlsDialog к диалогу управления
    Код:
       CLabel            lInstrument;  //текстовая метка "Инструмент"
       CComboBox         cInstrument;  //комбинированый список для выбора инструмента
       CLabel            lPoint;       //текстовая метка "Стоимость тика"
       CEdit             ePoint;       //неактивное поле ввода 
       CComboBox         cCurency;     //спиок с валютами
       CLabel            lMm;          //метка "Метод расчета лота"
       CRadioGroup       rMm;          //переключатели фиксированный процент, процент на 100 п.
       CLabel            lProcent;     //метка процент
       CSpinEdit         sProcent;     //поле инкримента/декримента процента
       CLabel            lUse;         //метка "Производить расчет от:"
       CRadioGroup       rBalance;     //переключатели Баланс, Средства, Вручную
       CEdit             eBalance;     //поле ввода для Баланса
       CEdit             eEquity;      //поле ввода для Средств
       CEdit             eCustom;      //поле ввода для ручного ввода

    Вы не можете благодарить!
    Последний раз редактировалось vov4ik; 11.11.2015 в 20:48.

  9. #9
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52
    Не буду заострять внимание на расположение, размеры, отступы элементов управления. Есть интересная, на мой взгляд, статья о компоновки элементов с помощью контейнера CBox. Но у меня, расставляя элементы попиксельно, получился такой вот интерфейс на моем экране.



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

    Вы не можете благодарить!
    Последний раз редактировалось vov4ik; 06.11.2015 в 19:34.

  10. #10
    Banned
    Регистрация
    29.05.2012
    Сообщений
    638
    Promo (¢)
    0
    Благодарности
    Получено: 145
    Отправлено: 52
    Т.к. в панели будут несколько однотипных элементов управления, то можно написать общую функцию для их создания.
    Например, для создания неактивного поля ввода
    Объявление:
    Код:
    bool CreateUnEnableEdit(CEdit &Edit, string name, int X_LeftTop, int Y_LeftTop);
    Определение:
    Код:
    //+------------------------------------------------------------------+
    //| Создание неактивного поля ввода                                  |
    //+------------------------------------------------------------------+
    bool CControlsDialog::CreateUnEnableEdit(   
       CEdit   &Edit,                // Объект класса поле ввода
       string      name,             // Имя
       int         X_LeftTop,        // X-координата левого верхнего угла
       int         Y_LeftTop         // Y-координата левого верхнего угла
        )
      {
    //--- координаты
       int x1=X_LeftTop;
       int y1=Y_LeftTop;
       int x2=x1+CONTROLS_WIDTH;
       int y2=y1+EDIT_HEIGHT;
    //--- создаём поле 
       if(!Edit.Create(m_chart_id,name,m_subwin,x1,y1,x2,y2))              return(false);
       if(!Edit.ReadOnly(true))              return(false);
       if(!Edit.ColorBackground(READ_ONLY_CLR))              return(false);
    
       if(!Add(Edit))
          return(false);
    //--- удача
       return(true);
      }

    Вы не можете благодарить!

Страница 1 из 2 1 2 ПоследняяПоследняя

Похожие темы

  1. Роботы, индикаторы, панели, функции, библиотеки - все для торговли в МТ
    от Programmer96 в разделе Реклама: Предлагаю трейдерам...
    Ответов: 0
    Последнее сообщение: 21.09.2017, 14:14
  2. Методы управления капиталом
    от dimmi2012 в разделе Разговоры о трейдинге
    Ответов: 1025
    Последнее сообщение: 13.09.2016, 15:59
  3. Ответов: 222
    Последнее сообщение: 18.02.2016, 10:39
  4. Индикаторные советники форекс. Обсуждаем и делимся мнением.
    от Azizkin в разделе Софт для автоматизации торговли
    Ответов: 15
    Последнее сообщение: 03.02.2015, 16:40
  5. Панели для ручной торговли и советники
    от ilfatnew в разделе Архив конкурса "CopyFX: Трейдеры"
    Ответов: 0
    Последнее сообщение: 17.11.2012, 07:30

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •