Oldman_Evgeny: Исправил название на правильное. Не помогло, всё осталось по старому...
Я не знаю, что Вы там делает, но Вот Ваши два файла. Индикатор я разместил в корне Indicators.
Принты после копирования заменил на Comments:
//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handleif(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("_");
Я не знаю, что Вы там делает, но Вот Ваши два файла. Индикатор я разместил в корне Indicators.
Принты после копирования заменил на Comments:
//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handleif(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 изменился. Стал 60. При этом st_RSI_Fast_Val [1] должен хранить значение 55, а st_RSI_Fast_Val[0] показывать 60.
***
Никто никому не должен. А тем более хранить :)
Я показал пример в посте 12 - все данные правильно получаются из индикатора.
Вероятно Вы что-то неверно понимаете в работе с массивами. Как только Вы скопировали три значения, Вы фактически стёрли всё, что было до этого в массиве и заменили это новыми значениями. То есть в любой момент времени после копирования трёх значений индикатора массив (в который произведено копирование) содержит данные ТРЁХ ПОСЛЕДНИХ баров: бара #0, бара #1 и бара #2.
Вот Ваш код:
//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handleif(CopyBuffer(st_RSI_Handle,0,0,3,st_RSI_Val)<0)
{
Alert("Ошибка копирования буферов индикатора st_MACD номер ошибки:",GetLastError(),"!!");
return;
}
//--- Скопируйте новые значения наших индикаторов в буферы (массивы) с помощью хендлов st_RSI_Handleif(CopyBuffer(st_RSI_Fast_Handle,0,0,3,st_RSI_Fast_Val)<0)
{
Alert("Ошибка копирования буферов индикатора st_MACD номер ошибки:",GetLastError(),"!!");
return;
}
Вы копируете от бара #0три значения.
Кстати сразу ошибка - раз копируете три значения, то и результат нужно сравнивать с числом "3" - а вдруг скопировался всего один результат или только два???
Я показал пример в посте 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", если что-то пошло не так.
Индикатор рисуется корректно - ни слов, ни замечаний нет! И распечатка значений на рисунке индикатора корректна.
Но данные в эксперт передаются некорректно!
Я правильно понимаю работу с массивами:
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_Handleif(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);//--- есть ли открытые позиции?
Теперь можно отслеживать ПЕРЕДАННЫЕ значения с трёх баров:
Каша в голове у Вас. Всё копируется и передаётся корректно. Никто никуда ничего не "передвигает". Происходит операция КОПИРОВАНИЯ значений индикатора с соответствующих баров.
Сейчас дам код, который выводит три значения из массива:
Теперь можно отслеживать ПЕРЕДАННЫЕ значения с трёх баров:
Спасибо за код! Вот я его и посмотрел. Классно видно, что происходит!
При появлении нового бара, появляется новый "нулевой" элемент массива, при этом "старый" "нулевой" элемент не сдвигается! А пропадает! И на его место встает копия "нового" элемента!, т.е получается, что st_RSI_Fast_Val[1] содержит не данные предыдущего st_RSI_Fast_Val[0], а копию НОВОГО st_RSI_Fast_Val[0].
Исправил название на правильное. Не помогло, всё осталось по старому...
Я не знаю, что Вы там делает, но Вот Ваши два файла. Индикатор я разместил в корне Indicators.
Принты после копирования заменил на Comments:
Эта часть работает корректно.
Запустите ИМЕННО эти файл в тестере и проверьте.
Теперь вопрос: Вы зачем переписываете данные массива в котором данные скопированные из Индикатора? Зачем делаете нормализацию?
Индикатор Step_RSI_1. Глобально находится в C:\Program Files\PSB Forex Terminal\MQL5\Indicators\Examples
Читайте выше:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Проблема передачи данных из индикатора в эксперт
Vladimir Karputov, 2019.05.11 14:10
Я не знаю, что Вы там делает, но Вот Ваши два файла. Индикатор я разместил в корне Indicators.
Принты после копирования заменил на Comments:
Эта часть работает корректно.
Запустите ИМЕННО эти файл в тестере и проверьте.
Я не знаю, что Вы там делает, но Вот Ваши два файла. Индикатор я разместил в корне Indicators.
Принты после копирования заменил на Comments:
Эта часть работает корректно.
Запустите ИМЕННО эти файл в тестере и проверьте.
"Запустите ИМЕННО эти файл в тестере и проверьте."
Запустил и проверил...
Индикаторы рисуются и рисовались правильно! А вот в Эксперт правильные данные так и не передаются....(((((
В таком виде хендла Эксперт "My_Expert"не запускается...
Вот с этим запустился, но результат не радует.
Проблема в чем?
Передается значение "дискретного" 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... Должен исчезнуть на час. Если поможете буду премного благодарен. Уже ум-за-разум заходит...
***
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.
Вот Ваш код:
Вы копируете от бара #0 три значения.
Кстати сразу ошибка - раз копируете три значения, то и результат нужно сравнивать с числом "3" - а вдруг скопировался всего один результат или только два???
Никто никому не должен. А тем более хранить :)
Я показал пример в посте 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", если что-то пошло не так.
Индикатор рисуется корректно - ни слов, ни замечаний нет! И распечатка значений на рисунке индикатора корректна.
Но данные в эксперт передаются некорректно!
Я правильно понимаю работу с массивами:
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_Fast_Val[1] содержит не данные предыдущего st_RSI_Fast_Val[0], а копию НОВОГО st_RSI_Fast_Val[0].