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

Показаны сообщения: с 21 по 40 из 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. Bitcoin
  4. Линк#25
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,545
    Деньги за посты (Подробнее):
    50889 RUB
    Поставил лайков:
    270
    Получено лайков:  582
    в 527 сообщениях
    38%
    Приступаем к практическим заданиям?


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

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

  6. Линк#26
    Частый гость
    Krypton, хорошая репутация Krypton, хорошая репутация Krypton, хорошая репутация Аватар для Krypton,
    Регистрация:
    10.09.2017
    Пол:
    Мужчина
    Сообщений:
    187
    Деньги за посты (Подробнее):
    11495 RUB
    Поставил лайков:
    308
    Получено лайков:  281
    в 123 сообщениях
    150%
    Парень молодец, мне , чтобы первые посты понять, пришлось статьи по математике штудировать. Для начинающих ,говоришь сложновато, но тема нужная, продолжайте, Будем благодарны

    Только , если, Вы с MQL5, зря надеетесь на дисциплину здесь, и алгоритмическое мышление) Но грамотные пацаны здесь есть, некоторые уже отписались в теме)

    Последний раз редактировалось Krypton,; 28.01.2018 в 04:28.

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

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

  8. Линк#27
    Знающий
    Очень рад
     
    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 - да, будем переходить к практике
    Krypton - математика вообще не нужна )) насчет дисциплины - тут меньше визгов, чем на форуме mql5
    ----------------------------
    Вроде писал ранее, разработаем класс по управлению сеткой ордеров. Навскидку задачи будут такие:
    1. Клас будет мультиплатформенный, по MQL4 и MQL5
    2. Выставление одиночного рыночного ордера (МТ4), открытие позиции (МТ5) со всеми проверками
    3. то же самое для отложенных ордеров
    4. Открытие сетки рыночных ордеров/позиций с заданным шагом изменения цены
    5. Открытие сетки отложенных ордеров с заданным шагом
    6. Закрытие отдельного ордера/позиции с проверками
    7. Установка SL и TP для рыночного ордера/позиции
    8. Работа с сеткой, какая конкретно - выясним в процессе
    Коды я буду выкладывать на GitHub, чтобы было всем доступно и комментировать здесь. Для МТ5 буду по максимуму использовать Стандартную библиотеку, чтобы не изобретать велосипеды. Для МТ4 в СБ нет торговых классов, так что придется писать их ручками.
    Набросал упрощенную схему хранения ордеров.
    paperclip Рисунок attachment1800749 


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

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

  10. Линк#28
    Знающий
    Очень рад
     
    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%
    Для начала напишем класс CAvOpder для хранения данных единичного ордера. Он будет входить в основной класс CGridOrderManager, который будет хранить множество ордеров в ассоциативном массиве.
    Как я говорил, код будет мультиплатформенный, то есть в зависимости от того, в какой файл, .mq4 или mq5 будет включен .mqh с классом, под такую платформу и будет произведена компиляция.
    Привожу предварительную версию класса, потом подробно разберем who is who. Исходные тексты доступны на https://***********/VDev64/gridordermanager

    PHP код:
    #ifdef __MQL5__
    #include
    #endif


    class CAvOrder : public CObject
    {
    #ifdef __MQL5__
    CTrade m_trade;
    #endif

    #ifdef __MQL4__
    protected:
    const
    int m_ticket;
    const
    string m_symbol;
    const
    int m_magic;
    const
    int m_cmd;
    const
    datetime m_openTime;
    const
    double m_openPrice;
    const
    double m_lot;
    CAvOrder(){ }
    public:
    double m_stoploss;
    double m_takeProfit;
    datetime m_closeTime;
    double m_closePrice;
    double m_profit;
    double m_swap;
    double m_comission;
    datetime m_expiration;
    string m_comment;

    CAvOrder(int ticket, string symbol, int cmd, double lot, double price, datetime openTime, int magic = 0, double stoploss = 0,
    double takeprofit = 0, string comment = NULL, datetime expiration = 0, color arrow_color=CLR_NONE) :
    m_ticket(ticket), m_symbol(symbol), m_magic(magic), m_cmd(cmd), m_openTime(openTime), m_openPrice(price), m_lot(lot)
    {
    SetParams(stoploss, takeprofit, comment, expiration);
    }

    ~
    CAvOrder(){}

    void GetStableParams(int& ticket, string& symbol, int& magic, int& cmd, datetime& openTime, double& openPrice, double& lot)
    {
    ticket = m_ticket;
    symbol = m_symbol;
    magic = m_magic;
    cmd = m_cmd;
    openTime = m_openTime;
    openPrice = m_openPrice;
    lot = m_lot;
    }

    void SetParams(double stoploss = 0, double takeprofit = 0, string comment = NULL, datetime expiration = 0)
    {
    m_stoploss = stoploss;
    m_takeProfit = takeprofit;
    m_comment = comment;
    m_expiration = expiration;
    }
    #endif
    };

    Последний раз редактировалось VDev; 16.02.2018 в 11:00.

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

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

  12. Линк#29
    Знающий
    Очень рад
     
    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 практически идентичны, а вот API во многих местах отличаются. В основном это торговые функции, доступ к таймфреймам и работа с индикаторами. В программной среде определены дефайны, указывающие на тип терминала, _MQL4_ и _MQL5_. В первой строке видно, как это использовать
    PHP код:
    #ifdef __MQL5__ //если определен такой дефайн, компилируем под MQL5
    #include
    #endif
    Я решил для MQL5 использовать стандартную библиотеку. Во первых, это упростит разработку, во вторых, вы познакомитесь с ее использованием. В МТ4 тоже есть СБ, но в ней нет многого, что есть в МТ5, в частности, торговых функций, так что там будем писать код ручками.


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

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

  14. Линк#30
    Знающий
    Очень рад
     
    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%
    Объявляем класс, обратите внимание, что он наследуется от стандартного CObject с модификатором доступа public. Это означает отсутствие ограничений при наследовании. Сам класс CObject служит единственной цели - быть родителем для всех остальных классов. Немного позже будет понятно, зачем вообще нужно какое-то наследование.

    PHP код:
    class CObject
    {
    private:
    CObject *m_prev; // previous item of list
    CObject *m_next; // next item of list

    public:
    CObject(void): m_prev(NULL),m_next(NULL) { }
    ~
    CObject(void) { }
    //--- methods to access protected data
    CObject *Prev(void) const { return(m_prev); }
    void Prev(CObject *node) { m_prev=node; }
    CObject *Next(void) const { return(m_next); }
    void Next(CObject *node) { m_next=node; }
    //--- methods for working with files
    virtual bool Save(const int file_handle) { return(true); }
    virtual bool Load(const int file_handle) { return(true); }
    //--- method of identifying the object
    virtual int Type(void) const { return(0); }
    //--- method of comparing the objects
    virtual int Compare(const CObject *node,const int mode=0) const { return(0); }
    };
    Как видно, практически это класс-заготовка, который нельзя использовать напрямую, только для наследования. Если вы не знаете, что такое виртуальные функции (virtual перед названием), упрощенно считайте, что это заготовки, которые будут реализованы в потомках. Или не реализованы, если нет нужды.

    Итак, объявляем шапку нашего класса. Сейчас реализован некоторый код для MQL4, который находится в секции ниже
    PHP код:
    #ifdef __MQL4__
    Все, что находится в секции protected, не будет видно снаружи, эти данные видны только внутри класса. И обратите внимание, эти 6 полей я сделал еще и константными, то есть они задаются один раз при создании экземпляра класса и потом их уже нельзя изменить никакими путями. Почему так? Да потому, что и в реале эти данные у открытого ордера/позиции поменять после открытия нельзя.
    Кстати, в предыдущем посте я ошибся и запихнул туда сгоряча и размер лота, это неправильно, я закомментировал.
    PHP код:
    //const double m_lot;
    PHP код:
    class CAvOrder : public CObject
    {
    #ifdef __MQL5__
    CTrade m_trade;
    #endif

    #ifdef __MQL4__
    protected:
    const
    int m_ticket;
    const
    string m_symbol;
    const
    int m_magic;
    const
    int m_cmd;
    const
    datetime m_openTime;
    const
    double m_openPrice;
    //const double m_lot;
    CAvOrder(){ }
    public:


  15. post_thanks Получено лайков: 6

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

  16. Линк#31
    Знающий
    Очень рад
     
    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 код:
    class A : public CObject
    {
    protected:
    int m_field1;
    double m_field2;
    public:
    A(int f1, double f2) // конструктор N 1
    {
    m_field1 = f1; // Поля инициируются внутри конструктора
    m_field2 = f2;
    }

    // А в этом конструкторе поля m_field1, m_field2 инициируются ДО вызова конструктора. Чтобы различать эти конструкторы, я добавил в параметры переменную select
    A(int f1, double f2, bool select) : m_field1(f1), m_field2(f2) // конструктор N 2
    {
    }
    }


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

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

  18. Линк#32
    Кандидат форумных наук
    Скромняжка
     
    Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Аватар для Tekora
    Регистрация:
    26.06.2011
    Сообщений:
    1,755
    Деньги за посты (Подробнее):
    33277 RUB
    Поставил(а) лайков:
    211
    Получено лайков:  531
    в 423 сообщениях
    30%
    Цитата Сообщение от VDev Посмотреть сообщение
    как же задать константные значения?
    Очень полезная штука при создании класса индикатора можно задать значения внешних параметров по умолчанию.
    И такой вопрос возник - Почему нельзя задать спецификатор private для константных переменных-членов класса m_ticket, m_symbol, m_magic, m_cmd, m_openTime, m_lot? Наверное хотите от него еще один класс сделать наследником?
    П.С. Посмотрел код AvOrder.mqh, любезно выложенный Вами на ***********. Там только для MQL5 класс написан? Сам файл не компилируется в метаэдиторе для MT4. Отсутствует определение родительского класса CObject.


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

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

  20. Линк#33
    Знающий
    Очень рад
     
    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%
    Цитата Сообщение от Tekora Посмотреть сообщение
    Очень полезная штука при создании класса индикатора можно задать значения внешних параметров по умолчанию.
    И такой вопрос возник - Почему нельзя задать спецификатор private для константных переменных-членов класса m_ticket, m_symbol, m_magic, m_cmd, m_openTime, m_lot? Наверное хотите от него еще один класс сделать наследником?
    П.С. Посмотрел код AvOrder.mqh, любезно выложенный Вами на ***********. Там только для MQL5 класс написан? Сам файл не компилируется в метаэдиторе для MT4. Отсутствует определение родительского класса CObject.
    Да, можно и private, просто как-то привык не закрывать полностью члены, пока все окончательно не устаканилось. Пока код как раз для MQL4, для MQL5 дописываю. Кстати, для МТ4 можно компилировать из под МТ5 Editor. Но так как файл .mqh, надо сделать какую-нибудь пустышку .mq4 и включить его туда. Тогда Metaeditor переключит компилятор на четверочный.
    Спасибо за замечание, упустил. Надо явно подключить файл
    PHP код:
    #include
    Вставить в самый верх файла.


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

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

  22. Линк#34
    Знающий
    Очень рад
     
    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 код:
    CAvOrder(int ticket, string symbol, int cmd, double lot, double price, datetime openTime, int magic = 0, double stoploss = 0,
    double takeprofit = 0, string comment = NULL, datetime expiration = 0, color arrow_color=CLR_NONE) :
    m_ticket(ticket), m_symbol(symbol), m_magic(magic), m_cmd(cmd), m_openTime(openTime), m_openPrice(price)
    {
    SetParams(lot, stoploss, takeprofit, comment, expiration);
    }
    В принципе, по части MQL4 больше говорить нечего, допишу часть MQL5, немного по ней и начнем уже разрабатывать сам CGridOrderManager, там будет поинтереснее


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

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

  24. Линк#35
    Знающий
    Очень рад
     
    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, теперь можно считывать параметры непосредственно из открытого ордера, вот пример, это публичный метод класса. Перед началом работы с параметрами ордеров надо вызвать Select()
    PHP код:
    bool Select()
    {
    if(
    OrderSelect(m_ticket, SELECT_BY_TICKET))
    return
    true;
    return
    false;
    }

    double StopLoss(bool reread = false )
    {
    if(
    reread)
    m_stoploss = OrderStopLoss();
    return
    m_stoploss;
    }
    Для MQL5 пока просто добавил класс из стандартной библиотеки, чисто для скорости разработки. Потом, когда будет время, сделаю такое же кеширование, как для MQL4.
    В этом классе можно получить все свойства позиции, все очень похоже на работу с ордерами в МТ4.
    PHP код:
    #ifdef __MQL5__
    CPositionInfo* m_positionInfo;
    #endif
    Все коды выложены на GitHub, https://***********/VDev64/gridordermanager

    Приступаю к разработке основного класса.


  25. post_thanks Получено лайков: 4

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

  26. Линк#36
    Кандидат форумных наук
    Все пучком
     
    Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Аватар для Viktor1987
    Регистрация:
    12.10.2013
    Пол:
    Мужчина
    Сообщений:
    1,897
    Деньги за посты (Подробнее):
    29274 RUB
    Поставил лайков:
    755
    Получено лайков:  651
    в 459 сообщениях
    34%
    Цитата Сообщение от VDev Посмотреть сообщение

    А в методе Select() не проще ли:
    PHP код:
    bool Select()
    {
    return
    OrderSelect(m_ticket, SELECT_BY_TICKET)
    }
    и обработка ошибок я так понял будет реализована позже! Не сочтите за наглость , просто давно хотел написать библиотеку для работы с ордерами, а Вы пишете мультиплатформенный код, это ещё круче!


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

    ir0407 (17.02.2018)

  28. Линк#37
    Специалист
    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%
    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    А в методе Select() не проще ли:
    И проще и логичнее. И тикет желательно либо через параметр метода засылать, либо через собственный метод чтения поля, а не опрашивать поле напрямую.


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

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

  30. Линк#38
    Кандидат форумных наук
    Все пучком
     
    Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Аватар для Viktor1987
    Регистрация:
    12.10.2013
    Пол:
    Мужчина
    Сообщений:
    1,897
    Деньги за посты (Подробнее):
    29274 RUB
    Поставил лайков:
    755
    Получено лайков:  651
    в 459 сообщениях
    34%
    Цитата Сообщение от ir0407 Посмотреть сообщение
    И тикет желательно либо через параметр метода засылать, либо через собственный метод чтения поля, а не опрашивать поле напрямую.
    А подробнее? Кака разница между:
    PHP код:
    bool Select()
    {
    return
    OrderSelect(m_ticket, SELECT_BY_TICKET)
    }
    и :
    PHP код:
    //--- метод класса
    int GetTicket()
    {
    return
    m_ticket;
    }
    //--- метод класса
    bool Select()
    {
    return
    OrderSelect(GetTicket(), SELECT_BY_TICKET)
    }
    Я ведь правильно понял фразу:
    Цитата Сообщение от ir0407 Посмотреть сообщение
    либо через собственный метод чтения поля


  31. Линк#39
    Специалист
    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%
    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    А подробнее? Кака разница...
    Поля находятся в закрытой секции. Если в собственном классе прямое обращение к закрытым полям еще прокатит, то в классах наследниках нет. Поэтому для таких вещей и делают геттеры и сеттеры, которые размещают в публичной секции.

    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    Я ведь правильно понял фразу:
    правильно


  32. Линк#40
    Кандидат форумных наук
    Все пучком
     
    Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Аватар для Viktor1987
    Регистрация:
    12.10.2013
    Пол:
    Мужчина
    Сообщений:
    1,897
    Деньги за посты (Подробнее):
    29274 RUB
    Поставил лайков:
    755
    Получено лайков:  651
    в 459 сообщениях
    34%
    Цитата Сообщение от ir0407 Посмотреть сообщение
    Поля находятся в закрытой секции. Если в собственном классе прямое обращение к закрытым полям еще прокатит, то в классах наследниках нет. Поэтому для таких вещей и делают геттеры и сеттеры, которые размещают в публичной секции.
    Аааа... это я знал, но тут вроде как конкретно обращение к полю идёт из собственного класса, поэтому и спросил!


  33. Линк#41
    Специалист
    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%
    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    Аааа... это я знал, но тут вроде как конкретно обращение к полю идёт из собственного класса, поэтому и спросил!
    Тут, как бы, "правила хорошего тона" должны присутствовать.
    1. Функция(метод), по возможности, не должна делать прямых обращений к внешним переменным. Все такие обращения желательно делать через параметры.
    2. Если в классе присутствуют закрытые поля, нужно делать у ним гет/сет-теры, и работать через них, а не делать прямых обращений.


  34. Линк#42
    Знающий
    Очень рад
     
    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 Посмотреть сообщение
    Тут, как бы, "правила хорошего тона" должны присутствовать.
    1. Функция(метод), по возможности, не должна делать прямых обращений к внешним переменным. Все такие обращения желательно делать через параметры.
    2. Если в классе присутствуют закрытые поля, нужно делать у ним гет/сет-теры, и работать через них, а не делать прямых обращений.
    С пунктом 2 полностью не согласен. Чтобы не спорить, посмотрите, как написана стандартная библиотека, нет там оверхедных геттеро-сеттеров для использования внутренних переменных класса. Для внешнего доступа да, нужно.
    Второе - этот класс не будет использоваться самостоятельно, только в составе CGridOrderManager. И третье - можно все расписать красиво, убив кучу времени. Но мне лично нужен быстрый результат для своего проекта. Когда он будет, подумаем о красоте.

    Байка в тему Как-то давно главу Sony спросили, вы делаете лучшую аудиотехнику, почему вы не сделаете лучший в мире магнитофон?
    - Потому, что пока мы будем делать самый лучший в мире магнитофон, конкуренты выпустят десятки просто хороших.


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

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

  36. Линк#43
    Знающий
    Очень рад
     
    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%
    Цитата Сообщение от Viktor1987 Посмотреть сообщение

    Я всегда рад полезным замечаниям Да, так Select чуть проще, поправил. Я же пишу быстро и не всегда оптимально. Насчет обработки ошибок - а какие уже нужно обрабатывать?


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

    Viktor1987 (18.02.2018)

    <a href="https://www.instaforex.com/ru/pamm_system">Форекс портал</a>
  38. Линк#44
    Специалист
    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 Посмотреть сообщение
    С пунктом 2 полностью не согласен.
    Дык я же не настаиваю... Это просто "правила хорошего тона", не более того. А так... Каждый делает в меру своих убеждений.

    Цитата Сообщение от VDev Посмотреть сообщение
    Чтобы не спорить, посмотрите, как написана стандартная библиотека, нет там оверхедных геттеро-сеттеров для использования внутренних переменных класса.
    Да там и смотреть-то не на что... Такое впечатление, что писал ее не программист, а какой-то доморощенный кулибин-недоучка, на коленке, в перерывах между затяжками забористой травы.


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

    Leschich (18.02.2018), Viktor1987 (18.02.2018)


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

Похожие темы

  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