Почему при каждом вызове CopyBuffer() необходимо проверять хэндл индикатора на инвалидность? В своем советнике сделал эту процедуру однократно (с приходом первого тика, после проверки синхронизации данных), и в дальнейшем начал получать ошибку 4807 Ошибочный хэндл индикатора. Инструментов CSymTotal=7. Хэндлы получал в массив:
for (int i=0;i<CSymTotal;i++)
{
H_Ind[i]=iSAR(CSymList[i],PSARTF,PSARStep,PSARMax);
}
Проверка принтом показывает, что все семь H_Ind[0..6] имеют значения 10..15 соответственно, то есть отличные от -1. Вроде как получается хэндлы валидные, а в ответ на CopyBuffer(H_Ind[0-6]..) получаю CopyBuffer=-1, LastError=4807(!!!). При чем иногда нормально идет, а иногда прут ошибки.
После того, как ввел везде проверки, как в этой статье,
if(H_Ind[CSymListItem]==INVALID_HANDLE)//--- если хэндл невалидный
{
//--- создадим его снова
H_Ind[CSymListItem]=iSAR(CSymList[CSymListItem],PSARTF,PSARStep,PSARMax);
//--- выходим из функцииreturn(0);
}
else
{
cb=CopyBuffer(H_Ind[CSymListItem],0,0,BarsCheck,PSARBuffer);
...
пока всё работает правильно. Загадка...
Вот не пойму в чем тут у меня косяк... И самое главное, почему каждый раз при использовании CopyBuffer() необходимо проверять хэндл на валидность и создавать, если что, снова? Разве он не сохраняется до завершения работы эксперта? Вообще это необходимость, или просто для удобства примера?
Почему при каждом вызове CopyBuffer() необходимо проверять хэндл индикатора на инвалидность? В своем советнике сделал эту процедуру однократно (с приходом первого тика, после проверки синхронизации данных), и в дальнейшем начал получать ошибку 4807 Ошибочный хэндл индикатора. Инструментов CSymTotal=7. Хэндлы получал в массив:
Проверка принтом показывает, что все семь H_Ind[0..6] имеют значения 10..15 соответственно, то есть отличные от -1. Вроде как получается хэндлы валидные, а в ответ на CopyBuffer(H_Ind[0-6]..) получаю CopyBuffer=-1, LastError=4807(!!!). При чем иногда нормально идет, а иногда прут ошибки.
После того, как ввел везде проверки, как в этой статье,
пока всё работает правильно. Загадка...
Вот не пойму в чем тут у меня косяк... И самое главное, почему каждый раз при использовании CopyBuffer() необходимо проверять хэндл на валидность и создавать, если что, снова? Разве он не сохраняется до завершения работы эксперта? Вообще это необходимость, или просто для удобства примера?
в моих примерах условие выглядит так если хендл валидный то переходим к копированию данных. если нет то создаем индикатор заново и выходим из этой функции так как на расчет индикатора требуеться время. то же самое происходит и с копированием, во время копирования индикатор может пересчитываться поэтому CopyBuffer() возвращает -1, как только данные будут готовы функция выполнит свою работу, по этому и необходимо это все проверять.
Какие проверки, условия, или задержки надо внести ДО и ПОСЛЕ CopyBuffer(), для того, чтоб, ГАРАНТИРОВАННО получить те 400(0) значений индикатора, которые мне необходимы сейчас(!), на семи(десяти) инструментах в максимально скоростных условиях(в цикле)?
Ибо, return(0) = "а, ну щас не получилось, мож в другой раз получится..."
Тут, кстати, рядом стоят и остальные Copy...
PS. Возможно уже оффтоп. Ну вопрос не автору, всем, кто может прояснить...
sergey1294: в моих примерах условие выглядит так если хендл валидный то переходим к копированию данных. если нет то создаем индикатор заново и выходим из этой функции так как на расчет индикатора требуеться время. то же самое происходит и с копированием, во время копирования индикатор может пересчитываться поэтому CopyBuffer() возвращает -1, как только данные будут готовы функция выполнит свою работу, по этому и необходимо это все проверять.
Да сергей, я понял. Ни чем не хотел бросить тень на статью, и на автора. Статья отличная. Это не претензия, а попытка найти ответ. Тут просто самое близкое по теме обсуждение, которое я нашел. Вам небось тоже хотелось бы знать ответ точнее? )
Какие проверки, условия, или задержки надо внести ДО и ПОСЛЕ CopyBuffer(), для того, чтоб, ГАРАНТИРОВАННО получить те 400(0) значений индикатора, которые необходимы сейчас(!
Нам очень нравится эта статья. На данный момент мы создали 10 советников с помощью нашего программного обеспечения Visual Wizard, используя эти сигналы. Вы можете увидеть их здесь: http://www.molanis.com/products/expert-advisor-visual-wizard/expert-advisors-mt5
Please note that these Expert Advisors were created for educational purposes and do not constitute any financial advice. Before using the following EAs, please take into account the following: THE DOWNLOAD FILES ARE IN MOL5 FORMAT (MOLANIS 5 FORMAT - A .MOL5 FILE FOR THE EA VISUAL WIZARD). TO OBTAIN THE EA FOR MT5, DOWNLOAD THE STRATEGY...
К этой статье - идея очень хорошая. Но вы забыли совсем об концепции ООП да и вообще программирования : АБСТРАКТНОСТЬ. Внутри ваших функций жестко прописаны иникаторы, текущий символ, текущий период, параметры индикаторов. Идея хорошая, но реализована не до конца, очень далеко еще к совершенству. К примеру - я хочу проверить пересечение линий индикаторов, каждая из них из разного таймфрейма и из разных символов - это РАЗ. Второе - что будет с вашими функциями, если терминал временно потерял связь с сервером и пропустил те самые три бара, которые вы обрабатываете ??? Сигнал есть - а вход пропущен. Поиск сигнала должен проходить с ЗАПАСОМ. Потом сигнал должен проверятся - обрабатывался ли он уже. У вас пересечений может быть столько - что вы сами удивитесь. Достаточно передавать в функции параметры (номериндикатора,символ, таймфрейм, началопоиска, конецпоиска, линия индикатора...) - и вы уже сделаете свою систему более гибкой и советник сможет увидеть то, что недоступно человеку - пересечение линий разных символов и разных таймреймов. Это намного лучше, чем приведенные здесь функции. Еще нужно выработать концепцию названия переменных - у вас слишком мало переменных названия ничего не означают - но это отдельная тема. Это все называется стилем программирования. У каждого он свой. Но я смотрю, что потихоньку подбираются к тем концепциям, что я пытался использовать в МТ4 - это очень радует.
К этой статье - идея очень хорошая. Но вы забыли совсем об концепции ООП да и вообще программирования : АБСТРАКТНОСТЬ. Внутри ваших функций жестко прописаны иникаторы, текущий символ, текущий период, параметры индикаторов. Идея хорошая, но реализована не до конца, очень далеко еще к совершенству. К примеру - я хочу проверить пересечение линий индикаторов, каждая из них из разного таймфрейма и из разных символов - это РАЗ. Второе - что будет с вашими функциями, если терминал временно потерял связь с сервером и пропустил те самые три бара, которые вы обрабатываете ??? Сигнал есть - а вход пропущен. Поиск сигнала должен проходить с ЗАПАСОМ. Потом сигнал должен проверятся - обрабатывался ли он уже. У вас пересечений может быть столько - что вы сами удивитесь. Достаточно передавать в функции параметры (номериндикатора,символ, таймфрейм, началопоиска, конецпоиска, линия индикатора...) - и вы уже сделаете свою систему более гибкой и советник сможет увидеть то, что недоступно человеку - пересечение линий разных символов и разных таймреймов. Это намного лучше, чем приведенные здесь функции. Еще нужно выработать концепцию названия переменных - у вас слишком мало переменных названия ничего не означают - но это отдельная тема. Это все называется стилем программирования. У каждого он свой. Но я смотрю, что потихоньку подбираются к тем концепциям, что я пытался использовать в МТ4 - это очень радует.
Статья писалась согласно тех заданию, Если вы хотите проверить пересечение, кто вам в этом мешает.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Вот тут у меня назрел практический вопрос.
Почему при каждом вызове 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 - это очень радует.