вопрос по копированию ценовых данных в эксперте

 

Коллеги, подскажите по такому вопросу: решил перенести код индикатора в класс для дальнейшего использования в эксперте.

Проблема возникла при передаче классу массива ценовых данных &close[]: в индикаторе я его брал из функции OnCalculate() , и с каждым новым баром, поскольку переменная rates_total увеличивалась на 1, то и размер массива также увеличивался на 1.

Теперь в эксперте я пытаюсь сделать следующее:

   if(prev_calculated==0) bars=rates_total;
   else bars=rates_total-prev_calculated;
   //---
   int copied_c=CopyClose(m_symbol.Name(),0,0,bars,close);
   //---
   Print(ArraySize(close));
   

Если эксперт только что запущен (первый тик), то prev_calculated == 0 (как в индикаторе), и мы получаем массив ценовых данных close размером rates_total.

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

Таким образом, все будет так как это было бы в индикаторе.

Как это сделать? То, что пытаюсь сделать я, неправильно, потому что функция CopyClose меняет размер массива в зависимости от количества скопированных данных, а мне нужно, чтобы новые данные добавлялись последними в массив (как в индикаторах).

 Можно просто на каждом тике использовать 

CopyClose(m_symbol.Name(),0,0,rates_total,close);

 но это ОЧЕНЬ ресурсоемко, и скорость тестирования эксперта существенно снижается.

Спасибо. 

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Нужно больше кода чтобы более ясно стало где что не так ил

чего не хватает.



Alex5757000:

 Можно просто на каждом тике использовать 

 но это ОЧЕНЬ ресурсоемко, и скорость тестирования эксперта существенно снижается.

Спасибо. 

 


добавьте функцию появления нового бара - и копируйте когда он появляется

 

Я что то вообще запутался читая...

prevcalcilated и rates_total не используются в эксперте.Они в индикаторах.И там надо делать пересчет только последнего бара.

В эксперте же запрашивать столько баров сколько нужно.. 1-2-5...

CopyBuffer(ind_handle,0,0,5,buf);   // получаем 5 баров  

 
Karlson:

Я что то вообще запутался читая...

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 бар...
 
Karlson:
Создаете среднюю с периодом 500 в OnInit()  и в OnTick() запрашивайте 1 бар...

Это если получать данные от функции iMA. А если я хочу делать расчеты сам?

Просто, как показывает практика, лучше запрограммировать все расчеты в классе, чем пользоваться встроенными функциями индикаторов, или вызывать свои через iCustom.

 

тогда вам сюда - https://www.mql5.com/7qq

сделают как вам нужно

MQL5 работа
MQL5 работа
  • www.mql5.com
Заказы на разработку программ для трейдинга
 
Im_hungry:

тогда вам сюда - https://www.mql5.com/7qq

сделают как вам нужно

туда мне точно не нужно :-)
 
Alex5757000:

Это если получать данные от функции iMA. А если я хочу делать расчеты сам?

Вот теперь понял.

Раз вы считаете ,что ускорите , пожалуйста.Подумаю. 

 
Karlson:

Вот теперь понял.

Раз вы считаете ,что ускорите , пожалуйста.Подумаю. 

В принципе, я разобрался, напишу о своих наблюдениях:

Если говорить о скорости работы стандартных функций индикаторов, напр. 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
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.