Любый данные (числовые) можно положить в буфер индикатора. Начните с этого. Чтоб нужные данные были видны, если не на графике, то в окне данных (Ctrl+D).
А потом из советника просто возьмите значение нужного буфера на нужном баре.
Фид - это n-ое количество скользящих средних. Допустим 2000-и скользящих средних на нулевом баре.
То есть извлечь данные с индикатора, который высчитывает значение 50 - ой МА (пример) на нулевом баре.
Здравствуйте. Задача найти аналог параметру &Price для эксперта по подобию индикатора, то есть в первом коде все работает как надо, как организовать во втором, что подставить за место Price
//+------------------------------------------------------------------+//| Custom indicator iteration function Работает |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constint begin,
constdouble&price[])
{
//---
nBar=rates_total-1;
sm.Solve(rates_total,prev_calculated,price);
return(rates_total-1);
}
//+-----------------------------------------------------
объявляю в эксперте, выдает ошибку
MqlRates mrate[]; // Будет содержать цены, объемы и спред для каждого бара//--- Получить исторические данные последних 2000-х баровif(CopyRates(_Symbol,_Period,0,Pmax,mrate)<0)
{
Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
return;
}
sm.Solve(Mybars,Mybars-1,mrate[].close);
Тогда не надо хранить старые значения. На каждой итерации делаем 2000 сложений. Меньше никак.
Если надо не с периода 1 или 2 начать, тогда для минимального периода применять ускоренный алгоритм с хранением старого значения, а дальше только прибавлять.
Ускоренный алгоритм это два действия - отнять старое, прибавить новое. Значит если минимальный период больше от 4, то есть смысл в его использовании для минимального периода.
Andrey Khatimlianskii:
Тогда вам надо 2000 буферов, и по каждому из них экономно считать SMA ;)
Это будет экономнее по процессору, но затратнее по памяти.
Можно ускориться еще больше и при этом сократить используемую память по минимуму.
Идея в следующем: рассчитывать все требуемые периоды SMA на одном массиве данных (вернее на одном списке). Массив данных будет один - его длина будет равна периоду самой медленной MA. Параллельно хранится массив из, в данном случае, 2000 значений double, содержащих суммы ряда. При запросе значения MA с произвольным периодом, делается пересчет нужной суммы и ее средней, которая затем возвращается.
Естественно, такой алгоритм можно будет реализовать только с помощью классов, потому что внутренняя реализация будет весьма нетривиальной и базироваться на словарях (для быстрого доступа к произвольному индексу). Но скорость потенциально может быть просто феерической. При том выигрыш будет особенно заметен именно при расчете кластеров индикаторов (1000, 2000, 10000 индикаторов в одном флаконе).
З.Ы. Интерфейс класса будет примерно следующим:
CSMA SMA; //Создаем простую скользящую среднюю voidOnTick()
{
double last = SymbolInfoDouble(Symbol(), SYMBOL_LAST);
SMA.AddValue(last);
double sma_200 = SMA.GetValue(200); // Получаем значение скользящей средней с периодом усреднение 200 тиковdouble sma_100 = SMA.GetValue(100); // Получаем значение скользящей средней с периодом усреднение 100 тиков double sma_200 = SMA.GetValue(1328); // Получаем значение скользящей средней с периодом усреднение 1328 тиков
...
}
Период усреднения можно будет задавать произвольно, непосредственно перед получением значения. Никаких промежуточных расчетов выполнять не нужно (все расчеты будут выполнены за пользователя внутри класса).
Здравствуйте. Задача найти аналог параметру &Price для эксперта по подобию индикатора, то есть в первом коде все работает как надо, как организовать во втором, что подставить за место Price
объявляю в эксперте, выдает ошибку
Что за функция sm.Solve?
Вы скопировали Pmax элементов MqlRates. А что хотите передать?
Массива close нет, у вас массив MqlRates. Можете передать нужный close - mrate[index].close.
Что вы называете фидом?
Любый данные (числовые) можно положить в буфер индикатора. Начните с этого. Чтоб нужные данные были видны, если не на графике, то в окне данных (Ctrl+D).
А потом из советника просто возьмите значение нужного буфера на нужном баре.
Фид - это n-ое количество скользящих средних. Допустим 2000-и скользящих средних на нулевом баре.
То есть извлечь данные с индикатора, который высчитывает значение 50 - ой МА (пример) на нулевом баре.
numMa - это количество вычисляемого фида МА, то есть в индикаторе будет хранится значение заданного количества МА.(например 2000 значений периодов МА)
a - номер бара, на каком баре произвести расчет.
И что, работает?
Если нет, мои предыдущие советы остаются в силе.
И что, работает?
Если нет, мои предыдущие советы остаются в силе.
NaZnPrd - Значение пытаюсь присвоить нюлевому буферу, что то делаю не так?
NaZnPrd - Значение пытаюсь присвоить нюлевому буферу, что то делаю не так?
А что не получается? Не присваивается?
Упростите код, чтоб вы сами понимали, что он делает.
Начните с такого:
А потом усложняйте. Когда появится проблема, пишите конкретно о ней.
Потому что разбирать весь ваш код не интересно.
А что не получается? Не присваивается?
Упростите код, чтоб вы сами понимали, что он делает.
Начните с такого:
А потом усложняйте. Когда появится проблема, пишите конкретно о ней.
Потому что разбирать весь ваш код не интересно.
Да уж, удивляет что до сих пор отвечаете!)
Блин я уже просто не знаю, как ...
sm.d[numMa-1] - Задаем нужный период скользящей средней,или количество SMA для расчета.
m[a] - Задаем № бара.
sm.d[numMa-1].m[a] - по заданным параметрам получаем значение цены на требуемом баре, с требуемом периодом SMA
Как связать эту информацию, с буферами индикатора.
Чтоб было возможно вытащить эти значения через эксперт?
Да уж, удивляет что до сих пор отвечаете!)
Блин я уже просто не знаю, как ...
sm.d[numMa-1] - Задаем нужный период скользящей средней,или количество SMA для расчета.
m[a] - Задаем № бара.
sm.d[numMa-1].m[a] - по заданным параметрам получаем значение цены на требуемом баре, с требуемом периодом SMA
Как связать эту информацию, с буферами индикатора.
Чтоб было возможно вытащить эти значения через эксперт?
У вас в предыдущем коде были правильные строки:
Объявили массив, привязали его к буфферу, присвоили значение на определенном баре.
Чтоб присвоить значение для бара с индексом а, как в последнем примере, сделайте так:
NaZnPrd[a]=12345;Если нарисуется линия на уровне 12345, двигайтесь дальше - присваивайте на каждом баре новое значение.
Если и это выйдет, тогда присваивайте то, что вы посчитали в своих многоэтажных массивах )
Да уж, удивляет что до сих пор отвечаете!)
Здравствуйте. Задача найти аналог параметру &Price для эксперта по подобию индикатора, то есть в первом коде все работает как надо, как организовать во втором, что подставить за место Price
объявляю в эксперте, выдает ошибку
Тогда не надо хранить старые значения. На каждой итерации делаем 2000 сложений. Меньше никак.
Если надо не с периода 1 или 2 начать, тогда для минимального периода применять ускоренный алгоритм с хранением старого значения, а дальше только прибавлять.
Ускоренный алгоритм это два действия - отнять старое, прибавить новое. Значит если минимальный период больше от 4, то есть смысл в его использовании для минимального периода.
Тогда вам надо 2000 буферов, и по каждому из них экономно считать SMA ;)
Это будет экономнее по процессору, но затратнее по памяти.
Можно ускориться еще больше и при этом сократить используемую память по минимуму.
Идея в следующем: рассчитывать все требуемые периоды SMA на одном массиве данных (вернее на одном списке). Массив данных будет один - его длина будет равна периоду самой медленной MA. Параллельно хранится массив из, в данном случае, 2000 значений double, содержащих суммы ряда. При запросе значения MA с произвольным периодом, делается пересчет нужной суммы и ее средней, которая затем возвращается.
Естественно, такой алгоритм можно будет реализовать только с помощью классов, потому что внутренняя реализация будет весьма нетривиальной и базироваться на словарях (для быстрого доступа к произвольному индексу). Но скорость потенциально может быть просто феерической. При том выигрыш будет особенно заметен именно при расчете кластеров индикаторов (1000, 2000, 10000 индикаторов в одном флаконе).
З.Ы. Интерфейс класса будет примерно следующим:
Период усреднения можно будет задавать произвольно, непосредственно перед получением значения. Никаких промежуточных расчетов выполнять не нужно (все расчеты будут выполнены за пользователя внутри класса).
Здравствуйте. Задача найти аналог параметру &Price для эксперта по подобию индикатора, то есть в первом коде все работает как надо, как организовать во втором, что подставить за место Price
объявляю в эксперте, выдает ошибку
Что за функция sm.Solve?
Вы скопировали Pmax элементов MqlRates. А что хотите передать?
Массива close нет, у вас массив MqlRates. Можете передать нужный close - mrate[index].close.
А если нужен массив клоузов - используйте CopyClose().