Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1331
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Из входных параметров нужно извлечь все подстроки, из них составить наименования символов и соответствующих им таймфреймов.
Далее из этих списков создать объекты-новые бары и указатель на каждый создаваемый объект "Новый бар" поместить в CArrayObj, который объявлен на глобальном уровне.
Далее - в OnTimer() в цикле по этому списку получать указатель на очередной объект в нём и проверять наличие нового бара. Если нету - переходим к следующему, если есть - делаем то, что нужно делать при открытии нового этого бара.
Таймер сделать по своим потребностям - миллисекундный, секундный, минутный - в общем, стой частотой, которую считаете достаточной для реакции на новый бар на нетекущем символе.
Примерно так и делал, но по ArrObj.At(0) не вызываются функции-члены класса...
Смотрите внимательнее. Вы делали не так.
Уже заметил)
Значит, выход - объявлять глобально пустые объекты....
А если заранее неизвестно, сколько их будет ? Просто объявить "с запасом" ? :)
P.S. Во встроенной справке не нашел такой способ объявления объектов
CObj* var1 = NULL;Уже заметил)
Значит, выход - объявлять глобально пустые объекты....
А если заранее неизвестно, сколько их будет ? Просто объявить "с запасом" ? :)
Положите в CArrayObj.
Функция ArrObj.At(0) возвращает указатель на базовый класс, который ничего не знает о членах производного класса.
Для того чтобы к ним обращаться просто сделайте преобразование типа.
CIsNewBar* newBar = (CIsNewBar*)ArrayObj.At(0); newBar.method( parameter );Положите в CArrayObj.
Функция ArrObj.At(0) возвращает указатель на базовый класс, который ничего не знает о членах производного класса.
Для того чтобы к ним обращаться просто сделайте преобразование типа.
Спасибо за ответ, вовсе вы не злой)
Теперь все стало ясно)
UPD
Вот такая конструкция тоже работает
CIsNewBar* newBar = ArrayObj.At(0); newBar.method( parameter )Спасибо за ответ, вовсе вы не злой)
Теперь все стало ясно)
UPD
Вот такая конструкция тоже работает
Обратите внимание на то, что возвращает метод At(). Если вернёт NULL, то вылетите по критической ошибке. Прежде, чем обращаться по указателю к объекту, проверьте его на не NULL
Уже заметил)
Значит, выход - объявлять глобально пустые объекты....
А если заранее неизвестно, сколько их будет ? Просто объявить "с запасом" ? :)
P.S. Во встроенной справке не нашел такой способ объявления объектов
Когда-то Артём писал мне этот класс. Я в подробностях объяснить как работает не могу. Но Артём увидев вспомнит и сможет объяснить. В общем вот сам класс
И вот цикл создания указателей в OnInit()
и в OnTimer()
ArraySize(Rates) это размер массива структур в котором перечислены символы с которыми надо работать.
Когда-то Артём писал мне этот класс. Я в подробностях объяснить как работает не могу. Но Артём увидев вспомнит и сможет объяснить. В общем вот сам класс
И вот цикл создания указателей в OnInit()
и в OnTimer()
ArraySize(Rates) это размер массива структур в котором перечислены символы с которыми надо работать.
Здесь:
я бы делал до total - просто по причине, что ты с массива Rates читаешь символы (верно?), создаёшь экземпляры класса нового бара и добавляешь их в список.
При любой ошибке добавления, размер списка указателей на экземпляры класса нового бара не будет совпадать с размером массива Rates.
В общем, как-то так наверное:
А вот тут нужно тоже проверять на успешность добавления в список:
как-то так:
во избежание утечки памяти при ошибке добавления указателя на новый объект в списокЗдесь:
я бы делал до total - просто по причине, что ты с массива Rates читаешь символы (верно?), создаёшь экземпляры класса нового бара и добавляешь их в список.
При любой ошибке добавления, размер списка указателей на экземпляры класса нового бара не будет совпадать с размером массива Rates.
В общем, как-то так наверное:
А вот тут нужно тоже проверять на успешность добавления в список:
как-то так:
во избежание утечки памяти при ошибке добавления указателя на новый объект в списокСпасибо. Я понял, исправлю на так…:)))
Ненавижу оператор continue; и стараюсь им не пользоваться. Исключительно в безвыходных случаях.
чем отличается от
Другое дело если при ошибке удалить несостоявшийся указатель… Но и тут можно обойтись без ненавистного мне continue; просто удалив Print(). Он был нужен во время отладки и попытки понять происходящее, а если во время работы произойдёт какая-то ошибка, я по любому не пойму что не так… Мне проще переустановить ОС, чем разобраться в логах.Раз уж пошёл разговор об этом, расскажи пожалуйста, только не влезая в дебри, чем отличается указатель от переменной класса и что предпочтительней. В подробностях, в таких которые понять сложно я могу в тырнете почитать. Мне достаточно, так сказать, поверхностного понимания…
Обратите внимание на то, что возвращает метод At(). Если вернёт NULL, то вылетите по критической ошибке. Прежде, чем обращаться по указателю к объекту, проверьте его на не NULL
Артем, спасибо за ценное замечание)
Спасибо. Я понял, исправлю на так…:)))
Ненавижу оператор continue; и стараюсь им не пользоваться. Исключительно в безвыходных случаях.
чем отличается от
Итерацию цикла не закончит и новую не начнет, а перейдет к следующему Иф. Логика поменяется.