Заработай до
50000$
на приглашении друзей
получить StartUp Bonus
от ИнстаФорекс
Вложений не требуется!
Начни торговлю
без вложений и риска
С новым STARTUP бонусом 1000$
Получи бонус
55%
от ИнстаФорекс
на каждое пополнение
Ответить в теме
Страница 1 из 13
1 2 11 ... Последняя ◄╝

Показаны сообщения: с 1 по 20 из 253

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

 Перейти в классический вид темы
     
  1. ТОП сообщений
    2018-01-14   22:44
    Лучший ответ #1
    Накопленные выплаты 98862 RUB

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

    2018-01-16   03:47
    Лучший ответ #2
    Накопленные выплаты 98862 RUB

    Ну что, начнем осваивать классы. С вашего позволения я сделаю для начала небольшой лирический отступ. Среди новичков есть мнение, что классы - это очень сложно, что понять смысл ООП может только профессиональный программист и т.д. Заявляю с полной ответственностью - это полная ерунда. Как обычно, я всему учу на своем примере. Я по образованию вообще электронщик, программирование освоил самостоятельно. Тем не менее за душой куча проектов, как для России, так и по аутсортингу. Так что прочь сомнения, день-другой, и вы поймете, как работают классы! -------------- Итак, для учебных целей придумаем простенькую структуру struct SSimple1 { int ticket; double profit; }; Как нам преобразовать ее в класс? Элементарно, Ватсон! Заменяем слово struct на class class CSimple1 { int ticket; double profit; }; И пишем проверочный код. Да, друзья, чтобы чему-то научиться, надо писать код. Самому. Ручками. Читать мои посты недостаточно. Так что пиво в сторону, открывайте редактор MQL4 или 5 и пишем скрипт. void OnStart() { SSimple1 ss1; CSimple1 cs1; ss1.ticket = 123; cs1. // заметили, что после точки у вас не развернулся список из 2-х переменных? // попробуйте насильно вбить cs1.ticket = 123; // получите ошибку компиляции. Что делать, щеф?? Дело в том, что классы исторически произошли от структур, по крайней мере в Си-подобных языках. И если в структуре все ее члены, методы(функции) и поля(переменные) открыты внешнему миру, то в классах есть три уровня защиты, это уровни private, protected, public. Начнем с самого "доброго" уровня - с public Все, что находится в секции public, видно окружающему миру так же, как и все, что есть в структуре. Делаем эксперимент. class CSimple1 { public: // объявили секцию, где все будет доступно снаружи int ticket; double profit; }; И еще раз прогоняем OnStart. Обратите внимание, после печатанья точки cs1. у вас вдруг стал доступен список из 2-х переменных? Это компилер увидел секцию public и решил, что теперь вы имеете доступ к этим двум переменным. Далее разберемся с правами доступа поглубже и перейдем к наследованию. Потом забубеним что-то практическое, желательно мультиплатформенное, для мт4 и мт5 одновременно. ---------------------------------------- Друзья, Дамы и Господа. Я буду все больше давать практических заданий, очень рекомендую не просто читать эти посты, а делать их. Времени это будет занимать немного, но у вас наработается практика. Тупое чтение никогда ничего не дает. В этой жизни надо действовать, а не тупо читать!

    2018-07-19   20:34
    Лучший ответ #3
    Накопленные выплаты 27419 RUB

    полуавтомат хочу, и в тестере хочу погонять его, лень писать 2 версии (тестер/реал), надеюсь решить проблему имитации в тестере событий мыши полуавтомат хочу в виде панели, в которой можно чекбоксом выделить необходимый ордер и перевести этот ордер в отдельное сопровождение (доливки, трал, усреднение и пр.), а сам советник будет выставлять ордера по основному алгоритму - вот такая вот идея

    2018-01-15   00:53
    Лучший ответ #4
    Накопленные выплаты 98862 RUB

    У нас в процессе торговли может быть множество открытых и отложенных ордеров. Конечно, можно было бы тупо сделать каждый параметр динамическим массивом массивом, но представьте все неудобства такого подхода. При каждом увеличении количество ордеров сверх размера массива надо его менять для каждого параметра. И вопрос, что делать с дырами, которые получаются на месте закрытых ордеров? int ticket[], cmd[], slippage[], magic[]; double volumeSend[], volumeReal[], priceSend[], priceReal[], stoploss[], takeprofit[]; Гораздо проще и красивее упаковать все параметры в контейнер, который называется структурой. Для того, чтобы использовать структуру, надо сначала объявить ее тип. Это делается один раз и в дальнейшем мы можем создавать экземпляры этой структуры, или говоря по другому переменные типа объявленной структуры. struct SOrderParams // объявили имя типа. Теперь в программе помимо стандартных типов int, double и др. появился наш пользовательский тип структуры с именем SOrderParams { int ticket, cmd, slippage, magic; double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit; }; Допускается после объявления типа сразу же создавать переменные этой структуры struct SOrderParams // объявили имя типа. Теперь в программе помимо стандартных типов int, double и др. появился наш пользовательский тип структуры с именем SOrderParams { int ticket, cmd, slippage, magic; double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit; } order1, order2, orders;

    2018-01-15   13:22
    Лучший ответ #5
    Накопленные выплаты 98862 RUB

    Продолжим. Структуры, подобные SOrderParams, то есть имеющие в составе только целые и вещественные типы данных, называются простыми. Например, если в состав структуры входит строка или указатель на класс, она теряет невинность и простоту Простые типы структур можно присваивать, при этом данные будут копироваться. oparams_local2 = oparams_local3; Но тут есть важное замечание. Для компилятора идентичными структурами будут структуры одного типа. А тип определяется однозначно по имени типа, компилятор не анализирует, как там структура устроена внутри. Имя другое - все, значит и структура другая. Рассмотрим на примере. struct SOrderParams2 // та же структура, что и SOrderParams, но с другим именем типа - для компилятора она не идентична SOrderParams { int ticket, cmd, slippage, magic; double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit; } order2_1, order2_2, orders2; SOrderParams oparams_global; // глобальная переменная структуры, все поля обнулены void OnStart() { SOrderParams oparams_local1; // локальная переменная структуры, в полях в общем случае может быть мусор от предыдущих вызовов (именно в данном случае не будет, так как однопроходный скрипт) SOrderParams oparams_local2 = {0}; // обнулили все поля принудительно SOrderParams oparams_local3 = {123, ORDER_TYPE_SELL/* OP_SELL*/, 25, 456789, 0.5, 0.5, 1.25468, 1.25465, 1.25860, 1.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 } Структуры разных типов можно копировать только отдельно по полям // 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; // и так далее

    2018-01-14   23:25
    Лучший ответ #6
    Накопленные выплаты 98862 RUB

    Курс будет рассчитан на людей, знакомых с программирование на MQL4/5, но не владеющих ООП. То есть я не буду объяснять, что такое циклы, функции и т.д. Смело задавайте вопросы в рамках темы, обязательно всем отвечу. Огромная просьба не скатываться во флейм и не устраивать священные войны а-ля "ООП vs процедурное программирование", именно из-за флейма я ушел с форума разработчиков Metatrader и пришел сюда. Надеюсь, тут народ подисциплинированнее, а модераторы построже В первых постах возможны ошибки с кодами оформления, т.к. нет особого опыта на этом движке, прошу указывать и поправлять. ------ Поехали! ------- Начну с того, что, вопреки ошибочному мнению, языки MQL4 и MQL5 практически одинаковы, поэтому все, что касается ООП, будет работать и там и там. Отличия касаются только API (application program interface - программный интерфейс приложений), это торговые функции, работа с таймсериями, индикаторами и т.д. Но сами языки идентичны. Основная цель структуры - упаковать набор разнородных данных в единый контейнер. Например, имеем набор переменных int ticket, cmd, slippage, magic; double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit; Как вы поняли, в них будут хранится параметры открытого ордера (код для MQL4), для MQL5 параметры будут немного другие. Поэтому я постараюсь писать кросс-платформенный код, как давно делаю в своих роботах. В дальнейшем мы будем разрабатывать класс по управлению сеткой виртуальных ордеров и надо будет как-то хранить параметры сетки и параметры уже открытых ордеров. Для этого будем использовать структуру. Продолжение через 30 минут. !!!!!!!!!!!!!!! почему MQL код не оформился? Подскажите плз, как правильно сделать

  2. Линк#1
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Всем привет!

    Открываю тему по изучению объектно-ориентированного программирования с нуля. Будем использовать языки 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

  3. <a href="https://www.instaforex.com/ru/pamm_system">Форекс портал</a>
  4. Линк#2
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Курс будет рассчитан на людей, знакомых с программирование на MQL4/5, но не владеющих ООП. То есть я не буду объяснять, что такое циклы, функции и т.д. Смело задавайте вопросы в рамках темы, обязательно всем отвечу.
    Огромная просьба не скатываться во флейм и не устраивать священные войны а-ля "ООП vs процедурное программирование", именно из-за флейма я ушел с форума разработчиков Metatrader и пришел сюда. Надеюсь, тут народ подисциплинированнее, а модераторы построже В первых постах возможны ошибки с кодами оформления, т.к. нет особого опыта на этом движке, прошу указывать и поправлять.

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

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

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

    PHP код:
    int ticket, cmd, slippage, magic;
    double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit;
    Как вы поняли, в них будут хранится параметры открытого ордера (код для MQL4), для MQL5 параметры будут немного другие. Поэтому я постараюсь писать кросс-платформенный код, как давно делаю в своих роботах.
    В дальнейшем мы будем разрабатывать класс по управлению сеткой виртуальных ордеров и надо будет как-то хранить параметры сетки и параметры уже открытых ордеров. Для этого будем использовать структуру.

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

    !!!!!!!!!!!!!!! почему MQL код не оформился? Подскажите плз, как правильно сделать

    Последний раз редактировалось Gold; 15.01.2018 в 07:14. Причина: ошибка в оформлении MQL кода

  5. post_thanks Получено лайков: 10

    Gold (15.01.2018), LSA (15.01.2018), Незарегистрированный (8 пользователей)

  6. Линк#3
    Специалист
    ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация Аватар для ir0407
    Регистрация:
    02.12.2010
    Сообщений:
    7,061
    Деньги за посты (Подробнее):
    160034 RUB
    Поставил(а) лайков:
    912
    Получено лайков:  7,170
    в 3,425 сообщениях
    102%
    Цитата Сообщение от VDev Посмотреть сообщение
    !!!!!!!!!!!!!!! почему MQL код не оформился? Подскажите плз, как правильно сделать
    Потому что глючит. Походу его пока отключили. Используй теги либо code либо php.


  7. post_thanks Получено лайков: 1

    VDev (15.01.2018)

  8. Линк#4
    Администратор
    Сама доброта
     
    Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Helios наивысший уровень репутации Аватар для Helios
    Регистрация:
    17.12.2009
    Пол:
    Мужчина
    Сообщений:
    56,217
    Поставил лайков:
    36,025
    Получено лайков:  70,842
    в 27,720 сообщениях
    126%
    Цитата Сообщение от VDev Посмотреть сообщение
    И вопрос к модераторам. Хотелось бы сделать меню, чтобы участники могли ориентироваться в разделах темы. Если я сделаю меню в начальных постах, как долго у меня будет доступ на редактирование поста с меню?
    Что вы имеете в виду под "разделами темы" и "начальными постами"?

    Время редактирования поста - 60 минут с момента публикации. При необходимости отредактировать его позже нужно будет обратиться к модераторам.


  9. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  10. Линк#5
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    У нас в процессе торговли может быть множество открытых и отложенных ордеров. Конечно, можно было бы тупо сделать каждый параметр динамическим массивом массивом, но представьте все неудобства такого подхода. При каждом увеличении количество ордеров сверх размера массива надо его менять для каждого параметра. И вопрос, что делать с дырами, которые получаются на месте закрытых ордеров?
    PHP код:
    int ticket[], cmd[], slippage[], magic[];
    double volumeSend[], volumeReal[], priceSend[], priceReal[], stoploss[], takeprofit[];
    Гораздо проще и красивее упаковать все параметры в контейнер, который называется структурой. Для того, чтобы использовать структуру, надо сначала объявить ее тип. Это делается один раз и в дальнейшем мы можем создавать экземпляры этой структуры, или говоря по другому переменные типа объявленной структуры.
    PHP код:
    struct SOrderParams // объявили имя типа. Теперь в программе помимо стандартных типов int, double и др. появился наш пользовательский тип структуры с именем SOrderParams
    {
    int ticket, cmd, slippage, magic;
    double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit;
    };
    Допускается после объявления типа сразу же создавать переменные этой структуры
    PHP код:
    struct SOrderParams // объявили имя типа. Теперь в программе помимо стандартных типов int, double и др. появился наш пользовательский тип структуры с именем SOrderParams
    {
    int ticket, cmd, slippage, magic;
    double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit;
    }
    order1, order2, orders[128];

    Последний раз редактировалось VDev; 15.01.2018 в 01:25.

  11. post_thanks Получено лайков: 13

    BrownAleks (02.05.2018), Gold (15.01.2018), SimpleJeka1487 (16.02.2018), Viktor1987 (15.01.2018), voinG (13.01.2020), Алёна300394 (18.10.2018), Незарегистрированный (7 пользователей)

  12. Линк#6
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Цитата Сообщение от Helios Посмотреть сообщение
    Что вы имеете в виду под "разделами темы" и "начальными постами"?

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

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

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


  13. post_thanks Получено лайков: 1

    Незарегистрированный (1 пользователь)

  14. Линк#7
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Цитата Сообщение от ir0407 Посмотреть сообщение
    Потому что глючит. Походу его пока отключили. Используй теги либо code либо php.
    Спасибо, так работает


  15. Линк#8
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Вообще, если вы посмотрите различные исходники, например Стандартной Библиотеки (\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 ticket, cmd, slippage, magic;
    double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit;
    }
    order1, order2, orders[128];

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

    void OnStart()
    {
    SOrderParams oparams_local1; // локальная переменная структуры, в полях в общем случае может быть мусор от предыдущих вызовов (именно в данном случае не будет, так как однопроходный скрипт)
    SOrderParams oparams_local2 = {0}; // обнулили все поля принудительно
    SOrderParams oparams_local3 = {123, ORDER_TYPE_SELL/* OP_SELL*/, 25, 456789, 0.5, 0.5, 1.25468, 1.25465, 1.25860, 1.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.

  16. post_thanks Получено лайков: 10

    Gold (15.01.2018), Viktor1987 (15.01.2018), vitasza (04.02.2018), work2it (31.01.2018), Незарегистрированный (6 пользователей)

  17. Линк#9
    Модератор
    no
     
    Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Gold наивысший уровень репутации Аватар для Gold
    Регистрация:
    21.12.2010
    Пол:
    Мужчина
    Сообщений:
    19,119
    Поставил лайков:
    22,817
    Получено лайков:  19,603
    в 8,774 сообщениях
    103%
    Цитата Сообщение от VDev Посмотреть сообщение
    Мне хотелось бы сделать меню, в котором будут ссылки на страницы этой темы, где будут освещаться разные вопросы. Например

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

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

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


  18. Линк#10
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,545
    Деньги за посты (Подробнее):
    50889 RUB
    Поставил лайков:
    270
    Получено лайков:  582
    в 527 сообщениях
    38%
    Цитата Сообщение от VDev Посмотреть сообщение
    Всем привет!
    Краткий план курса
    • Что дальше?
    Алексей, дальше, однозначно сетевая поддержка.

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

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

    Не всегда и не всё, можно вовремя исправить, но успеть иногда можно.

    Последний раз редактировалось MonyaMaker; 15.01.2018 в 12:02.

  19. post_thanks Получено лайков: 3

    Незарегистрированный (3 пользователя)

  20. Линк#11
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    Алексей, дальше, однозначно сетевая поддержка.

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

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

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


  21. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  22. Линк#12
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Цитата Сообщение от Gold Посмотреть сообщение
    Обращайтесь в любое время, подкорректирую меню.
    Спасибо, думаю, раз в неделю будет достаточно.


  23. Линк#13
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,545
    Деньги за посты (Подробнее):
    50889 RUB
    Поставил лайков:
    270
    Получено лайков:  582
    в 527 сообщениях
    38%
    Цитата Сообщение от VDev Посмотреть сообщение
    Что значит сетевая поддержка? Давайте пожелания высказывать конкретнее, мы же программисты, а не беллетристы Насчет логов - сделаем класс по логгированию, самому надо, до сих пор логи веду в процедурном стиле.
    Ну и остальное приложится.
    Уточняю, это когда вы в одном месте, а код в другом, ну и у кода проблемы, и он шлёт SOS(отчёт о глюках), и Вы сразу на помощь. (Это я про пункт, 5. Что дальше?)
    Условия использования, то разные.
    Где-то, код глючит, где-то трейдер, главное, чтобы вовремя успеть.
    Всеж знают зачем мы здесь.

    Всё молчу.

    Последний раз редактировалось MonyaMaker; 15.01.2018 в 13:19.

  24. post_thanks Получено лайков: 2

    Незарегистрированный (2 пользователя)

  25. Линк#14
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Продолжим.

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

    Простые типы структур можно присваивать, при этом данные будут копироваться.
    PHP код:
    oparams_local2 = oparams_local3;
    Но тут есть важное замечание. Для компилятора идентичными структурами будут структуры одного типа. А тип определяется однозначно по имени типа, компилятор не анализирует, как там структура устроена внутри. Имя другое - все, значит и структура другая. Рассмотрим на примере.
    PHP код:
    struct SOrderParams2 // та же структура, что и SOrderParams, но с другим именем типа - для компилятора она не идентична SOrderParams
    {
    int ticket, cmd, slippage, magic;
    double volumeSend, volumeReal, priceSend, priceReal, stoploss, takeprofit;
    }
    order2_1, order2_2, orders2[128];


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

    void OnStart()
    {
    SOrderParams oparams_local1; // локальная переменная структуры, в полях в общем случае может быть мусор от предыдущих вызовов (именно в данном случае не будет, так как однопроходный скрипт)
    SOrderParams oparams_local2 = {0}; // обнулили все поля принудительно
    SOrderParams oparams_local3 = {123, ORDER_TYPE_SELL/* OP_SELL*/, 25, 456789, 0.5, 0.5, 1.25468, 1.25465, 1.25860, 1.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;
    // и так далее


  26. post_thanks Получено лайков: 12

    BrownAleks (02.05.2018), Gold (15.01.2018), Viktor1987 (15.01.2018), vitasza (04.02.2018), Алёна300394 (18.10.2018), Незарегистрированный (7 пользователей)

  27. Линк#15
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Наверняка у вас возник вопрос, - отлично, можно присваивать структуры. А как с другими арифметическими операциями? Они тоже возможны, но их надо реализовывать руками, через механизм перегрузки операций. Рассмотрим сам принцип на примере комплексных чисел.
    Объявим тип структуры 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 &r
    Что означает значок & амперсанд? (на клавиатуре с цифрой 7). Он означает, что переменная передается по ссылке, а не по значению. Давайте сразу разберем это подробнее, т.к. как показывает практика, многие не понимают, что это такое.


  28. post_thanks Получено лайков: 8

    Gold (15.01.2018), Viktor1987 (15.01.2018), Незарегистрированный (6 пользователей)

  29. Линк#16
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Передача параметров по значению и по ссылке, модификатор const.

    1. По значению.
    PHP код:
    void OnStart()
    {
    double x = 1.12365, y = 2.57489622, z = -1.545611258;
    double result = Add(x, y, z);
    Print(
    x, ", ", y, ", ", z, ", ", result);
    }

    double Add(double _x, double _y, double _z) // передача параметров по значению
    {
    double r = _x + _y + _z;
    _x*= 2; _y*= 2; _z*= 2; // изменили копии, оригинал этого не заметил
    return r;
    }
    При передаче по значению происходит следущее.
    - в OnStart компилятор создает копии переменных x, y, z и помещает их в особую область памяти, которая называется стек
    - в функции Add эти копии читаются из стека и с ними производятся нужные операции
    - если в Add мы изменим эти копии _x _y _z, то исходные x, y, z в OnStart() останутся неизменными
    Структуры в MQL4/5 нельзя передавать по значению. Почему? А представьте, что у вас структура из 100 полей, половина из которых тоже структуры. Будет тратится слишком много времени на создание копии. Поэтому, учитывая низкий уровень понимания программистов MQL, разработчики и ввели такое ограничение на передачу структур. Их можно передавать только по ссылке, что и рассмотрим в следующем посте.


  30. post_thanks Получено лайков: 7

    BrownAleks (02.05.2018), Gold (15.01.2018), Viktor1987 (15.01.2018), Незарегистрированный (4 пользователя)

  31. Линк#17
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    2. Передача параметров по ссылке

    При передаче по ссылке не происходит копирований переменных. Вместо этого передаются адреса переменных в памяти, а в функции по адресам извлекаются реальные значения. После выполняются какие-то действия и по адресам записываются новые значения переменных. Таким образом, значения исходных переменных меняются. Обозначается знаком амперсанд & между типом и именем переменной, причем амперсанд можно ставить, как угодно, что и показано в примере.
    PHP код:
    void OnStart()
    {
    double x = 1.12365, y = 2.57489622, z = -1.545611258, n = z*2.1;
    // result = AddByRef(x, y, z, 555); // нельзя вместо ссылочной переменной вставлять константу
    AddByRef(x, y, z, n); // нельзя вместо ссылочной переменной вставлять константу
    Print(x, ", ", y, ", ", z, ", ", n)
    }

    void AddByRef(double& _x, double &_y, double & _z, double&_n) // передача параметров по значению
    {
    _x += _y + _z;
    _y = _n-- - ++_y;
    _z = _x *_y;
    }
    Способ еще хорош тем, что мы можем возвращать из функции много значений, а не одно, как в предыдущей функции Add. Надо четко понимать, что если в параметрах функции есть ссылочная переменная, числовую константу там задавать нельзя, будет ошибка компиляции. А вот в случае передачи по значению, в функции Add можно все переменные передать константами.
    PHP код:
    double result = Add(1.23566, -45.45877, 0.0);
    Теперь вернемся к нашим структурам. Как я говорил, они в MQL передаются только по ссылке. И для того, чтобы вы внутри функции сложения случайно не изменили входные структуры, они передаются с модификатором const. Если напишите код, который таки меняет их значения, компилятор вас строго отругает.
    PHP код:
    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;
    }
    А что означает const после заголовка функции? Он означает, что в функции вы не можете изменять поля структуры или класса. То есть имеем полный foolprof, защита от дурака


  32. post_thanks Получено лайков: 8

    Gold (15.01.2018), Viktor1987 (16.01.2018), Незарегистрированный (6 пользователей)

  33. Линк#18
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Добавим оставшиеся 3 арифметических действия и получим следующий код структуры

    PHP код:
    struct complex
    {
    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;
    }

    complex Sub(const complex &l,const complex &r) const // вычитание
    {
    complex res;
    res.re=l.re-r.re;
    res.im=l.im-r.im;
    return
    res;
    }

    complex Mul(const complex &l,const complex &r) const // умножение
    {
    complex res;
    res.re=l.re*r.re-l.im*r.im;
    res.im=l.re*r.im+l.im*r.re;
    return
    res;
    }

    complex Div(const complex &l,const complex &r) const // деление
    {
    complex res = {EMPTY_VALUE, EMPTY_VALUE};
    //--- проверка на ноль
    if(r.re==0 && r.im==0)
    {
    Print(
    __FUNCTION__+": number is zero");
    return(
    res);
    }
    //--- вспомогательные переменные
    double e;
    double f;
    //--- выбор варианта вычисления
    if(MathAbs(r.im)<MathAbs(r.re))
    {
    e = r.im/r.re;
    f = r.re+r.im*e;
    res.re=(l.re+l.im*e)/f;
    res.im=(l.im-l.re*e)/f;
    }
    else
    {
    e = r.re/r.im;
    f = r.im+r.re*e;
    res.re=(l.im+l.re*e)/f;
    res.im=(-l.re+l.im*e)/f;
    }
    //--- результат
    return res;
    }
    };
    В принципе, все должно быть понятно, но пару моментов прокомментирую. В функции деления Div встречается дефайн EMPTY_VALUE, то есть ПУСТОЕ_ЗНАЧЕНИЕ. Логично предположить, что это ноль, но это не так. EMPTY_VALUE имеет значение DBL_MAX, которое, в свою очередь, равно максимальному числу в формате double == 1.7976931348623158e+308.
    В строке
    PHP код:
    Print(__FUNCTION__+": number is zero");
    вместо макроса __FUNCTION__ будет подставлено название функции Div, что очень удобно при отладке программ.
    Функция MathAbs возвращает абсолютное значение числа, грубо говоря, из отрицательного числа делает положительное.

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


  34. post_thanks Получено лайков: 8

    Gold (15.01.2018), Viktor1987 (16.01.2018), vitasza (04.02.2018), Незарегистрированный (5 пользователей)

  35. Линк#19
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Этим сахарком будет перегрузка арифметических операций + - * / для нашей структуры. То есть вместо
    PHP код:
    cm3 = cmp3.Add(cmp1, cmp2);
    можно будет написать в более привычном виде
    PHP код:
    cm3 = cmp1 + cmp2;
    Особенно удобно это при составлении длинных выражений. Попробуйте, например, записать с помощью функций вот такую строку и при этом не увязнуть в открывающих/закрыващих скобках ()
    PHP код:
    complex cmp[4] = {{1.12, 2.33}, {-2.41, -33.21}, {0}, {11.98, 0}};
    cm3 = cmp1 / (cmp2 + cmp[0] * (cmp[3] - cmp[2]/cmp[1]));
    А чтобы овладеть этой магией, нужно всего лишь сообщить другу-компилятору, что если он встретит эти операции применительно к двум комплексным числам, он должен подставить соответствующую функцию. Пишем в самом конце определения complex
    PHP код:
    complex operator+(const complex &r) const { return(Add(this,r)); }
    complex operator-(const complex &r) const { return(Sub(this,r)); }
    complex operator*(const complex &r) const { return(Mul(this,r)); }
    complex operator/(const complex &r) const { return(Div(this,r)); }
    };
    Теперь мы можем использовать комплексные числа, как обычные переменные
    PHP код:
    void OnStart()
    {
    complex cmp1 = {12.33, -45.11};
    complex cmp2 = {1.33, -4.11};
    complex cmp3 = cmp1 + cmp2;
    Print(
    cmp3.re, ", ", cmp3.im);
    }
    На этом мы заканчивает со структурами и переходим к классам. Остались нерассмотренными наследование в структурах и конструкторы. Но я считаю, лучше все это изучить сразу в классах, так как структуры, по большому счету - урезанный по возможностям вариант классов, а я буду подчеркивать различия меджу этими типами данных.

    На последок полный текст структуры complex
    PHP код:
    struct complex
    {
    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;
    }

    complex Sub(const complex &l,const complex &r) const
    {
    complex res;
    res.re=l.re-r.re;
    res.im=l.im-r.im;
    return
    res;
    }

    complex Mul(const complex &l,const complex &r) const
    {
    complex res;
    res.re=l.re*r.re-l.im*r.im;
    res.im=l.re*r.im+l.im*r.re;
    return
    res;
    }

    complex Div(const complex &l,const complex &r) const
    {
    complex res = {EMPTY_VALUE, EMPTY_VALUE};
    //--- проверка на ноль
    if(r.re==0 && r.im==0)
    {
    Print(
    __FUNCTION__+": number is zero");
    return(
    res);
    }
    //--- вспомогательные переменные
    double e;
    double f;
    //--- выбор варианта вычисления
    if(MathAbs(r.im)<MathAbs(r.re))
    {
    e = r.im/r.re;
    f = r.re+r.im*e;
    res.re=(l.re+l.im*e)/f;
    res.im=(l.im-l.re*e)/f;
    }
    else
    {
    e = r.re/r.im;
    f = r.im+r.re*e;
    res.re=(l.im+l.re*e)/f;
    res.im=(-l.re+l.im*e)/f;
    }
    //--- результат
    return res;
    }
    complex operator+(const complex &r) const { return(Add(this,r)); }
    complex operator-(const complex &r) const { return(Sub(this,r)); }
    complex operator*(const complex &r) const { return(Mul(this,r)); }
    complex operator/(const complex &r) const { return(Div(this,r)); }
    };


  36. post_thanks Получено лайков: 9

    Gold (16.01.2018), Viktor1987 (16.01.2018), vitasza (04.02.2018), Незарегистрированный (6 пользователей)

    Crypto
  37. Линк#20
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,253
    Деньги за посты (Подробнее):
    98862 RUB
    Поставил лайков:
    714
    Получено лайков:  2,661
    в 1,551 сообщениях
    82%
    Ну что, начнем осваивать классы. С вашего позволения я сделаю для начала небольшой лирический отступ. Среди новичков есть мнение, что классы - это очень сложно, что понять смысл ООП может только профессиональный программист и т.д. Заявляю с полной ответственностью - это полная ерунда. Как обычно, я всему учу на своем примере.
    Я по образованию вообще электронщик, программирование освоил самостоятельно. Тем не менее за душой куча проектов, как для России, так и по аутсортингу. Так что прочь сомнения, день-другой, и вы поймете, как работают классы!
    --------------
    Итак, для учебных целей придумаем простенькую структуру
    PHP код:
    struct SSimple1
    {
    int ticket;
    double profit;
    };
    Как нам преобразовать ее в класс? Элементарно, Ватсон! Заменяем слово struct на class
    PHP код:
    class CSimple1
    {
    int ticket;
    double profit;
    };
    И пишем проверочный код. Да, друзья, чтобы чему-то научиться, надо писать код. Самому. Ручками. Читать мои посты недостаточно. Так что пиво в сторону, открывайте редактор MQL4 или 5 и пишем скрипт.
    PHP код:
    void OnStart()
    {
    SSimple1 ss1;
    CSimple1 cs1;
    ss1.ticket = 123;
    cs1. // заметили, что после точки у вас не развернулся список из 2-х переменных?
    // попробуйте насильно вбить
    cs1.ticket = 123; // получите ошибку компиляции. Что делать, щеф??
    Дело в том, что классы исторически произошли от структур, по крайней мере в Си-подобных языках. И если в структуре все ее члены, методы(функции) и поля(переменные) открыты внешнему миру, то в классах есть три уровня защиты, это уровни private, protected, public.

    Начнем с самого "доброго" уровня - с public Все, что находится в секции public, видно окружающему миру так же, как и все, что есть в структуре. Делаем эксперимент.
    PHP код:
    class CSimple1
    {
    public:
    // объявили секцию, где все будет доступно снаружи
    int ticket;
    double profit;
    };
    И еще раз прогоняем OnStart. Обратите внимание, после печатанья точки cs1. у вас вдруг стал доступен список из 2-х переменных? Это компилер увидел секцию public и решил, что теперь вы имеете доступ к этим двум переменным.

    Далее разберемся с правами доступа поглубже и перейдем к наследованию. Потом забубеним что-то практическое, желательно мультиплатформенное, для мт4 и мт5 одновременно.
    ----------------------------------------
    Друзья, Дамы и Господа. Я буду все больше давать практических заданий, очень рекомендую не просто читать эти посты, а делать их. Времени это будет занимать немного, но у вас наработается практика. Тупое чтение никогда ничего не дает. В этой жизни надо действовать, а не тупо читать!

    Последний раз редактировалось VDev; 16.01.2018 в 03:54.

  38. post_thanks Получено лайков: 16

    BrownAleks (02.05.2018), Gold (17.01.2018), Tekora (19.01.2018), Viktor1987 (16.01.2018), Алёна300394 (18.10.2018), Незарегистрированный (11 пользователь)


Страница 1 из 13
1 2 11 ... Последняя ◄╝

Похожие темы

  1. MQL4 для начинающих
    от Nick'Otin в разделе MQL-программирование, АТС
    Replies: 2400
    Последнее сообщение: 18.12.2019, 21:16
  2. Программирование MQL4/MQL5, для начинающих, в вопросах и ответах.
    от Aleksandr Bereznyak в разделе MQL-программирование, АТС
    Replies: 55
    Последнее сообщение: 01.05.2019, 10:13
  3. Баги и ошибки в MQL4 и MQL5
    от Mihey85 в разделе MQL-программирование, АТС
    Replies: 2
    Последнее сообщение: 06.03.2016, 18:25
  4. Бесплатный курс для начинающих трейдеров
    от bogo в разделе Доска объявлений
    Replies: 31
    Последнее сообщение: 09.08.2013, 16:01
  5. mql4->mql5. ищу программиста
    от artemserebryakov в разделе Доска объявлений
    Replies: 0
    Последнее сообщение: 28.07.2011, 22:24