Проблема передачи данных из индикатора в эксперт - страница 2

 
Исправил название на правильное. Не помогло, всё осталось по старому...
 
Oldman_Evgeny:
Исправил название на правильное. Не помогло, всё осталось по старому...

Я не знаю, что Вы там делает, но Вот Ваши два файла. Индикатор я разместил в корне Indicators. 


Принты после копирования заменил на Comments:

//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handle
   if(CopyBuffer(st_RSI_Fast_Handle,0,0,3,st_RSI_Fast_Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора st_MACD номер ошибки:",GetLastError(),"!!");
      return;
     }
   //Print("_");
   Comment("st_RSI_Fast_Val. [1]= ",st_RSI_Fast_Val[1]," [0]= ",st_RSI_Fast_Val[0],
         " st_RSI_Val. [1]= ",st_RSI_Val[1]," [0]= ",st_RSI_Val[0]);
   //Print("_");


Эта часть работает корректно.


Запустите ИМЕННО эти файл в тестере и  проверьте.

Файлы:
RSI_Step.mq5  12 kb
My_Expert.mq5  43 kb
 
Vladimir Karputov:
Непонятка №2: Вообще не ясно какое имя у Вашего индикатора и ГДЕ и В КАКОЙ паке он расположен.

Индикатор Step_RSI_1. Глобально находится в C:\Program Files\PSB Forex Terminal\MQL5\Indicators\Examples

 

Теперь вопрос: Вы зачем переписываете данные массива в котором данные скопированные из Индикатора? Зачем делаете нормализацию

   //Print("_");
   Comment("st_RSI_Fast_Val. [1]= ",st_RSI_Fast_Val[1]," [0]= ",st_RSI_Fast_Val[0],
         " st_RSI_Val. [1]= ",st_RSI_Val[1]," [0]= ",st_RSI_Val[0]);
   //Print("_");

   st_RSI_Val[0]=NormalizeDouble(st_RSI_Val[0],8);
   st_RSI_Fast_Val[0]=NormalizeDouble(st_RSI_Fast_Val[0],8);

//   Print("chart 2= ",st_chart_Val[2]," 1=",st_chart_Val[1]," 0=", st_chart_Val[0]," TRIX=",st_TRIX_Val[0]," BullBear= ",st_BullBear_Val[0]);
//   Print(" Macd=",st_MACD_Val[0],"  RSI=",st_RSI_Val[0]);
//   Print("-");
 
Oldman_Evgeny:

Индикатор Step_RSI_1. Глобально находится в C:\Program Files\PSB Forex Terminal\MQL5\Indicators\Examples

Читайте выше:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Проблема передачи данных из индикатора в эксперт

Vladimir Karputov, 2019.05.11 14:10

Я не знаю, что Вы там делает, но Вот Ваши два файла. Индикатор я разместил в корне Indicators. 


Принты после копирования заменил на Comments:

//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handle
   if(CopyBuffer(st_RSI_Fast_Handle,0,0,3,st_RSI_Fast_Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора st_MACD номер ошибки:",GetLastError(),"!!");
      return;
     }
   //Print("_");
   Comment("st_RSI_Fast_Val. [1]= ",st_RSI_Fast_Val[1]," [0]= ",st_RSI_Fast_Val[0],
         " st_RSI_Val. [1]= ",st_RSI_Val[1]," [0]= ",st_RSI_Val[0]);
   //Print("_");


Эта часть работает корректно.


Запустите ИМЕННО эти файл в тестере и  проверьте.


 
Пока не проверете вывод информации на график из поста  - дальше двигаться нельзя.
 
Vladimir Karputov:

Я не знаю, что Вы там делает, но Вот Ваши два файла. Индикатор я разместил в корне Indicators. 


Принты после копирования заменил на Comments:


Эта часть работает корректно.


Запустите ИМЕННО эти файл в тестере и  проверьте.

"Запустите ИМЕННО эти файл в тестере и  проверьте."

Запустил и проверил...

Индикаторы рисуются и рисовались правильно! А вот в Эксперт правильные данные так и не передаются....(((((

В таком виде хендла Эксперт "My_Expert"не запускается...

st_RSI_Handle=iCustom(
                         NULL,                         // имя символа текущее
                         0,                            // период графика текущий
                         "RSI_Step",// папка/имя_пользовательского индикатора 
                         RSI_Period_RSI,// список входных параметров индикатора 
                         inpStepSize_RSI
                         );

Вот с этим запустился, но результат не радует. 

st_RSI_Handle=iCustom(
                         NULL,                         // имя символа текущее
                         0,                            // период графика текущий
                         "Examples\\RSI_Step",// папка/имя_пользовательского индикатора 
                         RSI_Period_RSI,// список входных параметров индикатора 
                         inpStepSize_RSI
                         );

Проблема в чем?

Передается значение "дискретного" RSI"

Вот на каком-то шаге было:

st_RSI_Fast_Val [1]= 55.0     st_RSI_Fast_Val [0]= 55.0

На следующем шаге RSI изменился. Стал 60. При этом st_RSI_Fast_Val [1] должен хранить значение 55, а st_RSI_Fast_Val[0] показывать 60.

А они что делают????

Показывают:

st_RSI_Fast_Val. [1]= 60.0   [0]= 60.0

Это один из фокусов. Есть и другие. Но этот показательный...


И при всем при этом индикатор рисует правильные картинки!

PS. Sorry... Должен исчезнуть на час. Если поможете буду премного благодарен. Уже ум-за-разум заходит...

 
Oldman_Evgeny:


***

st_RSI_Fast_Val [1]= 55.0     st_RSI_Fast_Val [0]= 55.0

На следующем шаге RSI изменился. Стал 60. При этом st_RSI_Fast_Val [1] должен хранить значение 55, а st_RSI_Fast_Val[0] показывать 60.

***

Никто никому не должен. А тем более хранить :)

Я показал пример в посте 12 - все данные правильно получаются из индикатора. 

Вероятно Вы что-то неверно понимаете в работе с массивами. Как только Вы скопировали три значения, Вы фактически стёрли всё, что было до этого в массиве и заменили это новыми значениями. То есть в любой момент времени после копирования трёх значений индикатора массив (в который произведено копирование) содержит данные ТРЁХ ПОСЛЕДНИХ баров: бара #0, бара #1 и бара #2.

Вот Ваш код:

//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handle
   if(CopyBuffer(st_RSI_Handle,0,0,3,st_RSI_Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора st_MACD номер ошибки:",GetLastError(),"!!");
      return;
     }

//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handle
   if(CopyBuffer(st_RSI_Fast_Handle,0,0,3,st_RSI_Fast_Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора st_MACD номер ошибки:",GetLastError(),"!!");
      return;
     }

Вы копируете от бара #0 три значения.

Кстати сразу ошибка - раз копируете три значения, то и результат нужно сравнивать с числом "3" - а вдруг скопировался всего один результат или только два???

 
Vladimir Karputov:

Никто никому не должен. А тем более хранить :)

Я показал пример в посте 12 - все данные правильно получаются из индикатора. 

Вероятно Вы что-то неверно понимаете в работе с массивами. Как только Вы скопировали три значения, Вы фактически стёрли всё, что было до этого в массиве и заменили это новыми значениями. То есть в любой момент времени после копирования трёх значений индикатора массив (в который произведено копирование) содержит данные ТРЁХ ПОСЛЕДНИХ баров: бара #0, бара #1 и бара #2.

Вот Ваш код:

Вы копируете от бара #0 три значения.

Кстати сразу ошибка - раз копируете три значения, то и результат нужно сравнивать с числом "3" - а вдруг скопировался всего один результат или только два???

   Индикатор рисуется корректно - ни слов, ни замечаний нет! И распечатка значений на рисунке индикатора корректна.

   Но данные в эксперт передаются некорректно!


   Я правильно понимаю работу с массивами:

  CopyBuffer(st_RSI_Handle,0,0,3,st_RSI_Val) копирует в st_RSI_Val[0], ...[1],...[2] - три последних значения индикатора на текущем баре, предпоследнем баре и предпредпоследнем.

"0" стартовый номер, всего три бара -нулевой, первый и второй

 Пусть в st_RSI_Val[0] образно говоря число "а", в st_RSI_Val[1] = число "b" и в st_RSI_Val[2] =число "с" 

На следующем шаге имеем новое число "d". В результате  в st_RSI_Val[0] оказывается число "d", в st_RSI_Val[1] - число "a', в st_RSI_Val[2] - число "b".

Ведь индикатор уже не поменяет значение чисел "а" и "b", только передвинет их по массиву, точнее поставит перед ними новое число "d"


И вот этого, например, у меня не происходит! Число "а" почему-то меняется! Конкретно у меня становится равным вновь появившемуся числу "d"/

Еще есть, например, глюк - на индикаторе уровень RSI поменялся, а в эксперт как передавалась "старая" цифра, так и продолжает передаваться...


Кстати сразу ошибка - раз копируете три значения, то и результат нужно сравнивать с числом "3" - а вдруг скопировался всего один результат или только два???

Этого, вообще, не понял - это как? Т.е. CopyBuffer(st_RSI_Handle,0,0,3,st_RSI_Val)  возвращает число "3"? Я думал возвращает "-1", если что-то пошло не так.

 
Oldman_Evgeny:

   Индикатор рисуется корректно - ни слов, ни замечаний нет! И распечатка значений на рисунке индикатора корректна.

   Но данные в эксперт передаются некорректно!


   Я правильно понимаю работу с массивами:

  CopyBuffer(st_RSI_Handle,0,0,3,st_RSI_Val) копирует в st_RSI_Val[0], ...[1],...[2] - три последних значения индикатора на текущем баре, предпоследнем баре и предпредпоследнем.

"0" стартовый номер, всего три бара -нулевой, первый и второй

 Пусть в st_RSI_Val[0] образно говоря число "а", в st_RSI_Val[1] = число "b" и в st_RSI_Val[2] =число "с" 

На следующем шаге имеем новое число "d". В результате  в st_RSI_Val[0] оказывается число "d", в st_RSI_Val[1] - число "a', в st_RSI_Val[2] - число "b".

Ведь индикатор уже не поменяет значение чисел "а" и "b", только передвинет их по массиву, точнее поставит перед ними новое число "d"


И вот этого, например, у меня не происходит! Число "а" почему-то меняется! Конкретно у меня становится равным вновь появившемуся числу "d"/

Еще есть, например, глюк - на индикаторе уровень RSI поменялся, а в эксперт как передавалась "старая" цифра, так и продолжает передаваться...


Этого, вообще, не понял - это как? Т.е. CopyBuffer(st_RSI_Handle,0,0,3,st_RSI_Val)  возвращает число "3"? Я думал возвращает "-1", если что-то пошло не так.

Каша в голове у Вас. Всё копируется и передаётся корректно. Никто никуда ничего не "передвигает". Происходит операция КОПИРОВАНИЯ значений индикатора с соответствующих баров.

Сейчас дам код, который выводит три значения из массива:

//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handle
   if(CopyBuffer(st_RSI_Fast_Handle,0,0,3,st_RSI_Fast_Val)!=3)
     {
      Alert("Ошибка копирования буферов индикатора st_MACD номер ошибки:",GetLastError(),"!!");
      return;
     }

   string text="";
   for(int i=0;i<3;i++)
     {
      text=text+"st_RSI_Fast_Val["+IntegerToString(i)+"]="+DoubleToString(st_RSI_Fast_Val[i],0)+
           " st_RSI_Val["+IntegerToString(i)+"]="+DoubleToString(st_RSI_Val[i],0)+"\n";
     }
   Comment(text);

//--- есть ли открытые позиции?

Теперь можно отслеживать ПЕРЕДАННЫЕ значения с трёх баров:


Файлы:
My_Expert.mq5  43 kb
Причина обращения: