Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 13184
- Рейтинг:
- Опубликован:
- 2013.12.18 10:31
- Обновлен:
- 2023.09.12 10:09
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Реальный автор:
Сергей Бочканов. Сайт проекта ALGLIB - http://www.alglib.net/. История библиотеки берет своё начало в далеком 1999 году.
Примечание: Библиотека работает на MetaTrader 4 build 555 и выше.
Для работы нужно распаковать архив в папку: каталог_данных_терминала.
Коды библиотеки размещаются в папке: каталог_данных_терминала\Math\Alglib\
Примеры тестовых скриптов можно найти в папке: каталог_данных_терминала\MQL4\Scripts\Alglib\
ALGLIB - одна из самых больших и полных математических библиотек
Вам необходимо произвести быстрое Фурье-преобразование? Решить систему дифференциальных уравнений? Или произвести сложный анализ данных? И чтобы все методы были собраны в одном месте, да еще и в исходном коде? Тогда выбирайте библиотеку численных методов ALGLIB!
На сегодняшний день ALGLIB является одной из лучших библиотек алгоритмов, написанных на нескольких языках. Вот что говорится о ней на официальном сайте проекта:
ALGLIB - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). Возможности ALGLIB включают в себя:
- Линейную алгебру (прямые алгоритмы, EVD, SVD)
- Решение систем уравнений (линейных и нелинейных)
- Интерполяцию
- Оптимизацию
- FFT
- Численное интегрирование
- Линейную и нелинейную аппроксимацию по МНК
- Решение обыкновенных ДУ
- Вычисление специальных функций
- Статистику (описательную статистику и проверку гипотез)
- Анализ данных - классификацию, регрессию, в т.ч. с использованием нейронных сетей
- Реализацию алгоритмов линейной алгебры, интерполяции и т.д. в арифметике высокой точности (с использованием MPFR)
За что выбрать ALGLIB? За то, что библиотека ALGLIB:
- переносима. Она может быть откомпилирована практически на любой платформе с использованием практически любого компилятора.
- проста в использовании. Поддерживает много языков программирования. Если вы используете один язык, вы не должны изучать другой (например, FORTRAN) чтобы откомпилировать внешнюю библиотеку.
- распространяется вместе с исходным кодом. И может быть использована на условиях GPL 2+.
- подходит и для коммерческих пользователей. Те, кто хочет использовать ALGLIB в коммерческой программе, могут купить коммерческую лицензию
Большим плюсом проекта ALGLIB является то, что библиотека постоянно развивается, добавляются новые функции и вносятся исправления по замечаниям пользователей. Последняя текущая версия 3.6.0.
Кроме того, библиотека ALGLIB содержит огромный набор тесткейсов, максимально покрывающих функционал предлагаемых методов. Это позволит вам самостоятельно произвести тесты и сообщить о найденных ошибках авторам проекта.
Здесь представлен представлен перевод ALGLIB версии 3.5.0.
Для работы с библиотекой нужно использовать статические функции класса CAlglib - все функции библиотеки для удобства вынесены в системный класс CAlgib в виде статических функций.
Помимо небольшого демонстрационного скрипта usealglib.mq4, прилагаются переведенные скрипты-тесткейсы - testclasses.mq4 и testinterfaces.mq4. Для запуска тесткейсов используются одноименные включаемые файлы testclasses.mqh и testinterfaces.mqh, которые должны находиться в папке \MQL4\Scripts\Alglib\Testcases\.
Внимание: Выполнение скрипта testclasses.mq4 занимает продолжительное время (около 30 минут).
Подробнее о пакетах портированной библиотеки ALGLIB MQL4:
Пакеты | Описание |
---|---|
alglib.mqh | Главный пакет библиотеки, включает в себя пользовательские функции. Именно к этим функциям нужно обращаться для работы с библиотекой. |
alglibinternal.mqh | Вспомогательные классы, которые необходимы для работы других пакетов библиотеки. |
alglibmisc.mqh | Пакет содержит классы:
|
ap.mqh | Пакет так же содержит вспомогательные классы, необходимые для других пакетов. |
bitconvert.mqh | Классы и функции, которые являются базовыми в С++, но отсутствуют в качестве встроенных в MQL4:
|
complex.mqh | Определение complex - структуры для работы с комплексными числами. |
dataanalysis.mqh | Классы анализа данных:
|
delegatefunctions.mqh | Пакет содержит классы, созданные как замена для делегатов. Объекты этих классов - функции, которые оптимизируются в некоторых методах библиотеки. |
diffequations.mqh | Класс для решения обыкновенных дифференциальных уравнений:
|
fasttransforms.mqh | Классы быстрых преобразований:
|
integration.mqh | Классы численного интегрирования:
|
interpolation.mqh | Классы интерполяции, аппроксимации и численного дифференцирования:
|
linalg.mqh | Классы вычисления некоторых операций линейной алгебры:
|
matrix.mqh | Классы матриц: целочисленных, непрерывных и комплексных. |
optimization.mqh | Классы одномерной и многомерной оптимизации:
|
solvers.mqh | Классы решения систем линейных и нелинейных уравнений:
|
specialfunctions.mqh | Классы функций распределения, интегралов, полиномов:
|
statistics.mqh | Классы статистического анализа данных:
|
Код:
Функции библиотеки имеют развернутые комментарии, с инструкциями об использовании.
//+------------------------------------------------------------------+ //| Calculation of the distribution moments: mean, variance, | //| skewness, kurtosis. | //| INPUT PARAMETERS: | //| X - sample | //| N - N>=0, sample size: | //| * if given, only leading N elements of X are | //| processed | //| * if not given, automatically determined from | //| size of X | //| OUTPUT PARAMETERS | //| Mean - mean. | //| Variance- variance. | //| Skewness- skewness (if variance<>0; zero otherwise). | //| Kurtosis- kurtosis (if variance<>0; zero otherwise). | //+------------------------------------------------------------------+ static bool CBaseStat::SampleMoments(const double &cx[],const int n,double &mean, double &variance,double &skewness,double &kurtosis) { //--- check if(!CAp::Assert(n>=0,__FUNCTION__+": the error variable")) return(false); //--- check if(!CAp::Assert(CAp::Len(cx)>=n,__FUNCTION__+": length(x)<n")) return(false); //--- check if(!CAp::Assert(CApServ::IsFiniteVector(cx,n),__FUNCTION__+": x is not finite vector")) return(false); //--- create variables double v=0; double v1=0; double v2=0; double stddev=0; //--- Init, special case 'N=0' mean=0; variance=0; skewness=0; kurtosis=0; //--- check if(n<=0) return(true); //--- Mean for(int i=0;i<n;i++) mean+=cx[i]; mean/=n; //--- Variance (using corrected two-pass algorithm) if(n!=1) { //--- calculation for(int i=0;i<n;i++) v1+=CMath::Sqr(cx[i]-mean); for(int i=0;i<n;i++) v2+=cx[i]-mean; v2=CMath::Sqr(v2)/n; variance=(v1-v2)/(n-1); //--- calculation stddev=MathSqrt(variance); } else variance=EMPTY_VALUE; //--- Skewness and kurtosis if(stddev!=0) { //--- calculation for(int i=0;i<n;i++) { v=(cx[i]-mean)/stddev; v2=CMath::Sqr(v); skewness+=v2*v; kurtosis+=CMath::Sqr(v2); } //--- change values skewness=skewness/n; kurtosis=kurtosis/n-3; } //--- successful execution return(true); }
Для работы с библиотекой нужно использовать статические функции класса CAlglib. Приведем исходный код скрипта функций usealglib.mq4 для вычисления некоторых статистических параметров торговли:
//+------------------------------------------------------------------+ //| UseAlglib.mq4 | //| Copyright 2012, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Подключение библиотек | //+------------------------------------------------------------------+ #include <Math\Alglib\alglib.mqh> #include <Arrays\ArrayDouble.mqh> //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- объект для хранения прибыли/убытка по каждой сделке CArrayDouble *profit=new CArrayDouble; //--- объекты для хранения баланса CArrayDouble *balance_total=new CArrayDouble; //--- первоначальный баланс double balance=0; //--- получение истории //--- общее количество закрытых ордеров int orders_total=OrdersHistoryTotal(); //--- получение данных о прибыли и балансе for(int i=0;i<orders_total;i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Ошибка при доступе к исторической базе (",GetLastError(),")"); return; } int order_type=OrderType(); //--- получение первоначального баланса if(order_type==6) // OP_BALANCE=6 { if(NormalizeDouble(OrderProfit()+OrderSwap(),2)>=0.0) if(balance==0.0) balance=OrderProfit(); } //--- получение прибыли и баланса if(order_type==OP_BUY || order_type==OP_SELL) { double order_profit=OrderProfit()+OrderSwap()+OrderCommission(); profit.Add(NormalizeDouble(order_profit,2)); balance_total.Add(balance); balance=balance+NormalizeDouble(order_profit,2); } } //--- balance_total.Add(balance_total.At(balance_total.Total()-1)+profit.At(balance_total.Total()-1)); //--- копирование данных баланса в массив типа double double arr_balance[]; ArrayResize(arr_balance,balance_total.Total()); for(int i=0;i<balance_total.Total();i++) arr_balance[i]=balance_total.At(i); //--- копирование данных прибыли в массив типа double double arr_profit[]; ArrayResize(arr_profit,profit.Total()); for(int i=0;i<profit.Total();i++) arr_profit[i]=profit.At(i); //--- линейная регресcия //--- количество независимых переменных int nvars=1; //--- объем выборки int npoints=balance_total.Total(); //--- создание матрицы параметров для линейной регрессии CMatrixDouble xy(npoints,nvars+1); for(int i=0;i<npoints;i++) { xy[i].Set(0,i); xy[i].Set(1,arr_balance[i]); } //--- переменная, для определения результата вычислений (успешный, неуспешный) int info; //--- объекты классов, необходимые для хранения информации о вычислениях CLinearModelShell lm; CLRReportShell ar; //--- массивы для хранения результатов регрессии double lr_coeff[]; double lr_values[]; ArrayResize(lr_values,npoints); //--- вычисление коэффициентов линейной регрессии CAlglib::LRBuild(xy,npoints,nvars,info,lm,ar); //--- получение коэффициентов линейной регрессии CAlglib::LRUnpack(lm,lr_coeff,nvars); //--- получение восстановленных значений линейной регрессии for(int i=0;i<npoints;i++) lr_values[i]=lr_coeff[0]*i+lr_coeff[1]; //--- вычисление Expected Payoff double exp_payoff,tmp1,tmp2,tmp3; CAlglib::SampleMoments(arr_profit,exp_payoff,tmp1,tmp2,tmp3); //--- вычисление массива HPR double HPR[]; ArrayResize(HPR,balance_total.Total()-1); for(int i=0;i<balance_total.Total()-1;i++) HPR[i]=balance_total.At(i+1)/balance_total.At(i); //--- вычисление стандартного отклонения и мат.ожидания от HPR double AHPR,SD; CAlglib::SampleMoments(HPR,AHPR,SD,tmp2,tmp3); SD=MathSqrt(SD); //--- вычисление LR Correlation double lr_corr=CAlglib::PearsonCorr2(arr_balance,lr_values); //--- получение LR Standard Error double lr_stand_err=0; for(int i=0;i<npoints;i++) { double delta=MathAbs(arr_balance[i]-lr_values[i]); lr_stand_err=lr_stand_err+delta*delta; } lr_stand_err=MathSqrt(lr_stand_err/(npoints-2)); //--- вычисление Sharpe Ratio double sharpe_ratio=(AHPR-1)/SD; //--- печать PrintFormat("-----------------------------------------------"); PrintFormat("Функция зависимости: y = %.2fx + %.2f",lr_coeff[0],lr_coeff[1]); //--- параметры PrintFormat("Expected Payoff = %.2f",exp_payoff); PrintFormat("AHPR = %.4f",AHPR); PrintFormat("Sharpe Ratio = %.2f",sharpe_ratio); PrintFormat("LR Correlation = %.2f",lr_corr); PrintFormat("LR Standard Error = %.2f",lr_stand_err); PrintFormat("-----------------------------------------------"); //--- удаление объектов delete profit; delete balance_total; } //+------------------------------------------------------------------+
Получим примерно следующий результат:
![ForsesMomentum](https://c.mql5.com/i/code/indicator.png)
Пытаемся определить Тренд по Нескольким скользящим средним.
![OBJ_EDIT_Example](https://c.mql5.com/i/code/expert.png)
Пример работы с графическим объектом OBJ_EDIT.
![Actual Resistance Line Support](https://c.mql5.com/i/code/indicator.png)
Вывод актуальных линий сопротивления-поддержки
![BSS 1_0](https://c.mql5.com/i/code/expert.png)
Простой советник на основе скользящих средних. Таймфрейм Н1.