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

Показаны сообщения: с 41 по 60 из 250

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

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

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

    2018-01-16   03:47
    Лучший ответ #2
    Накопленные выплаты 98800 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
    Накопленные выплаты 98800 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
    Накопленные выплаты 98800 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
    Накопленные выплаты 98800 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,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    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. Bjorndalen
  4. Линк#45
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Цитата Сообщение от ir0407 Посмотреть сообщение
    Дык я же не настаиваю... Это просто "правила хорошего тона", не более того. А так... Каждый делает в меру своих убеждений.


    Да там и смотреть-то не на что... Такое впечатление, что писал ее не программист, а какой-то доморощенный кулибин-недоучка, на коленке, в перерывах между затяжками забористой травы.
    Ну хорошо, посмотрите исходники .NET, они в свободном доступе на сайте MS, тоже нет там такого. Свойства (для C#) используются в основном для общения с внешним миром, но не внутри класса для доступа к его переменным. На этом обсуждение предлагаю закончить


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


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

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

  7. Линк#47
    Специалист
    ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация Аватар для ir0407
    Регистрация:
    02.12.2010
    Сообщений:
    7,060
    Деньги за посты (Подробнее):
    159751 RUB
    Поставил(а) лайков:
    912
    Получено лайков:  7,170
    в 3,425 сообщениях
    102%
    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    Ну например при выборе ордера через OrderSelect() может тупо отсутствовать связь с сервером, нужно дождаться её восстановления и попробовать снова
    Для OrderSelect() наличие связи не имеет значения и ошибки связи она не возвращает.


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


  9. Линк#49
    Специалист
    ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация ir0407 отличная репутация Аватар для ir0407
    Регистрация:
    02.12.2010
    Сообщений:
    7,060
    Деньги за посты (Подробнее):
    159751 RUB
    Поставил(а) лайков:
    912
    Получено лайков:  7,170
    в 3,425 сообщениях
    102%
    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    Разве запрос идёт не на сервер брокера?
    Нет. Только к списку имеющемуся в терминале. Доступа к манипуляции этим списком в MQL нет. И этот список обновляет только терминал, по собственным алгоритмам и по мере необходимости.


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

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

  11. Линк#50
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    Ну например при выборе ордера через OrderSelect() может тупо отсутствовать связь с сервером, нужно дождаться её восстановления и попробовать снова, а вот если такой тикет не существует это другое дело! Ну и другие!
    Не зря говорят: недоделанную работу дуракам не показывают!!!
    Вот прямо в этом классе ордера и дожидаться? Сколько ждать-то, час, сутки?? А если ордеров десятки? А программа в это время будет висеть, да? Что-то вы странное предлагаете.
    Проверки делаются обычно на глобальном уровне, на уровне советника, но никак не на уровне мелких вспомогательных классов.


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

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

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


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

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

  15. Линк#52
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    Я не предлогал алгоритм реализации! Но если связи с сервером нет, то хоть на глобальном, хоть на орбитальном уровне!
    Если мы программисты, давайте говорить четко и конкретно, а не на уровне беллетристики. В классе CAvOrder таких проверок не будет.
    ----------------------------------

    Теперь по классу CGridOrderManager. Указатели на экземпляры класса CAvOrder будут хранится в хеш-таблице, еще ее называют ассоциативный массив. Что это такое и чем этот класс хорош для хранения ордеров?
    Каждый элемент хеш-таблицы состоит из двух полей - ключ и значение. Кто работал с базами данных, быстро поймет суть, ключ - это то же самое, что индекс в БД.
    Фактически, в качестве ключа можно использовать числовые или текстовые значения, при этом будем иметь быстрый индексированный поиск и отсутствие недостатков, свойственных обычным массивам. У нас в качестве ключа будет тикет, в качестве значения - указатель на объект CAvOrder.
    Теперь по реализации. Я давно использую вариант от Василия Соколова. Есть еще реализация, которую я не тестировал. И наконец, не так давно в стандартную библиотеку добавили класс \MQL5\Include\Generic\HashMap.mqh. В ближайшее время я протестирую эти три реализации, сравню их по скорости работы и проверю на совместимость с МТ4 (от Соколова совместим). После чего начну разработку класса CGridOrderManager.


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

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

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


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

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

  19. Линк#54
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Пока я тестирую Хеш-таблицы и пишу класс CGridOrderManager, предлагаю ненадолго вернуться к теории, как было указано в начальном плане.

    Абстрактные классы, виртуальные функции

    Абстрактные классы служат одной единственной цели - стать родителем для классов потомков. Для этого в них присутствуют одна или более виртуальных функций - пустышек, которые специально обозначаются символами =0 в конце. Ниже вы видете абстрактный класс, который будет родителем для классов, рисующих на экране прямоугольники, треугольники, эллипсы. На этом простейшем примере мы поймем, что такое виртуальные функции и чем они могут быть полезны.
    PHP код:
    enum EFigure {ENone, ERectangle, ETriangle, Ellipse, EEnd};

    class
    CFigure
    {
    private:
    EFigure m_typeFigure;
    public:
    virtual void Draw() = 0;// абстрактная виртуальная функция
    CFigure() {} // конструктор
    CFigure(EFigure fig) // конструктор
    {
    m_typeFigure = fig;
    }
    ~
    CFigure() {} // деструктор
    };
    Надо четко запомнить - создать экземпляр абстрактного класса нельзя, компилятор будет недоволен. Например:
    PHP код:
    CFigure *fig = new CFigure();
    Получим сообщение об ошибке: 'CFigure' - cannot instantiate abstract class TestVirtualFunction.mq5 36 24
    --------
    продолжение следует...


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

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

  21. Линк#55
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Подумав, я решил не делать простейший пример, а сделать что-то, что можно реально вывести на экран. Так будет нагляднее и в целом веселее
    Поэтому я расширил абстрактный класс, приблизив его к реальности. Заодно, те, кто не имеет опыта работы с графикой, смогут посмотреть на пример.
    PHP код:
    class CFigure
    {
    private:
    long m_chart_id; // идентификатор графика
    string m_name; // имя объекта
    ENUM_OBJECT m_typeFigure; // тип объекта
    int m_sub_window; // индекс окна
    int m_npoints; // количество точек привяззки
    datetime m_times[]; // времена точек привязок
    double m_prices[]; // цены точек привязок
    public:
    virtual void Draw() = 0; // абстрактная виртуальная функция отрисовки
    virtual void CreateFigure() = 0; // абстрактная виртуальная функция создания фигуры
    virtual void MoveFigure(datetime time, double price) = 0; // абстрактная виртуальная функция перемещения фигуры
    CFigure() {} // конструктор по умолчанию
    CFigure(long chart_id, string name, ENUM_OBJECT fig, int sub_window, datetime &times[], double &prices[]) // конструктор c параметрами
    {
    m_chart_id = chart_id;
    m_name = name;
    m_typeFigure = fig;
    m_sub_window = sub_window;
    m_npoints = ArraySize(times);
    ArrayResize(m_times, m_npoints);
    ArrayResize(m_prices, m_npoints);
    for(
    int n = 0; n < m_npoints; n++)
    {
    m_times[n] = times[n];
    m_prices[n] = prices[n];
    }
    }

    void SetParams(long chart_id, string name, ENUM_OBJECT fig, int sub_window, datetime &times[], double &prices[]) // установка параметрров
    {
    m_chart_id = chart_id;
    m_name = name;
    m_typeFigure = fig;
    m_sub_window = sub_window;
    m_npoints = ArraySize(times);
    ArrayResize(m_times, m_npoints);
    ArrayResize(m_prices, m_npoints);
    for(
    int n = 0; n < m_npoints; n++)
    {
    m_times[n] = times[n];
    m_prices[n] = prices[n];
    }
    }

    ~
    CFigure() {} // деструктор
    };
    В следующих сериях будем создавать реальные классы фигур на основе абстрактного родителя.

    Последний раз редактировалось VDev; 20.02.2018 в 15:58.

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

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

  23. Линк#56
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Тут получилось две параллельные темы, которые будут идти немного вразнобой. Как я писал несколько дней назад, я тестирую три реализации хеш-таблиц. Реализация от Metaquotes выдает ошибку поиска, причина неизвестна. Точно такой же код на реализации от Vasiliy Sokolov работает без ошибок, вот результаты теста.

    2018.02.22 11:59:01.455 TestHashTable (EURUSD,M5) Время добавления 10000000 элементов = 15.1775 сек, 1.5178 мкс/объект
    2018.02.22 11:59:05.112 TestHashTable (EURUSD,M5) Время поиска 10000000 элементов = 3.6547 сек, 0.3655 мкс/объект
    2018.02.22 11:59:18.812 TestHashTable (EURUSD,M5) Время удаления 10000000 элементов = 13.6994 сек, 1.3699 мкс/объект

    Исходники хеш-таблицы (ассоциативный массив) в конце статьи. https://www.mql5.com/ru/articles/1334#summary

    PHP код:
    #include
    #include "AvOrder.mqh"
    #property script_show_inputs

    input int PassCount = 10000000;

    void OnStart()
    {
    //CheckHashMap();
    CheckDictVS();
    //CheckDictEL();
    }

    void CheckDictVS()
    {
    CDictionary *hmap = new CDictionary();
    CAvOrder * order = new CAvOrder;
    static
    ulong start, stop;
    start = GetMicrosecondCount();
    for(
    int n = 0; n < PassCount; n++)
    {
    if(!
    hmap.AddObject(n+1, (CObject*)order))
    {
    Print(
    "Неудачный Add, итерация ", n+1);
    break;
    }
    }
    stop = GetMicrosecondCount();
    Print(
    "Время добавления ", PassCount, " элементов = ", DoubleToString((stop-start)/1000000.0, 4), " сек, ", DoubleToString((stop-start)/(double)PassCount, 4), " мкс/объект" );

    start = GetMicrosecondCount();
    CObject* obj;
    for(
    int n = 0; n < PassCount; n++)
    {
    if(
    hmap.ContainsKey(n+1))
    {
    obj = hmap.GetObjectByKey(n+1);
    if(
    CheckPointer(obj) == POINTER_INVALID)
    {
    Print(
    "Неудачный поиск, итерация ", n+1);
    break;
    }
    }
    else
    {
    Print(
    "Ключ не найден, итерация ", n+1);
    break;
    }
    }
    stop = GetMicrosecondCount();
    Print(
    "Время поиска ", PassCount, " элементов = ", DoubleToString((stop-start)/1000000.0, 4), " сек, ", DoubleToString((stop-start)/(double)PassCount, 4), " мкс/объект" );

    start = GetMicrosecondCount();
    for(
    int n = 0; n < PassCount; n++)
    {
    hmap.DeleteObjectByKey(n+1);
    }
    stop = GetMicrosecondCount();
    Print(
    "Время удаления ", PassCount, " элементов = ", DoubleToString((stop-start)/1000000.0, 4), " сек, ", DoubleToString((stop-start)/(double)PassCount, 4), " мкс/объект" );
    delete hmap;
    delete order;
    }


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

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

  25. Линк#57
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Отловил свою ошибку в работе с СHashMap, класс оказался на редкость шустрый! Одно но, нельзя пройтись итерецией по всем элементам, доступ только по ключу.
    2018.02.22 12:56:51.143 TestHashTable (EURUSD,M5) CheckHashMap()
    2018.02.22 12:56:54.466 TestHashTable (EURUSD,M5) Время добавления 10000000 элементов = 3.3208 сек, 0.3321 мкс/объект
    2018.02.22 12:56:55.326 TestHashTable (EURUSD,M5) Время поиска 10000000 элементов = 0.8599 сек, 0.0860 мкс/объект
    2018.02.22 12:56:55.901 TestHashTable (EURUSD,M5) Время удаления 10000000 элементов = 0.5742 сек, 0.0574 мкс/объект
    2018.02.22 12:56:56.026 TestHashTable (EURUSD,M5) CheckDictVS()
    2018.02.22 12:57:12.184 TestHashTable (EURUSD,M5) Время добавления 10000000 элементов = 16.1584 сек, 1.6158 мкс/объект
    2018.02.22 12:57:16.305 TestHashTable (EURUSD,M5) Время поиска 10000000 элементов = 4.1205 сек, 0.4120 мкс/объект
    2018.02.22 12:57:30.063 TestHashTable (EURUSD,M5) Время удаления 10000000 элементов = 13.7580 сек, 1.3758 мкс/объект

    Так что буду использовать СHashMap, так как последовательный доступ вроде не будет нужен. Ну а если все же понадобится, унаследуюсь от СHashMap и сделаю его.


  26. Линк#58
    Кандидат форумных наук
    Скромняжка
     
    Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Tekora хорошая репутация Аватар для Tekora
    Регистрация:
    26.06.2011
    Сообщений:
    1,755
    Деньги за посты (Подробнее):
    33277 RUB
    Поставил(а) лайков:
    211
    Получено лайков:  531
    в 423 сообщениях
    30%
    Цитата Сообщение от VDev Посмотреть сообщение
    Реализация от Metaquotes выдает ошибку поиска, причина неизвестна. Точно такой же код на реализации от Vasiliy Sokolov работает без ошибок
    Не знаю что вы подразумеваете под ошибкой поиска, и реализацией от Metaquotes , но скаченный файл Dictionary.mgh в конце статьи в МТ4 выдает ошибку при компиляции так же


    Лично я не настолько продвинутый программист, как Вы. Как исправить такую ошибку и выложите реализацию от Metaquotes, плииз... Может не у всех МТ5 установлен.


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

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

  28. Линк#59
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Цитата Сообщение от Tekora Посмотреть сообщение
    Не знаю что вы подразумеваете под ошибкой поиска, и реализацией от Metaquotes , но скаченный файл Dictionary.mgh в конце статьи в МТ4 выдает ошибку при компиляции так же



    Лично я не настолько продвинутый программист, как Вы. Как исправить такую ошибку и выложите реализацию от Metaquotes, плииз... Может не у всех МТ5 установлен.
    Так...попробовал, у меня на MQL4 ругается на union, непонятно почему, по синтаксису все верно. Я написал автору класса Василию Соколову с просьбой посмотреть, в чем дело.

    'union' - declaration without type dictionary2.mqh 95 4
    'casting_struct' - declaration without type dictionary2.mqh 111 4
    2 error(s), 0 warning(s) 3 1

    PHP код:
    class CDictionary : public CObject
    {
    private:
    int m_array_size;
    int m_total;
    bool m_free_mode;
    bool m_auto_free;
    int m_index;
    ulong m_hash;
    CList *m_array[];
    union casting_struct // вот тут ошибка!
    {
    double d_value;
    ulong l_value;
    }
    casting;


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

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

  30. Линк#60
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Цитата Сообщение от Tekora Посмотреть сообщение
    Не знаю что вы подразумеваете под ошибкой поиска, и реализацией от Metaquotes , но скаченный файл Dictionary.mgh в конце статьи в МТ4 выдает ошибку при компиляции так же



    Лично я не настолько продвинутый программист, как Вы. Как исправить такую ошибку и выложите реализацию от Metaquotes, плииз... Может не у всех МТ5 установлен.
    Проверьте, что у Вас билд редактора МТ4 1601 и билд терминала 1090. Это последние билды от 19 мая 2017 г., с ними все компилируется без ошибок. Посмотреть можно в меню-Справка-О программе.


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

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

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

    Прошу активных участников ответить на такой вопрос. Я думаю, до середины марта мы закончим класс CGridManager, в течении марта разберемся с ООП.
    Что делать, по вашему, дальше?

    Мне давно хочется разработать скальперскую панель для торговли на полуавтомате. Чтобы можно было быстренько зарабатывать с минимальным депозитом. Вот для примера, 21-го февраля закинул на счет $248, три дня писал программу, на втором монике лениво торговал руками в режиме "выстрелил и забыл". То есть открывался вручную, но сделки подхватывал мой робот-скальпер и закрывал их по своим критериям. Иногда я сам закрывал, иногда ставил СЛ (обычно, когда уходил погулять на час-два). Короче, результаты ниже. Вопрос: будет ли интересно участникам замутить такую панель? От вас тестирование, возможно, ценные идеи, с меня кодирование. Это так, ориентировочно, если кто захочет принять участие в разработке, скооперируемся. Может, какие-то вебинары проведем по скальпингу (я люблю именно скальпинг). Пишите, нужна обратная связь на будущие планы

    Название: 2018-02-24_001043.png
Просмотров: 339

Размер: 28.7 КБ


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

    BrownAleks (14.03.2018), Krypton, (06.03.2018), Leschich (24.02.2018), Viktor1987 (24.02.2018), Незарегистрированный (6 пользователей)

  34. Линк#62
    Кандидат форумных наук
    MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация MonyaMaker хорошая репутация Аватар для MonyaMaker
    Регистрация:
    03.04.2017
    Пол:
    Мужчина
    Сообщений:
    1,543
    Деньги за посты (Подробнее):
    50481 RUB
    Поставил лайков:
    270
    Получено лайков:  581
    в 526 сообщениях
    38%
    Цитата Сообщение от VDev Посмотреть сообщение

    Мне давно хочется разработать скальперскую панель для торговли на полуавтомате. ....
    А на полном автомате уже есть, и не интересненько?
    Пострелять всё таки тянет, но результат не интересен, потому, что исход известен.
    Не у всех, есть пули, как у Вас. Да и стрелки ещё те.
    Если в ветке планировался, курс для начинающих приобщиться к ООП, то разработку следует вынести в другую ветку,
    поскольку у начинающих, и так, бардак в голове, а так, даже сложно представить, что будет.
    Ну, а в ветке выделенной для разработки, там народ с обратной связью не задержится.

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

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

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

  36. Линк#63
    Знающий
    Очень рад
     
    VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь VDev авторитетный пользователь Аватар для VDev
    Регистрация:
    14.07.2010
    Пол:
    Мужчина
    Сообщений:
    3,252
    Деньги за посты (Подробнее):
    98800 RUB
    Поставил лайков:
    713
    Получено лайков:  2,656
    в 1,548 сообщениях
    82%
    Цитата Сообщение от MonyaMaker Посмотреть сообщение
    А на полном автомате уже есть, и не интересненько?
    Пострелять всё таки тянет, но результат не интересен, потому, что исход известен.
    Не у всех, есть пули, как у Вас. Да и стрелки ещё те.
    Если в ветке планировался, курс для начинающих приобщиться к ООП, то разработку следует вынести в другую ветку,
    поскольку у начинающих, и так, бардак в голове, а так, даже сложно представить, что будет.
    Ну, а в ветке выделенной для разработки, там народ с обратной связью не задержится.
    На автомате давно разрабатываю скальпер и им же давно торгую, просто постоянно идут доработки и нет им конца и края. Если делать панель, то конечно, проект создам не в этой ветке, тут и так параллельно идет два проекта - чисто по основам ООП и COrderGridManager, так уж вышло.


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

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

    <a href="https://forexdengi.com/attachment/1/0/1.php">Форекс портал</a>
  38. Линк#64
    Кандидат форумных наук
    Все пучком
     
    Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Viktor1987 хорошая репутация Аватар для Viktor1987
    Регистрация:
    12.10.2013
    Пол:
    Мужчина
    Сообщений:
    1,897
    Деньги за посты (Подробнее):
    29274 RUB
    Поставил лайков:
    755
    Получено лайков:  651
    в 459 сообщениях
    34%
    Цитата Сообщение от VDev Посмотреть сообщение
    Привожу предварительную версию класса, потом подробно разберем who is who.
    Что-то я не понял конструкцию:
    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);
    #ifdef __MQL5__
    m_positionInfo = new CPositionInfo;
    #endif

    }
    после параметров функции одёт оператор : , а затем непонятная мне конструкция? Поясните, плиз!
    И ещё вопросик, можно ли как то в этот мультиплатформенный код внести параметр отвечающий за факт частичного закрытия ордера? Что бы контролировать в советнике ордера закрытые частично! А иногда ордера и не по одному разу закрываются частично!

    P.S. зря параметр m_openprice вынесен в стабильные у отложек он может меняться!

    Последний раз редактировалось Viktor1987; 14.03.2018 в 15:36.

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

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


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

Похожие темы

  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