Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот тут у меня назрел практический вопрос.
Почему при каждом вызове CopyBuffer() необходимо проверять хэндл индикатора на инвалидность? В своем советнике сделал эту процедуру однократно (с приходом первого тика, после проверки синхронизации данных), и в дальнейшем начал получать ошибку 4807 Ошибочный хэндл индикатора. Инструментов CSymTotal=7. Хэндлы получал в массив:
Проверка принтом показывает, что все семь H_Ind[0..6] имеют значения 10..15 соответственно, то есть отличные от -1. Вроде как получается хэндлы валидные, а в ответ на CopyBuffer(H_Ind[0-6]..) получаю CopyBuffer=-1, LastError=4807(!!!). При чем иногда нормально идет, а иногда прут ошибки.После того, как ввел везде проверки, как в этой статье,
пока всё работает правильно. Загадка...
Вот не пойму в чем тут у меня косяк... И самое главное, почему каждый раз при использовании CopyBuffer() необходимо проверять хэндл на валидность и создавать, если что, снова? Разве он не сохраняется до завершения работы эксперта? Вообще это необходимость, или просто для удобства примера?
Вот тут у меня назрел практический вопрос.
Почему при каждом вызове CopyBuffer() необходимо проверять хэндл индикатора на инвалидность? В своем советнике сделал эту процедуру однократно (с приходом первого тика, после проверки синхронизации данных), и в дальнейшем начал получать ошибку 4807 Ошибочный хэндл индикатора. Инструментов CSymTotal=7. Хэндлы получал в массив:
Проверка принтом показывает, что все семь H_Ind[0..6] имеют значения 10..15 соответственно, то есть отличные от -1. Вроде как получается хэндлы валидные, а в ответ на CopyBuffer(H_Ind[0-6]..) получаю CopyBuffer=-1, LastError=4807(!!!). При чем иногда нормально идет, а иногда прут ошибки.После того, как ввел везде проверки, как в этой статье,
пока всё работает правильно. Загадка...
Вот не пойму в чем тут у меня косяк... И самое главное, почему каждый раз при использовании CopyBuffer() необходимо проверять хэндл на валидность и создавать, если что, снова? Разве он не сохраняется до завершения работы эксперта? Вообще это необходимость, или просто для удобства примера?
Вообще, вопрос стоит сформулировать шире:
Какие проверки, условия, или задержки надо внести ДО и ПОСЛЕ CopyBuffer(), для того, чтоб, ГАРАНТИРОВАННО получить те 400(0) значений индикатора, которые мне необходимы сейчас(!), на семи(десяти) инструментах в максимально скоростных условиях(в цикле)?
Ибо, return(0) = "а, ну щас не получилось, мож в другой раз получится..."
Тут, кстати, рядом стоят и остальные Copy...
PS. Возможно уже оффтоп. Ну вопрос не автору, всем, кто может прояснить...
в моих примерах условие выглядит так если хендл валидный то переходим к копированию данных. если нет то создаем индикатор заново и выходим из этой функции так как на расчет индикатора требуеться время. то же самое происходит и с копированием, во время копирования индикатор может пересчитываться поэтому CopyBuffer() возвращает -1, как только данные будут готовы функция выполнит свою работу, по этому и необходимо это все проверять.
Да сергей, я понял. Ни чем не хотел бросить тень на статью, и на автора. Статья отличная. Это не претензия, а попытка найти ответ. Тут просто самое близкое по теме обсуждение, которое я нашел. Вам небось тоже хотелось бы знать ответ точнее? )
Может вынести его в отдельную тему?
Может вынести его в отдельную тему?
https://www.mql5.com/ru/forum/1880
Вот, вынес в тему. Сергей, прошу прощения за выход за рамки статьи. Буду рад...))
если бы кто-нибудь мог дать 20 методов управления деньгами!!!!!!
К этой статье - идея очень хорошая. Но вы забыли совсем об концепции ООП да и вообще программирования : АБСТРАКТНОСТЬ. Внутри ваших функций жестко прописаны иникаторы, текущий символ, текущий период, параметры индикаторов. Идея хорошая, но реализована не до конца, очень далеко еще к совершенству. К примеру - я хочу проверить пересечение линий индикаторов, каждая из них из разного таймфрейма и из разных символов - это РАЗ. Второе - что будет с вашими функциями, если терминал временно потерял связь с сервером и пропустил те самые три бара, которые вы обрабатываете ??? Сигнал есть - а вход пропущен. Поиск сигнала должен проходить с ЗАПАСОМ. Потом сигнал должен проверятся - обрабатывался ли он уже. У вас пересечений может быть столько - что вы сами удивитесь. Достаточно передавать в функции параметры (номериндикатора,символ, таймфрейм, началопоиска, конецпоиска, линия индикатора...) - и вы уже сделаете свою систему более гибкой и советник сможет увидеть то, что недоступно человеку - пересечение линий разных символов и разных таймреймов. Это намного лучше, чем приведенные здесь функции. Еще нужно выработать концепцию названия переменных - у вас слишком мало переменных названия ничего не означают - но это отдельная тема. Это все называется стилем программирования. У каждого он свой. Но я смотрю, что потихоньку подбираются к тем концепциям, что я пытался использовать в МТ4 - это очень радует.
К этой статье - идея очень хорошая. Но вы забыли совсем об концепции ООП да и вообще программирования : АБСТРАКТНОСТЬ. Внутри ваших функций жестко прописаны иникаторы, текущий символ, текущий период, параметры индикаторов. Идея хорошая, но реализована не до конца, очень далеко еще к совершенству. К примеру - я хочу проверить пересечение линий индикаторов, каждая из них из разного таймфрейма и из разных символов - это РАЗ. Второе - что будет с вашими функциями, если терминал временно потерял связь с сервером и пропустил те самые три бара, которые вы обрабатываете ??? Сигнал есть - а вход пропущен. Поиск сигнала должен проходить с ЗАПАСОМ. Потом сигнал должен проверятся - обрабатывался ли он уже. У вас пересечений может быть столько - что вы сами удивитесь. Достаточно передавать в функции параметры (номериндикатора,символ, таймфрейм, началопоиска, конецпоиска, линия индикатора...) - и вы уже сделаете свою систему более гибкой и советник сможет увидеть то, что недоступно человеку - пересечение линий разных символов и разных таймреймов. Это намного лучше, чем приведенные здесь функции. Еще нужно выработать концепцию названия переменных - у вас слишком мало переменных названия ничего не означают - но это отдельная тема. Это все называется стилем программирования. У каждого он свой. Но я смотрю, что потихоньку подбираются к тем концепциям, что я пытался использовать в МТ4 - это очень радует.