Ошибки, баги, вопросы - страница 2221

 
Koldun Zloy:

Такие примитивные рассуждения не годятся для современных процессоров.

Вам виднее. У Вас ж опыта больше...

 


Koldun Zloy
:

Такие примитивные рассуждения не годятся для современных процессоров.

Ну а если по существу, то, извините, но Вы бредите. 

Ни в одном из существующих ныне процессоров никогда не будет такое  

for(i=0;i<=npoints-1;i++)

работать быстрее в сравнении с

for(i=0;i<npoints;i++)

, доступ к массиву никогда не будет происходить быстрее, чем к простой переменной,

три одинаковых цикла никогда не будут отрабатывать быстрее чем один объединенный. 


Я не поленился и протестировал на скорость два различных варианта непосредственно в первоисточнике ALGLIB, чтобы не быть голословным :

      e=0;
      double tmp1;
      ulong t=GetMicrosecondCount();
      for(i=0;i<npoints;i++)
        {
         v=0.0;
         for(i_=0;i_<nvars;i_++)
           {
            tmp1=xy[i][i_]-ct[xyc[i]][i_];
            v+=tmp1*tmp1;
           }
         e=e+v;
        }
      t=GetMicrosecondCount()-t;
      Print("fast = "+(string)t+" микросекунд, e = "+DoubleToString(e) + " , npoints = " + (string)npoints+" , nvars = " + (string)nvars );



      e=0;
      t=GetMicrosecondCount();
      for(i=0;i<=npoints-1;i++)
        {
         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=xy[i][i_];
         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=tmp[i_]-ct[xyc[i]][i_];
         //--- calculation
         v=0.0;
         for(i_=0;i_<=nvars-1;i_++)
            v+=tmp[i_]*tmp[i_];
         e=e+v;
        }
      t=GetMicrosecondCount()-t;
      Print("slow = "+(string)t+" микросекунд, e = "+DoubleToString(e) + " , npoints = " + (string)npoints+" , nvars = " + (string)nvars );

результат:

2018.06.27 04:36:50.265 TestClasses (GBPUSD,M6) fast = 571 микросекунд, e = 534.47773777 , npoints = 1500 , nvars = 40
2018.06.27 04:36:50.266 TestClasses (GBPUSD,M6) slow = 841 микросекунд, e = 534.47773777 , npoints = 1500 , nvars = 40
2018.06.27 04:36:50.630 TestClasses (GBPUSD,M6) fast = 577 микросекунд, e = 531.85904819 , npoints = 1500 , nvars = 40
2018.06.27 04:36:50.631 TestClasses (GBPUSD,M6) slow = 812 микросекунд, e = 531.85904819 , npoints = 1500 , nvars = 40
2018.06.27 04:36:51.143 TestClasses (GBPUSD,M6) fast = 599 микросекунд, e = 537.42685690 , npoints = 1500 , nvars = 40
2018.06.27 04:36:51.144 TestClasses (GBPUSD,M6) slow = 853 микросекунд, e = 537.42685690 , npoints = 1500 , nvars = 40
2018.06.27 04:36:51.955 TestClasses (GBPUSD,M6) fast = 600 микросекунд, e = 531.17444713 , npoints = 1500 , nvars = 40
2018.06.27 04:36:51.956 TestClasses (GBPUSD,M6) slow = 809 микросекунд, e = 531.17444713 , npoints = 1500 , nvars = 40
2018.06.27 04:36:52.344 TestClasses (GBPUSD,M6) fast = 567 микросекунд, e = 540.39509565 , npoints = 1500 , nvars = 40
2018.06.27 04:36:52.344 TestClasses (GBPUSD,M6) slow = 813 микросекунд, e = 540.39509565 , npoints = 1500 , nvars = 40
2018.06.27 04:36:52.857 TestClasses (GBPUSD,M6) fast = 690 микросекунд, e = 550.68494369 , npoints = 1500 , nvars = 40
2018.06.27 04:36:52.858 TestClasses (GBPUSD,M6) slow = 820 микросекунд, e = 550.68494369 , npoints = 1500 , nvars = 40
2018.06.27 04:36:53.229 TestClasses (GBPUSD,M6) fast = 585 микросекунд, e = 547.94313745 , npoints = 1500 , nvars = 40
2018.06.27 04:36:53.230 TestClasses (GBPUSD,M6) slow = 811 микросекунд, e = 547.94313745 , npoints = 1500 , nvars = 40
2018.06.27 04:36:53.736 TestClasses (GBPUSD,M6) fast = 560 микросекунд, e = 568.39404456 , npoints = 1500 , nvars = 40
2018.06.27 04:36:53.737 TestClasses (GBPUSD,M6) slow = 813 микросекунд, e = 568.39404456 , npoints = 1500 , nvars = 40

Т.е. видно, что выигрыш в скорости более 40%.

Файлы:
dataanalysis.mqh  1150 kb
TestClasses.mqh  2762 kb
 
Nikolai Semko:

Ну а если по существу, то, извините, но Вы бредите. 

Ни в одном из существующих ныне процессоров никогда не будет такое  

работать быстрее в сравнении с

, доступ к массиву никогда не будет происходить быстрее, чем к простой переменной,

три одинаковых цикла никогда не будут отрабатывать быстрее чем один объединенный. 


Я не поленился и протестировал на скорость два различных варианта непосредственно в первоисточнике ALGLIB, чтобы не быть голословным :

результат:

Т.е. видно, что выигрыш в скорости более 40%.

Спасибо за тест! Думаю это не только в MQL но и на всех языках будет работать быстрее.

Про причины думал и ничего другого, как то , что программист писавший это получал зарплату не просто за работающую программу, а за количество строк. Ведь программка с 500 строками, не так впечатляет заказчика, как программа с 5000 строк. Жаль, что скорость и читаемость кода от этого пострадала.

 
elibrarius:
Думаю это не только в MQL но и на всех языках будет работать быстрее.

Конечно.

 
обратил внимание при авторизации на MQL выдает ошибку  при этом в статусе браузера висит долгий ответ(наверно авторизация) от фэйсбука
 
SEM:

Синтетический инструмент. Импортирую минутные бары, каждый минутный бар отличается на 1 пункт (5 знаков).

Закрываю окно с символами, потом повторно открываю данное окно, запрашиваю минутные бары у предыдущей загрузки, получаю

 

Символы на каждые целые сутки одинаковые. В чем ошибка?

Стабильно воспроизводится ? Какой билд?

 
Alexander:

Стабильно воспроизводится ? Какой билд?

Да, проблема воспроизводиться. Версия 1870.
 

Вопрос.

Допустим я в эксперте или индикаторе работаю по нескольким символам, точнее по всем символам, которые отображены в окне "Обзор рынка". 

Задача заключается в том, чтобы поймать момент нового тика по любому из символов.

Пока вижу только пару вариантов:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)
  2. в каждом символе в OnTick (или OnCalculate) генерировать пользовательское событие через EventChartCustom

Недостатком первого варианта является неоптимальность в плане ресурсов и актуальности данных. OnTimer в основном будет молотить в холостую, а когда поймает новую котировку, погрешность времени прихода будет равняться периодичности таймера.

Недостатком второго варианта является громоздкость, особенно если символов несколько десятков. 

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

 
Nikolai Semko:

Вопрос.

Допустим я в эксперте или индикаторе работаю по нескольким символам, точнее по всем символам, которые отображены в окне "Обзор рынка". 

Задача заключается в том, чтобы поймать момент нового тика по любому из символов.

Пока вижу только пару вариантов:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)
  2. в каждом символе в OnTick (или OnCalculate) генерировать пользовательское событие через EventChartCustom

Недостатком первого варианта является неоптимальность в плане ресурсов и актуальности данных. OnTimer в основном будет молотить в холостую, а когда поймает новую котировку, погрешность времени прихода будет равняться периодичности таймера.

Недостатком второго варианта является громоздкость, особенно если символов несколько десятков. 

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

Может это поможет? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Синтетические инструменты с котировками в реальном времени

Торговая платформа позволяет создавать синтетические финансовые инструменты — инструменты на основе одного или нескольких имеющихся. Нужно просто задать формулу для расчета котировок, и платформа в режиме реального времени будет генерировать тики синтетического инструмента, а также создаст его минутную историю.
Как это происходит

    Вы создаете синтетический инструмент и задаете для него формулу.
    Платформа будет рассчитывать его тики с частотой 10 раз в секунду (и только если изменилась цена хотя бы одного инструмента, входящего в формулу).
 
SEM:

Может это поможет? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Синтетические инструменты с котировками в реальном времени

Торговая платформа позволяет создавать синтетические финансовые инструменты — инструменты на основе одного или нескольких имеющихся. Нужно просто задать формулу для расчета котировок, и платформа в режиме реального времени будет генерировать тики синтетического инструмента, а также создаст его минутную историю.
Как это происходит

    Вы создаете синтетический инструмент и задаете для него формулу.
    Платформа будет рассчитывать его тики с частотой 10 раз в секунду (и только если изменилась цена хотя бы одного инструмента, входящего в формулу).

Да, конечно, такой вариант тоже имеет право на жизнь. Спасибо!
Но, по сути, это тоже самое что и мой вариант под № 1 с периодичностью таймера 100 мс и с теми же недостатками.

Все же вариант № 2 мне видится более рациональным. 

Кстати, я вспомнил, что второй вариант уже обсуждался вот здесь.