Нужно больше кода чтобы более ясно стало где что не так ил
чего не хватает.
Можно просто на каждом тике использовать
но это ОЧЕНЬ ресурсоемко, и скорость тестирования эксперта существенно снижается.
Спасибо.
добавьте функцию появления нового бара - и копируйте когда он появляется
Я что то вообще запутался читая...
prevcalcilated и rates_total не используются в эксперте.Они в индикаторах.И там надо делать пересчет только последнего бара.
В эксперте же запрашивать столько баров сколько нужно.. 1-2-5...
CopyBuffer(ind_handle,0,0,5,buf); // получаем 5 баров
Я что то вообще запутался читая...
prevcalcilated и rates_total не используются в эксперте.Они в индикаторах.И там надо делать пересчет только последнего бара.
В эксперте же запрашивать столько баров сколько нужно.. 1-2-5...
CopyBuffer(ind_handle,0,0,5,buf); // получаем 5 баров
Спасибо за ответ, это я все понимаю. Попытаюсь объяснить попроще:
Функция CopyBuffer очень ресурсоемкая (по крайней мере лично у меня), и при получении через нее на каждом тике 2 баров или 500 - разница большая! это понятно.
Мне нужно на каждом тике пересчитывать скользящее среднее периодом 500. Для этого можно без проблем запрашивать CopyBuffer(ind_handle,0,0,500,buf). А я написал кучу кода, по которому я запрашиваю CopyBuffer(ind_handle,0,0,1,buf) и обновляю последний индекс в уже скопированном массиве или дописываю новый увеличивая размер массива. Разница при работе в эксперте существенная.
Но все-равно сильно громоздко и некрасиво получилось.... Зато, скорость высокая.
Создаете среднюю с периодом 500 в OnInit() и в OnTick() запрашивайте 1 бар...
Это если получать данные от функции iMA. А если я хочу делать расчеты сам?
Просто, как показывает практика, лучше запрограммировать все расчеты в классе, чем пользоваться встроенными функциями индикаторов, или вызывать свои через iCustom.
Это если получать данные от функции iMA. А если я хочу делать расчеты сам?
Вот теперь понял.
Раз вы считаете ,что ускорите , пожалуйста.Подумаю.
Вот теперь понял.
Раз вы считаете ,что ускорите , пожалуйста.Подумаю.
В принципе, я разобрался, напишу о своих наблюдениях:
Если говорить о скорости работы стандартных функций индикаторов, напр. iMA + CopyBuffer, и сравнивать ее с исходным кодом индикатора, перенесенного в эксперт, + CopyRates (ценовые данные), то скорость примерно одинаковая. К тому же, стандартные функции удобнее и экономичнее использовать, поэтому я остановился на iMA + CopyBuffer.
Оказывается, скорость существенно снижалась из-за частых обращений в коде эксперта к массиву значений индикатора ( CopyBuffer(ind_handle,0,0,5,buffer) ). То есть, если даже просто присвоить какой-либо переменной значение buffer[0], и работать уже с переменной, то скорость тестирования увеличивается.
Короче, насколько я вижу, сами частые обращения к массиву buffer[i] ресурсоемки.
Также, есть смысл пересчитывать индикаторы только на 1-ом баре (не нулевом). Это существенно повышает скорость.

- 2010.10.04
- Konstantin Gruzdev
- www.mql5.com

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Коллеги, подскажите по такому вопросу: решил перенести код индикатора в класс для дальнейшего использования в эксперте.
Проблема возникла при передаче классу массива ценовых данных &close[]: в индикаторе я его брал из функции OnCalculate() , и с каждым новым баром, поскольку переменная rates_total увеличивалась на 1, то и размер массива также увеличивался на 1.
Теперь в эксперте я пытаюсь сделать следующее:
Если эксперт только что запущен (первый тик), то prev_calculated == 0 (как в индикаторе), и мы получаем массив ценовых данных close размером rates_total.
Во время второго и последующих тиков, мне уже не нужно все копировать, я хочу только обновить последний бар, и, если появился новый, то добавить его последним (т.е. увеличить размер массива на 1).
Таким образом, все будет так как это было бы в индикаторе.
Как это сделать? То, что пытаюсь сделать я, неправильно, потому что функция CopyClose меняет размер массива в зависимости от количества скопированных данных, а мне нужно, чтобы новые данные добавлялись последними в массив (как в индикаторах).
Можно просто на каждом тике использовать
но это ОЧЕНЬ ресурсоемко, и скорость тестирования эксперта существенно снижается.
Спасибо.