Обсуждение статьи "Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее" - страница 4

 
fxsaber:

Нахрена?! Четко же ясны цели мат. библы

Нашли робастую мат. модель в R. Нашли - значит исследовали ее в R. А дальше уже готовое ИССЛЕДОВАННОЕ решение (торговый алгоритм фактически) с легкостью портируете с R на MQL за счет библы и этой статьи. Всякое Г.. машинного обучения - подгонка всегда для фин. рынков.
Писать замотаешься на MQl.)) Проще (и надежней)) вызвать нужный функционал непосредственно из R (и пр. )). Эти методы и Ренат озвучивал - не самые простые и современные, но есть. Скажем, как присоединить COM- объекты к MT? Частично можно (не всё) - (пардон) через прокладки)).
 
СанСаныч Фоменко:

Я чего-то не понимаю

Что является результатом обращения к указанной функции в MQL? Скаляр? вектор?

Вот что имеем на R

  n <- 2000

> k <- seq(0, n, by = 20)

> dbinom(k, n, pi/10, log = TRUE)

  [1]  -754.219687  -660.247472  -592.126636  -534.532344  -483.881605

  [6]  -438.460449  -397.256529  -359.600217  -325.015561  -293.146935

 [11]  -263.718651  -236.510862  -211.344286  -188.070044  -166.562645

 [16]  -146.714976  -128.434635  -111.641185   -96.264050   -82.240889

 [21]   -69.516303   -58.040813   -47.770020   -38.663934   -30.686405

 [26]   -23.804662   -17.988917   -13.212041    -9.449276    -6.678001

 [31]    -4.877524    -4.028903    -4.114796    -5.119322    -7.027950

> a<-dbinom(k, n, pi/10, log = TRUE)

> str(a)

 num [1:101] -754 -660 -592 -535 -484 ...

Т.е. обращение к функции в Rдает результат вектор, который можно нарисовать с помощью универсального метода plot 

> plot(a)

Положите обновленный файл в /Include/Math/Stat, пожалуйста.

В нем добавлена перегруженная функция для вектора + дополнительный параметр log_mode.

Вот аналог ваших расчетов, полностью совпадающий по результатам с R:

#include <Math/Stat/Binomial.mqh>

void OnStart(void)
  {
   double    vars[101];
   double    results[101];
   const int N=2000;
//---   
   for(int i=0;i<=N;i+=20)
      vars[i/20]=i;

   MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
      
   for(int i=0;i<ArraySize(results);i++)
      Print(results[i]);
//---
  }

Вывод:

-754.2196869142003
-660.2474717208812
-592.1266359491199
-534.5323437511825 
...

Сейчас ведем работу по добавлению векторных операций, чтобы максимально близко быть по синтаксису с R.

Конечно же, добавим массу новых юниттестов в поставку.

Файлы:
Binomial.mqh  19 kb
 

Кстати, заявления про полную оптимизированность на скорость математических библиотек в R сильно преувеличены.

Сказывается обычное написание кода в лоб и дикий системный оверхед из-за работы с динамическими объектами/сущностями.  В отличие от R, MQL5 оперирует четкими типизированными массивами и компилирует код в натив x64. Это дает огромное преимущество и позволяет выигрывать даже у DLL реализаций функций в R.


Вот тест на основе примера выше: R 3.3.1 x64

install.packages("microbenchmark")

library(microbenchmark)
n <- 2000
k <- seq(0,n,by=20)
res <- microbenchmark(a<-dbinom(k, n, pi/10, log = TRUE))
print(res)



Unit: microseconds
                                 expr    min     lq     mean median    uq    max neval
 a <- dbinom(k, n, pi/10, log = TRUE) 20.167 20.168 20.88726 20.469 20.77 35.819   100

тройной прогон показал минимум времени 20 микросекунд.

Аналогичный тест в MQL5:

#include <Math/Stat/Binomial.mqh>

void OnStart(void)
  {
   double    vars[101];
   double    results[101];
   const int N=2000;
//---   
   for(int i=0;i<=N;i+=20)
      vars[i/20]=i;

   ulong msc=GetMicrosecondCount();
   MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
   msc=GetMicrosecondCount()-msc;
      
   Print("Time: ",msc," msc");
//---
  }


2016.10.10 21:21:12.156 new (Si-12.16,H1)       Time: 10 msc

В MQL5 считается в два раза быстрее: 10 микросекунд против 20 микросекунд в R.

Расчет на i7-4930k, Windows 10 x64, MetaTrader 5 x64, без виртуалок и без посторонней нагрузки.

 
Renat Fatkhullin:

Кстати, заявления про полную оптимизированность на скорость математических библиотек в R сильно преувеличены.

Сказывается обычное написание кода в лоб и дикий системный оверхед из-за работы с динамическими объектами/сущностями.  В отличие от R, MQL5 оперирует четкими типизированными массивами и компилирует код в натив x64. Это дает огромное преимущество и позволяет выигрывать даже у DLL реализаций функций в R.


Вот тест на основе примера выше: R 3.3.1 x64

тройной прогон показал минимум времени 20 микросекунд.

Аналогичный тест в MQL5:

В MQL5 считается в два раза быстрее: 10 микросекунд против 20 микросекунд в R.

Расчет на i7-4930k, Windows 10 x64, MetaTrader 5 x64, без виртуалок и без посторонней нагрузки.

Поздравляю! Чистая победа, на обе лопатки.
 
Renat Fatkhullin:

Кстати, заявления про полную оптимизированность на скорость математических библиотек в R сильно преувеличены.

Сказывается обычное написание кода в лоб и дикий системный оверхед из-за работы с динамическими объектами/сущностями.  В отличие от R, MQL5 оперирует четкими типизированными массивами и компилирует код в натив x64. Это дает огромное преимущество и позволяет выигрывать даже у DLL реализаций функций в R.


Вот тест на основе примера выше: R 3.3.1 x64

тройной прогон показал минимум времени 20 микросекунд.

Аналогичный тест в MQL5:

В MQL5 считается в два раза быстрее: 10 микросекунд против 20 микросекунд в R.

Расчет на i7-4930k, Windows 10 x64, MetaTrader 5 x64, без виртуалок и без посторонней нагрузки.

а у меня ошибка((

'vars' - parameter conversion not allowed  

 
ivanivan_11:

а у меня ошибка((

'vars' - parameter conversion not allowed  

Нужно взять обновленный файл из https://www.mql5.com/ru/forum/97153/page4#comment_2882502

Там добавлена переопределенная функция для векторов.

 
Renat Fatkhullin:

Нужно взять обновленный файл из https://www.mql5.com/ru/forum/97153/page4#comment_2882502

Там добавлена переопределенная функция для векторов.

да,спасибо. так работает. у меня вот так получилось. сразу оговорюсь, МТ у меня из-под вайн работает, 32бит. потому какой будет ответ,я догадываюсь- 64бит быстрее)) чтобы не было путаницы - R тоже на 32 бит



 
ivanivan_11:

да,спасибо. так работает. у меня вот так получилось. сразу оговорюсь, МТ у меня из-под вайн работает, 32бит. потому какой будет ответ,я догадываюсь- 64бит быстрее))

Это не серьезно.

Под вайном, да еще 32 бита. Для 32 битов МТ5 используется старый компилятор, аналогичный MT4. Он в пару десятков раз медленнее 64 битного кода, который создает новый компилер специально для 64 битной версии МТ5. Отчет по сравнению скорости 32 и 64 битных MQL5 программ мы публиковали.

Каждая MQL5 программа на самом деле содержит две копии скомпилированного кода: 32 битная для старых систем ради совместимости и 64 битная для новых.

Мы полностью отказались от развития 32 битных компиляторов, так как это не имеет никакого смысла и будущего.

Поэтому надо использовать только 64 битные версии MetaTrader 5, если хотите получить максимум производительности.


Кстати, информация для тех, кто сидит на MT4 - там тоже скорость исполнения MQL4 кода в пару десятков раз медленнее, чем в 64 битном Метатрейдер 5.

 
Andrey Dik:
Поздравляю! Чистая победа, на обе лопатки.

расчёт вдвое быстрее чем аналогичный расчёт R с компиляцией (первый проход R - байт/или jit компиляция, поэтому у него max>1.5 avg а min~=avg) ?

что-ж, достижение.. :-)

 
Maxim Kuznetsov:

расчёт вдвое быстрее чем аналогичный расчёт R с компиляцией (первый проход R - байт/или jit компиляция, поэтому у него max>1.5 avg а min~=avg) ?

что-ж, достижение.. :-)

В R бралось минимальное время за множество запусков, а не первый запуск и максимальное время.

Так что нет, "холодный старт" тут не объясняет. Да еще в условиях, когда весь код библиотек в DLL. Разогревать практически нечего.

А вот что объясняет:

  1. Отсутствие оверхеда на динамических объектах как в R за счет работы с чисто типизированными данными double
  2. Жутко эффективный компилятор в MQL5. Реально страшно смотреть на результирующий asm код.
  3. Наличие MQL5 библиотек в исходном коде, что позволяет нативно инлайнить их код прямо в место вызова и максимально использовать const окружение вызываемого места.

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

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