Обсуждение статьи "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) значений индикатора, которые необходимы сейчас(!
 

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

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

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

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

Спасибо автору за статью!

Не делайте то, что советует 1CMaster это просто бред.

Сделайте лучше другое, выведите на график вертикальную линию  сдвигая которую индикаторы показывали состояние именно этого момента (где находится вертикальная линия), а не текущего?

 

Ошибка в формировании сигнала от Аллигатора

.....
      if(CopyBuffer(h_al,0,0,2,al1_buffer)<2)
         return(0);
      if(CopyBuffer(h_al,1,0,2,al2_buffer)<2)
         return(0);
      if(CopyBuffer(h_al,2,0,2,al3_buffer)<2)
         return(0);
      if(!ArraySetAsSeries(al1_buffer,true))
         return(0);
      if(!ArraySetAsSeries(al2_buffer,true))
         return(0);
      if(!ArraySetAsSeries(al3_buffer,true))
         return(0);
     }
//--- проводим проверку условия и устанавливаем значение для sig
   if(al3_buffer[1]>al2_buffer[1] && al2_buffer[1]>al1_buffer[1])
      sig=1;
   else if(al3_buffer[1]<al2_buffer[1] && al2_buffer[1]<al1_buffer[1])
      sig=-1;
   else sig=0;

//--- возвращаем торговый сигнал
   return(sig);
  }


Копирование данных буферов необходимо с учетом сдвига линий индикатора а тут нет

Второе зачем копировать два значения индикатора если сравнивается только на одном баре то есть достачно одного значения на каждый буфер (линию)

Сигнал от АО : тоже копируется много данных (они не участвуют  в анализе)

     if(CopyBuffer(h_ao,1,0,20,ao_buffer)<20)
         return(0);
      if(!ArraySetAsSeries(ao_buffer,true))
         return(0); 

причем в начале статьи было сказано что бы убрать дребезг будем анализировать не нулевой а первый бар  в историю то зачем копировать нулевой ?

Не экономим ресурсы ....

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

Ошибка в формировании сигнала от Аллигатора


Копирование данных буферов необходимо с учетом сдвига линий индикатора а тут нет

Второе зачем копировать два значения индикатора если сравнивается только на одном баре то есть достачно одного значения на каждый буфер (линию)

Сигнал от АО : тоже копируется много данных (они не участвуют  в анализе)

причем в начале статьи было сказано что бы убрать дребезг будем анализировать не нулевой а первый бар  в историю то зачем копировать нулевой ?

Не экономим ресурсы ....



Во первых в справке ясно написано

Необходимо помнить, что смещение линии является чисто визуальным для отображения и значения в индикаторном буфере хранятся без смещения. 
При получении значений буфера функцией CopyBuffer() значение смещения никакого эффекта иметь не будет.

Во вторых возможно я и допустил где - то ошибки с копированием данных, но это не влияет на основную суть задачи. Цель статьи показать как правильно обращаться к индикаторам и данным.

Причина обращения: