Logo

Вход

Войти с помощью соц. сетей
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
  • #1 Свернуть

    ООП для MQL4/MQL5 - это очень просто. Курс для начинающих.

    Всем привет!

    Открываю тему по изучению объектно-ориентированного программирования с нуля. Будем использовать языки MQL4, MQL5, возможно, С++ в составе DLL. Будет желание, зацепим и C# с Matlab'ом
    Кратенько о себе. Программист с более чем 25-летним стажем, работал в крупных отечественных и зарубежных компаниях по разработке ПО и различной электроники. В мае 2010 г. понял, что наемная работа мешает мне развиваться в программировании на форексе, с тех пор работаю дома и вполне доволен. Активно использую в работе MQL4, MQL5, VS 2017 C++, C#, Matlab. Ну и всякое разное по мелочи.

    Краткий план курса
    1. Структуры
    2. От структур к классам
    3. Абстрактные классы, виртуальные функции
    4. Интерфейсы
    5. Что дальше?


    И вопрос к модераторам. Хотелось бы сделать меню, чтобы участники могли ориентироваться в разделах темы. Если я сделаю меню в начальных постах, как долго у меня будет доступ на редактирование поста с меню? Надо ли мне будет раз в несколько дней делать там изменения, чтобы пост не "заморозился"? Сможете ли вы в крайнем случае (например, я отсутствовал больше разрешенного срока) разморозить пост с меню? Или лучше продублировать меню на независимом ресурсе, например FB?
    Жду вашего ответа и начинаю сегодня.
    Последний раз редактировалось Gold; 17.01.2018, 11:23. Причина: Добавил ссылки для п.1 и п.2
    Женщины продолжают изумлять — обновлено!
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Курс будет рассчитан на людей, знакомых с программирование на MQL4/5, но не владеющих ООП. То есть я не буду объяснять, что такое циклы, функции и т.д. Смело задавайте вопросы в рамках темы, обязательно всем отвечу.
    Огромная просьба не скатываться во флейм и не устраивать священные войны а-ля "ООП vs процедурное программирование", именно из-за флейма я ушел с форума разработчиков Metatrader и пришел сюда. Надеюсь, тут народ подисциплинированнее, а модераторы построже В первых постах возможны ошибки с кодами оформления, т.к. нет особого опыта на этом движке, прошу указывать и поправлять.

    ------ Поехали! -------

    Начну с того, что, вопреки ошибочному мнению, языки MQL4 и MQL5 практически одинаковы, поэтому все, что касается ООП, будет работать и там и там. Отличия касаются только API (application program interface - программный интерфейс приложений), это торговые функции, работа с таймсериями, индикаторами и т.д. Но сами языки идентичны.

    Основная цель структуры - упаковать набор разнородных данных в единый контейнер. Например, имеем набор переменных

    PHP код:
    int ticketcmdslippagemagic;
    double volumeSendvolumeRealpriceSendpriceRealstoplosstakeprofit
    Как вы поняли, в них будут хранится параметры открытого ордера (код для MQL4), для MQL5 параметры будут немного другие. Поэтому я постараюсь писать кросс-платформенный код, как давно делаю в своих роботах.
    В дальнейшем мы будем разрабатывать класс по управлению сеткой виртуальных ордеров и надо будет как-то хранить параметры сетки и параметры уже открытых ордеров. Для этого будем использовать структуру.

    Продолжение через 30 минут.

    !!!!!!!!!!!!!!! почему MQL код не оформился? Подскажите плз, как правильно сделать
     
    Последний раз редактировалось Gold; 15.01.2018, 07:14. Причина: ошибка в оформлении MQL кода
    Женщины продолжают изумлять — обновлено!

    Комментарий

    • #3 Свернуть

      Сообщение от VDev Посмотреть сообщение
      !!!!!!!!!!!!!!! почему MQL код не оформился? Подскажите плз, как правильно сделать
      Потому что глючит. Походу его пока отключили. Используй теги либо code либо php.
       

      Комментарий

      • #4 Свернуть

        Сообщение от VDev Посмотреть сообщение
        И вопрос к модераторам. Хотелось бы сделать меню, чтобы участники могли ориентироваться в разделах темы. Если я сделаю меню в начальных постах, как долго у меня будет доступ на редактирование поста с меню?
        Что вы имеете в виду под "разделами темы" и "начальными постами"?

        Время редактирования поста - 60 минут с момента публикации. При необходимости отредактировать его позже нужно будет обратиться к модераторам.
        Правила хорошего тона | Деньги за посты | Партнёрская программа | Советы от КИСА | twitter | Баннеры форума

        Комментарий

        • #5 Свернуть

          У нас в процессе торговли может быть множество открытых и отложенных ордеров. Конечно, можно было бы тупо сделать каждый параметр динамическим массивом массивом, но представьте все неудобства такого подхода. При каждом увеличении количество ордеров сверх размера массива надо его менять для каждого параметра. И вопрос, что делать с дырами, которые получаются на месте закрытых ордеров?
          PHP код:
          int ticket[], cmd[], slippage[], magic[];
          double volumeSend[], volumeReal[], priceSend[], priceReal[], stoploss[], takeprofit[]; 
          Гораздо проще и красивее упаковать все параметры в контейнер, который называется структурой. Для того, чтобы использовать структуру, надо сначала объявить ее тип. Это делается один раз и в дальнейшем мы можем создавать экземпляры этой структуры, или говоря по другому переменные типа объявленной структуры.
          PHP код:
          struct SOrderParams // объявили имя типа. Теперь в программе помимо стандартных типов int, double и др. появился наш пользовательский тип структуры с именем SOrderParams 
          {
              
          int ticketcmdslippagemagic;
              
          double volumeSendvolumeRealpriceSendpriceRealstoplosstakeprofit;
          }; 
          Допускается после объявления типа сразу же создавать переменные этой структуры
          PHP код:
          struct SOrderParams // объявили имя типа. Теперь в программе помимо стандартных типов int, double и др. появился наш пользовательский тип структуры с именем SOrderParams 
          {
              
          int ticketcmdslippagemagic;
              
          double volumeSendvolumeRealpriceSendpriceRealstoplosstakeprofit;
          order1order2orders[128]; 
             
          Последний раз редактировалось VDev; 15.01.2018, 01:25.
          Женщины продолжают изумлять — обновлено!

          Комментарий

          • #6 Свернуть

            Сообщение от Helios Посмотреть сообщение
            Что вы имеете в виду под "разделами темы" и "начальными постами"?

            Время редактирования поста - 60 минут с момента публикации. При необходимости отредактировать его позже нужно будет обратиться к модераторам.
            Мне хотелось бы сделать меню, в котором будут ссылки на страницы этой темы, где будут освещаться разные вопросы. Например

            Структуры
            Классы
            Наследование
            ... и т.д.

            Но раз только 60 минут, то я это сделать не смогу. Просто на разных форумах по разному, я и спросил. Значит, придется раз в неделю обращаться к модераторам с просьбой подкорректировать меню. И не могли бы подсказать, как правильно вставлять MQL-код, у меня ерунда получается.
               
            Женщины продолжают изумлять — обновлено!

            Комментарий

            • #7 Свернуть

              Сообщение от ir0407 Посмотреть сообщение
              Потому что глючит. Походу его пока отключили. Используй теги либо code либо php.
              Спасибо, так работает
                 
              Женщины продолжают изумлять — обновлено!

              Комментарий

              • #8 Свернуть

                Вообще, если вы посмотрите различные исходники, например Стандартной Библиотеки (\MQL4\Include\.. и \MQL5\Include\.. ), то заметите, что обычно поля (переменные в структурах и классах принято называть полями) пишутся в столбик. Вот пример из СБ, класс скролл-бара. Пусть не смущает, что я привожу в пример класс, сходу не нашел такой же со структурой.
                PHP код:
                class CScroll : public CWndContainer
                  
                {
                protected:
                   
                //--- dependent controls
                   
                CPanel            m_back;                // the "scrollbar background" object
                   
                CBmpButton        m_inc;              // the "increment button" object ("down" for vertical scrollbar, "right" for horizontal scrollbar)
                   
                CBmpButton        m_dec;             // the "decrement button" object ("up" for vertical scrollbar, "left" for horizontal scrollbar)
                   
                CBmpButton        m_thumb;         // the "scroll box" object
                   //--- set up
                   
                int               m_min_pos;             // minimum value
                   
                int               m_max_pos;            // maximum value
                   //--- state
                   
                int               m_curr_pos;            // current value
                // и дальнейший код.... 
                Как видно, плюс в том, что можно вставить комментарии к каждому полю, чтобы через год не ломать голову, чтобы это значило.

                Теперь посмотрим, как объявляются переменные типа структура

                PHP код:
                struct SOrderParams
                {
                    
                int ticketcmdslippagemagic;
                    
                double volumeSendvolumeRealpriceSendpriceRealstoplosstakeprofit;
                order1order2orders[128];

                SOrderParams oparams_global// глобальная переменная структуры, все поля обнулены перед стартом скрипта

                void OnStart()
                {
                   
                SOrderParams oparams_local1;          // локальная переменная структуры, в полях в общем случае может быть мусор от предыдущих вызовов (именно в данном случае не будет, так как однопроходный скрипт)
                   
                SOrderParams oparams_local2 = {0}; // обнулили все поля принудительно
                   
                SOrderParams oparams_local3 = {123ORDER_TYPE_SELL/* OP_SELL*/254567890.50.51.254681.254651.258601.25410}; // задали все поля
                   
                Print(oparams_local2.priceReal",  "oparams_local2.stoploss",  "oparams_local3.magic",  "oparams_local3.stoploss);

                Вывод: 2018.01.15 02:04:06.565 Structures (EURUSD,W1) 0.0, 0.0, 456789, 1.2586

                Почему в локальной переменной oparams_local1 может быть мусор? Представим, что эта переменная объявляется в функции, которая вызывается внутри большой и сложной программы. Так как она будет создаваться на стеке, а стек активно используется, наверняка он будет забит всяким хламом, оставшимся от каких то предыдущих вызовов других функций. Это касается не только структур, а вообще всех локальных переменных.

                В oparams_local3 поля заполняютсяв том порядке, как они объявлены в структуре. Делать так можно только один раз, при создании переменной. В дальнейшей работе доступ к полям осуществляется через точку
                PHP код:
                   oparams_local1.volumeSend 0.25 // лота 
                   
                Последний раз редактировалось VDev; 15.01.2018, 02:45.
                Женщины продолжают изумлять — обновлено!

                Комментарий

                • #9 Свернуть

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

                  Структуры
                  Классы
                  Наследование
                  ... и т.д.

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

                  Сообщение от VDev Посмотреть сообщение
                  И не могли бы подсказать, как правильно вставлять MQL-код, у меня ерунда получается.
                  Для оформления кода можете использовать теги PHP или CODE.
                  Правила форума | КИСА | Акция «Деньги за посты» | Как вставить картинку?

                  Комментарий

                  • #10 Свернуть

                    Сообщение от VDev Посмотреть сообщение
                    Всем привет!
                    Краткий план курса
                    • Что дальше?
                    Алексей, дальше, однозначно сетевая поддержка.

                    Направление:
                    Логи по ошибкам кода.
                    Статистический анализ.
                    Другая технологическая информация.

                    Клиент должен чувствовать себя уверенно.

                    Не всегда и не всё, можно вовремя исправить, но успеть иногда можно.
                     
                    Последний раз редактировалось MonyaMaker; 15.01.2018, 12:02.

                    Комментарий

                    • #11 Свернуть

                      Сообщение от MonyaMaker Посмотреть сообщение
                      Алексей, дальше, однозначно сетевая поддержка.

                      Направление:
                      Логи по ошибкам кода.
                      Статистический анализ.
                      Другая технологическая информация.

                      Клиент должен чувствовать себя уверенно.

                      Не всегда и не всё, можно вовремя исправить, но успеть иногда можно.
                      Что значит сетевая поддержка? Давайте пожелания высказывать конкретнее, мы же программисты, а не беллетристы Насчет логов - сделаем класс по логгированию, самому надо, до сих пор логи веду в процедурном стиле.
                      Ну и остальное приложится.
                         
                      Женщины продолжают изумлять — обновлено!

                      Комментарий

                      • #12 Свернуть

                        Сообщение от Gold Посмотреть сообщение
                        Обращайтесь в любое время, подкорректирую меню.
                        Спасибо, думаю, раз в неделю будет достаточно.
                           
                        Женщины продолжают изумлять — обновлено!

                        Комментарий

                        • #13 Свернуть

                          Сообщение от VDev Посмотреть сообщение
                          Что значит сетевая поддержка? Давайте пожелания высказывать конкретнее, мы же программисты, а не беллетристы Насчет логов - сделаем класс по логгированию, самому надо, до сих пор логи веду в процедурном стиле.
                          Ну и остальное приложится.
                          Уточняю, это когда вы в одном месте, а код в другом, ну и у кода проблемы, и он шлёт SOS(отчёт о глюках), и Вы сразу на помощь. (Это я про пункт, 5. Что дальше?)
                          Условия использования, то разные.
                          Где-то, код глючит, где-то трейдер, главное, чтобы вовремя успеть.
                          Всеж знают зачем мы здесь.

                          Всё молчу.
                             
                          Последний раз редактировалось MonyaMaker; 15.01.2018, 13:19.

                          Комментарий

                          • #14 Свернуть

                            Продолжим.

                            Структуры, подобные SOrderParams, то есть имеющие в составе только целые и вещественные типы данных, называются простыми. Например, если в состав структуры входит строка или указатель на класс, она теряет невинность и простоту

                            Простые типы структур можно присваивать, при этом данные будут копироваться.
                            PHP код:
                            oparams_local2 oparams_local3
                            Но тут есть важное замечание. Для компилятора идентичными структурами будут структуры одного типа. А тип определяется однозначно по имени типа, компилятор не анализирует, как там структура устроена внутри. Имя другое - все, значит и структура другая. Рассмотрим на примере.
                            PHP код:
                            struct SOrderParams2 // та же структура, что и SOrderParams, но с другим именем типа - для компилятора она не идентична SOrderParams
                            {
                                
                            int ticketcmdslippagemagic;
                                
                            double volumeSendvolumeRealpriceSendpriceRealstoplosstakeprofit;
                            order2_1order2_2orders2[128];


                            SOrderParams oparams_global// глобальная переменная структуры, все поля обнулены 

                            void OnStart()
                            {
                               
                            SOrderParams oparams_local1// локальная переменная структуры, в полях в общем случае может быть мусор от предыдущих вызовов (именно в данном случае не будет, так как однопроходный скрипт)
                               
                            SOrderParams oparams_local2 = {0}; // обнулили все поля принудительно
                               
                            SOrderParams oparams_local3 = {123ORDER_TYPE_SELL/* OP_SELL*/254567890.50.51.254681.254651.258601.25410}; // обнулили все поля принудительно
                               
                            Print(oparams_local2.priceReal",  "oparams_local2.stoploss",  "oparams_local3.magic",  "oparams_local3.stoploss);
                               
                               
                            oparams_local2 oparams_local3;
                            //   order2_1 = oparams_local2; // ошибка компиляции 'operator=' - illegal operation use    Structures.mq5    30    13


                            Структуры разных типов можно копировать только отдельно по полям
                            PHP код:
                            //   order2_1 = oparams_local2; // ошибка компиляции 'operator=' - illegal operation use    Structures.mq5    30    13
                            // поэтому копируем по полям
                                
                            order2_1.cmd oparams_local2.cmd;
                                
                            order2_1.magic oparams_local2.magic;
                                
                            order2_1.priceReal oparams_local2.priceReal;
                                
                            order2_1.priceSend oparams_local2.priceSend;
                                
                            // и так далее 
                               
                            Женщины продолжают изумлять — обновлено!

                            Комментарий

                            • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                            • #15 Свернуть

                              Наверняка у вас возник вопрос, - отлично, можно присваивать структуры. А как с другими арифметическими операциями? Они тоже возможны, но их надо реализовывать руками, через механизм перегрузки операций. Рассмотрим сам принцип на примере комплексных чисел.
                              Объявим тип структуры SComplex
                              PHP код:
                              struct SComplex 

                                  
                              double            re// действительная часть 
                                  
                              double            im// мнимая часть 
                              }; 
                              Не все знают, но в структуры можно вставлять функции. Такие функции на жаргоне программистов принято называть методами. Напоминаю, для структур и классов переменные - поля, функции - методы. Наверное, это исторически было сделано для простоты восприятия, если я говорю, метод такой-то, то ясно, что надо искать его в структуре или классе, а на в обычном процедурном коде. Добавим методы для арифметики. Начнем с метода сложения вдух комплексных чисел, разберем его и потом добавим остальные операции.
                              PHP код:
                              struct SComplex 

                                  
                              double            re// действительная часть 
                                  
                              double            im// мнимая часть 
                                  
                              complex Add(const complex &l,const complex &r) const  // сложение 
                                  
                              {
                                      
                              complex res
                                      
                              res.re=l.re+r.re
                                      
                              res.im=l.im+r.im
                                      return 
                              res
                                  }
                              }; 
                              На вход функции поступают два комплексных числа l и r.
                              PHP код:
                              const complex &l,const complex &
                              Что означает значок & амперсанд? (на клавиатуре с цифрой 7). Он означает, что переменная передается по ссылке, а не по значению. Давайте сразу разберем это подробнее, т.к. как показывает практика, многие не понимают, что это такое.
                                 
                              Женщины продолжают изумлять — обновлено!

                              Комментарий

                              Сейчас онлайн

                              working...
                              X