
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
В смысле чтоб сам эксперт получился бинарником, и мог запускаться и работать без терминала? Мне это нравится :)
И отвязка от винды тоже помогла бы, мне на арендованном впс нужно каждый месяц доплачивать за то что там винда установлена, можно было бы сэкономить без неё.
В смысле чтоб сам эксперт получился бинарником, и мог запускаться и работать без терминала? Мне это нравится :)
И отвязка от винды тоже помогла бы, мне на арендованном впс нужно каждый месяц доплачивать за то что там винда установлена, можно было бы сэкономить без неё.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Тесты на вычисление числа Pi для mql4, mql5, MSVC, Intel compilators
Alexey Volchanskiy, 2017.01.11 19:15
Теперь прикидываем, какой сотой доле процента трейдеров это нужно..Да, появится из важного:
Ну и конечно десятки других вещей, которые будут описаны в релизах.
Можно чуть подробнее про кастомные фиды, пожалуйста, как это будет выглядеть? У меня стоит вопрос о покупке дорогой софтины, например, а не хотелось бы.. а если будет прямой доступ к другим брокерским api в МТ5 то это вообще круто
#include <time.h>
int main()
{
clock_t t1 = time(NULL);
#define CNT 700000000
double x_sum = 0;
double y_sum = 0;
double xy_sum = 0;
double x2_sum = 0;
double ticks[9] = {0.00001, 0.00007, -0.00002, 0.00009, 0.00004, -0.00008, -0.00005, 0.00009, 0.00005};
double cur_y = 0;
for(unsigned i = 0; i < CNT; ++ i)
{
cur_y = cur_y + ticks[i%9];
x_sum += i;
y_sum += cur_y;
xy_sum += i*cur_y;
x2_sum += (double)i*i;
}
double num = CNT * xy_sum - x_sum * y_sum;
double den = CNT * x2_sum - x_sum * x_sum;
printf("execution time = %i sec\n", (int)(time(NULL)-t1));
printf("res = %f\nx_sum = %f\ny_sum = %f\nxy_sum = %f\nx2_sum = %f\n",
num/den, x_sum, y_sum, xy_sum, x2_sum);
}
execution time = 4 sec
res = 0.000022
x_sum = 244999999650000000.000000
y_sum = 5444444453002.445312
xy_sum = 2540740741014408396800.000000
x2_sum = 114333333088333677461504000.000000
МКЛ код:
{
uint t1 = GetTickCount();
#define CNT 700000000
double x_sum = 0;
double y_sum = 0;
double xy_sum = 0;
double x2_sum = 0;
double ticks[9] = {0.00001, 0.00007, -0.00002, 0.00009, 0.00004, -0.00008, -0.00005, 0.00009, 0.00005};
double cur_y = 0;
for(unsigned i = 0; i < CNT; ++ i)
{
cur_y = cur_y + ticks[i%9];
x_sum += i;
y_sum += cur_y;
xy_sum += i*cur_y;
x2_sum += (double)i*i;
}
double num = CNT * xy_sum - x_sum * y_sum;
double den = CNT * x2_sum - x_sum * x_sum;
printf("execution time = %i sec\n", (int)(GetTickCount()-t1)/1000);
printf("res = %f\nx_sum = %f\ny_sum = %f\nxy_sum = %f\nx2_sum = %f\n",
num/den, x_sum, y_sum, xy_sum, x2_sum);
return;
}
2017.02.01 04:29:08.386 temp___ (USDCHF,H1) execution time = 64 secмедленнее примерно в 16 раз.
x32, мт под вайном, Intel(R) Core(TM)2 Duo CPU P7350 @ 2.00GHz
Если делать что-то посложнее, чем складывать числа в регистрах, то результат становится не таким красивым (из-за проверки на выход за границы массива, думаю). Си шный код:
медленнее примерно в 16 раз.
x32, мт под вайном, Intel(R) Core(TM)2 Duo CPU P7350 @ 2.00GHz
В MQL5 упор только на новый развиваемый 64 битный компилятор, который в разы быстрее 32 битного. Забудьте про 32 битный код, как мы про него. 32 битная версия MQL5 использует старый компилятор, единый с MQL4. Об этом многократно писалось и объяснялось.
MSVC 2015 C++, x64, абсолютно полная оптимизация:
#include <windows.h>
#include <stdio.h>
#include <time.h>
#define CNT 700000000
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int main()
{
unsigned int t1=GetTickCount();
double x_sum=0;
double y_sum=0;
double xy_sum=0;
double x2_sum=0;
double ticks[9]={ 0.00001, 0.00007, -0.00002, 0.00009, 0.00004, -0.00008, -0.00005, 0.00009, 0.00005 };
double cur_y=0;
for(unsigned i=0; i < CNT; ++i)
{
cur_y=cur_y + ticks[i%9];
x_sum+=i;
y_sum+=cur_y;
xy_sum+=i*cur_y;
x2_sum+=(double)i*i;
}
double num=CNT * xy_sum - x_sum * y_sum;
double den=CNT * x2_sum - x_sum * x_sum;
printf("execution time = %u msec\n",GetTickCount()-t1);
printf("res = %f\nx_sum = %f\ny_sum = %f\nxy_sum = %f\nx2_sum = %f\n",num/den, x_sum, y_sum, xy_sum, x2_sum);
}
execution time = 1672 msec
res = 0.000022
x_sum = 244999999367108928.000000
y_sum = 5444444445431.175781
xy_sum = 2540740737455829286912.000000
x2_sum = 114333333088352626857213952.000000
void OnStart()
{
uint t1=GetTickCount();
double x_sum = 0;
double y_sum = 0;
double xy_sum = 0;
double x2_sum = 0;
double ticks[9]={0.00001,0.00007,-0.00002,0.00009,0.00004,-0.00008,-0.00005,0.00009,0.00005};
double cur_y=0;
for(unsigned i=0; i<CNT;++ i)
{
cur_y=cur_y+ticks[i%9];
x_sum += i;
y_sum += cur_y;
xy_sum += i*cur_y;
x2_sum += (double)i*i;
}
double num = CNT * xy_sum - x_sum * y_sum;
double den = CNT * x2_sum - x_sum * x_sum;
printf("execution time = %u msec\n",GetTickCount()-t1);
printf("res = %f\nx_sum = %f\ny_sum = %f\nxy_sum = %f\nx2_sum = %f\n",num/den,x_sum,y_sum,xy_sum,x2_sum);
}
2017.01.31 22:23:56.330 TestPi (Si-3.17,H1) execution time = 1422 msec
2017.01.31 22:23:56.330 TestPi (Si-3.17,H1)
2017.01.31 22:23:56.330 TestPi (Si-3.17,H1) res = 0.000022
2017.01.31 22:23:56.330 TestPi (Si-3.17,H1) x_sum = 244999999367108928.000000
2017.01.31 22:23:56.330 TestPi (Si-3.17,H1) y_sum = 5444444445431.175781
2017.01.31 22:23:56.330 TestPi (Si-3.17,H1) xy_sum = 2540740737455829286912.000000
2017.01.31 22:23:56.330 TestPi (Si-3.17,H1) x2_sum = 114333333088352626857213952.000000
То есть, ваш пример показал все наоборот. Не проигрыш в 16 раз, а выигрыш в 1.17 раз.
Это на Windows 10 Pro x64, Intel Xeon E5-2690 v3 @ 2.60GHz
Во первых, не надо никакого вайна ..
С удовольствием забыл про вайн, если бы была версия под Линукс. Я не утверждаю, что мой тест объективный и правильный, поделился наблюдениями. Я даже и не хотел измерить производительность, а проверял хватит ли ширины мантиссы у дабла для МНК, заодно прогнал в МКЛ.
MQL5 порвал C++ как Тузик грелку.
Если делать что-то посложнее, чем складывать числа в регистрах, то результат становится не таким красивым (из-за проверки на выход за границы массива, думаю). Си шный код:
МКЛ код:
медленнее примерно в 16 раз.
x32, мт под вайном, Intel(R) Core(TM)2 Duo CPU P7350 @ 2.00GHz
Скорость по твоему тесту одинаковая!!!!!!!!
Ясное дело, что на сложных вычислениях Си порвет МКЛ, на Си можно так же подключить C++ AMP, и/или OpenMP.
Но на мкл гораздо проще научиться писать(даже с учетом сильной похожести языков), т.к. полно встроенных функций, необходимых именно для написания робота или индикатора.
Я считаю, что у МКЛ достойная производительность, а если ее не хватает, то можно подключить прогу на С++, через Named Pipes. Или длл)
Renat Fatkhullin, опередил меня, но я не стал править исходники, а просто как есть скомпилил))