Как избежать "MetaTrader not responding" при обработки больших объёмов данных? - страница 2

 
fxsaber:

Тогда это не будет иметь отношения к ветке.

Вам шашечки или ехать? Если ставить ограничения, то решение, действительно трудно найти. Очень часто бывает так, что решение проблемы оказывается в другой плоскости, отличной от той, где зародилась проблема.

 
Ihor Herasko:

Вызвать из советника.

Из за специфики индикатора он не может бить вызван из советника.

 

Перенёс обработку на OnCalculate() и первый уровень цикла распределил исполнения на каждой свечи. Примерно так:

int countBars=-1;
int OnCalculate(...)
  {
   datetime TestStart=D'2016.06.10 23:00';
   if(TestStart<=Time[0])
     {
      countBars++;
     }
  }

 for(int i=0+countBars; i<=N && i<=countBars+1; i++)
  {
   Print(" 1 LEVEL Optim time: ",DoubleToStr((GetTickCount()-Time11)/1000,1)," sek");
   for(int i1=0; i1<=N1; i1++)
     {
      for(int i2=0; i2<=N2; i2++)
        {
         //....

Сейчас для того чтобы успеть обработать данных, надо затормозить приход свечей. Я так понял что это можно сделать с помощью EventChartCustom?

 
Nauris Zukas:

Перенёс обработку на OnCalculate() и первый уровень цикла распределил исполнения на каждой свечи. Примерно так:

Сейчас для того чтобы успеть обработать данных, надо затормозить приход свечей. Я так понял что это можно сделать с помощью EventChartCustom?

Думаю, архитектурно где-то неверный подход выбран для решения задачи.

 
fxsaber:

Думаю, архитектурно где-то неверный подход выбран для решения задачи.

+. В индикаторе в любом случае висеть терминал будет.
 
Комбинатор:
+. В индикаторе в любом случае висеть терминал будет.

Проблемы из за того что в последней функции я все собранные необходимые данные начинаю прогонять через многоуровневый цикл. Только эта последняя функция создают головную боль. Как вариант, я могу все собранные данные записать в файл и тогда уже из эксперта прочитать данные. В таком случае на эксперта будет навалена задача прогнать данные через многоуровневый цикл. Это как-то поможет? При этом мне не особо нравится то что изначальная задумка будет состоять из двух программ.

Может ещё какие-то решения?

 
Nauris Zukas:

Проблемы из за того что в последней функции я все собранные необходимые данные начинаю прогонять через многоуровневый цикл. Только эта последняя функция создают головную боль. Как вариант, я могу все собранные данные записать в файл и тогда уже из эксперта прочитать данные. В таком случае на эксперта будет навалена задача прогнать данные через многоуровневый цикл. Это как-то поможет? При этом мне не особо нравится то что изначальная задумка будет состоять из двух программ.

Может ещё какие-то решения?

Считайте порциями. Внутри циклов - проверять время, которое уже прошло в текущем событии и выходить по достижении лимита, например, 1-2 секунды. В следующем событии продолжить расчет с места, на котором он был приостановлен.

 
Nauris Zukas:

Проблемы из за того что в последней функции я все собранные необходимые данные начинаю прогонять через многоуровневый цикл. Только эта последняя функция создают головную боль. Как вариант, я могу все собранные данные записать в файл и тогда уже из эксперта прочитать данные. В таком случае на эксперта будет навалена задача прогнать данные через многоуровневый цикл. Это как-то поможет? При этом мне не особо нравится то что изначальная задумка будет состоять из двух программ.

Может ещё какие-то решения?


На мой взгляд, решение остается тем же - перенести код индикатора в эксперт. Не могу даже представить, по каким причинам эксперт не может выполнить ту же самую работу, что и индикатор. Понимаю, что, возможно, придется возиться с массивами, которые выполняют роль индикаторных буферов. Это задача не совсем легкая, но вполне выполнимая, не архисложная.

Эксперт в итоге не будет тормозить терминал. У него свой поток. К тому же появится возможность использования события OnTester().

P. S. Другое решение - попытаться оптимизировать код. Возможно, там есть еще куда ускориться.

 
Stanislav Korotky:

Считайте порциями. Внутри циклов - проверять время, которое уже прошло в текущем событии и выходить по достижении лимита, например, 1-2 секунды. В следующем событии продолжить расчет с места, на котором он был приостановлен.

Это в эксперте можно будет делать? Потому что в индикаторе это не прокатила.

 
Ihor Herasko:

На мой взгляд, решение остается тем же - перенести код индикатора в эксперт. Не могу даже представить, по каким причинам эксперт не может выполнить ту же самую работу, что и индикатор. Понимаю, что, возможно, придется возиться с массивами, которые выполняют роль индикаторных буферов. Это задача не совсем легкая, но вполне выполнимая, не архисложная.

Эксперт в итоге не будет тормозить терминал. У него свой поток. К тому же появится возможность использования события OnTester().

P. S. Другое решение - попытаться оптимизировать код. Возможно, там есть еще куда ускориться.

Если решение только эксперт, тогда ещё раз попробую сделать на базе эксперта или хотя бы сделать отдельный эксперт для чтения файла и прогона через многоуровневый цикл.

Причина обращения: