Обсуждение статьи "20 торговых сигналов на MQL5" - страница 3

 

Вот тут у меня назрел практический вопрос.

Почему при каждом вызове 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() необходимо проверять хэндл на валидность и создавать, если что, снова? Разве он не сохраняется до завершения работы эксперта? Вообще это необходимость, или просто для удобства примера?

Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
Документация по MQL5: Получение рыночной информации / SymbolIsSynchronized
  • www.mql5.com
Получение рыночной информации / SymbolIsSynchronized - Документация по MQL5
 
pronych:

Вот тут у меня назрел практический вопрос.

Почему при каждом вызове 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, как только данные будут готовы функция выполнит свою работу, по этому и необходимо это все проверять.

Да сергей, я понял. Ни чем не хотел бросить тень на статью, и на автора. Статья отличная. Это не претензия, а попытка найти ответ. Тут просто самое близкое по теме обсуждение, которое я нашел. Вам небось тоже хотелось бы знать ответ точнее? )

Может вынести его в отдельную тему? 

 
pronych:

Может вынести его в отдельную тему? 

https://www.mql5.com/ru/forum/1880

Вот, вынес в тему. Сергей, прошу прощения за выход за рамки статьи. Буду рад...))

ДО и ПОСЛЕ CopyBuffer(..)
ДО и ПОСЛЕ CopyBuffer(..)
  • www.mql5.com
Какие проверки, условия, или задержки надо внести ДО и ПОСЛЕ CopyBuffer(), для того, чтоб, ГАРАНТИРОВАННО получить те 400(0) значений индикатора, которые необходимы сейчас(!
 
Нам очень нравится эта статья. На данный момент мы создали 10 советников с помощью нашего программного обеспечения Visual Wizard, используя эти сигналы. Вы можете увидеть их здесь: http://www.molanis.com/products/expert-advisor-visual-wizard/expert-advisors-mt5
Expert Advisors for MT5 - Examples
  • Molanis Marketing
  • www.molanis.com
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...
 
Я пытался загрузить несколько советников, но безуспешно.
 

если бы кто-нибудь мог дать 20 методов управления деньгами!!!!!!

 

К этой статье - идея очень хорошая. Но вы забыли совсем об концепции ООП да и вообще программирования : АБСТРАКТНОСТЬ. Внутри ваших функций жестко прописаны иникаторы, текущий символ, текущий период, параметры индикаторов. Идея хорошая, но реализована не до конца, очень далеко еще к совершенству. К примеру - я хочу проверить пересечение линий индикаторов, каждая из них из разного таймфрейма и из разных символов - это РАЗ. Второе - что будет с вашими функциями, если терминал временно потерял связь с сервером и пропустил те самые три бара, которые вы обрабатываете ??? Сигнал есть - а вход пропущен. Поиск сигнала должен проходить с ЗАПАСОМ. Потом сигнал должен проверятся - обрабатывался ли он уже. У вас пересечений может быть столько - что вы сами удивитесь. Достаточно передавать в функции параметры (номериндикатора,символ, таймфрейм, началопоиска, конецпоиска, линия индикатора...) - и вы уже сделаете свою систему более гибкой и советник сможет увидеть то, что недоступно человеку - пересечение линий разных символов и разных таймреймов. Это намного лучше, чем приведенные здесь функции. Еще нужно выработать концепцию названия переменных - у вас слишком мало переменных  названия ничего не означают - но это отдельная тема. Это все называется стилем программирования. У каждого он свой. Но я смотрю, что потихоньку подбираются к тем концепциям, что я пытался использовать в МТ4 - это очень радует.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Линии индикаторов - Документация по MQL5
 
1CMaster:

К этой статье - идея очень хорошая. Но вы забыли совсем об концепции ООП да и вообще программирования : АБСТРАКТНОСТЬ. Внутри ваших функций жестко прописаны иникаторы, текущий символ, текущий период, параметры индикаторов. Идея хорошая, но реализована не до конца, очень далеко еще к совершенству. К примеру - я хочу проверить пересечение линий индикаторов, каждая из них из разного таймфрейма и из разных символов - это РАЗ. Второе - что будет с вашими функциями, если терминал временно потерял связь с сервером и пропустил те самые три бара, которые вы обрабатываете ??? Сигнал есть - а вход пропущен. Поиск сигнала должен проходить с ЗАПАСОМ. Потом сигнал должен проверятся - обрабатывался ли он уже. У вас пересечений может быть столько - что вы сами удивитесь. Достаточно передавать в функции параметры (номериндикатора,символ, таймфрейм, началопоиска, конецпоиска, линия индикатора...) - и вы уже сделаете свою систему более гибкой и советник сможет увидеть то, что недоступно человеку - пересечение линий разных символов и разных таймреймов. Это намного лучше, чем приведенные здесь функции. Еще нужно выработать концепцию названия переменных - у вас слишком мало переменных  названия ничего не означают - но это отдельная тема. Это все называется стилем программирования. У каждого он свой. Но я смотрю, что потихоньку подбираются к тем концепциям, что я пытался использовать в МТ4 - это очень радует.

 Статья писалась согласно тех заданию, Если вы хотите проверить пересечение, кто вам в этом мешает.