Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

ALGLIB - библиотека численного анализа - библиотека для MetaTrader 4

Просмотров:
13013
Рейтинг:
(53)
Опубликован:
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

Пакет содержит классы:

  1. CHighQualityRand - генератор случайных чисел высокой степени точности.
  2. CNearestNeighbor - построение и решения KD - деревьев.
ap.mqh Пакет так же содержит вспомогательные классы, необходимые для других пакетов.
bitconvert.mqh Классы и функции, которые являются базовыми в С++, но отсутствуют в качестве встроенных в MQL4:
  1. BitConverter - класс, преобразующий числа типа int и double в массив битов, и наоборот.
  2. CInfOrNaN - класс генерации "не чисел" и плюс/минус бесконечности, а также их генерации.
  3. ArrayReverse - функция обращения элементов массива.
  4. GetSelectionString - функция получения строки, собранной из элементов массива типа char.
  5. MathSign - функция вычисления знака числа.
  6. MathSinh - функция вычисления гиперболического синуса.
  7. MathCosh - функция вычисления гиперболического косинуса.
  8. MathTanh - функция вычисления гиперболического тангенса.
complex.mqh Определение complex - структуры для работы с комплексными числами.
dataanalysis.mqh Классы анализа данных:
  1. CBdSS - вычисление функций ошибок.
  2. CDForest - работа с лесами деревьев решений.
  3. CKMeans - кластеризация алгоритмом k-means++.
  4. CLDA - линейный дискриминантный анализ.
  5. CLinReg - линейная регрессия.
  6. CMLPBase - многослойный персептрон (нейронные сети).
  7. CLogit - множественная логит-регрессия.
  8. CMarkovCPD - цепи Маркова для данных о населении.
  9. CMLPTrain - обучение многослойного персептрона.
  10. CMLPE - ансамбли нейронных сетей.
  11. CPCAnalysis - метод главных компонент.
delegatefunctions.mqh Пакет содержит классы, созданные как замена для делегатов. Объекты этих классов - функции, которые оптимизируются в некоторых методах библиотеки.
diffequations.mqh Класс для решения обыкновенных дифференциальных уравнений:
  1. CODESolver - решение обыкновенных дифференциальных уравнений.
fasttransforms.mqh Классы быстрых преобразований:
  1. CFastFourierTransform - быстрое преобразование Фурье.
  2. CConv - свертка.
  3. CCorr - кросс-корреляция.
  4. CFastHartleyTransform - быстрое преобразование Хартли.
integration.mqh Классы численного интегрирования:
  1. CGaussQ - квадратурные формулы Гаусса.
  2. CGaussKronrodQ - квадратурные формулы Гаусса-Кронрода.
  3. CAutoGK - адаптивный интегратор.
interpolation.mqh Классы интерполяции, аппроксимации и численного дифференцирования:
  1. CIDWInt - интерполяция и аппроксимация по обратному средневзвешенному расстоянию.
  2. CRatInt - рациональная интерполяция.
  3. CPolInt - полиномиальная интерполяция.
  4. CSpline1D - одномерная сплайн-интерполяция.
  5. CLSFit - аппроксимация линейным или нелинейным МНК.
  6. CPSpline - параметрическая сплайн-интерполяция.
  7. CSpline2D - двухмерная сплайн-интерполяция.
linalg.mqh Классы вычисления некоторых операций линейной алгебры:
  1. COrtFac - QR/LQ декомпозиции, декомпозиции Хессенберга и двухдиагональных, трехдиагональных матриц.
  2. CEigenVDetect - нахождение собственных чисел и векторов.
  3. CMatGen - генерация случайных матриц.
  4. CTrFac - декомпозиция LU и декомпозиция Холецкого.
  5. CRCond - оценка числа обусловленности матрицы.
  6. CMatInv - обращение матрицы.
  7. CBdSingValueDecompose - сингулярное разложение бидиагональных матрицы.
  8. CSingValueDecompose - сингулярное разложение матрицы.
  9. CFbls - быстрые базовые линейные решения.
  10. CMatDet - вычисление определителя матрицы.
  11. CSpdGEVD - нахождение собственных чисел и векторов в обобщенных симметричных матрицах.
  12. CInverseUpdate - обращение и обновление матриц.
  13. CSchur - декомпозиция Исая Шура.
matrix.mqh Классы матриц: целочисленных, непрерывных и комплексных.
optimization.mqh Классы одномерной и многомерной оптимизации:
  1. CMinCG - оптимизация методом сопряженных градиентов.
  2. CMinBLEIC - оптимизация с линейными ограничениями в виде равенств и неравенств.
  3. CMinLBFGS - оптимизация способом последовательного построения и уточнения квадратичной модели функции.
  4. CMinQP - квадратичное программирование с линейными ограничениями в виде равенств и неравенств.
  5. CMinLM - оптимизация методом Левенберга-Марквардта.
  6. CMinComp - функции обратной совместимости.
solvers.mqh Классы решения систем линейных и нелинейных уравнений:
  1. CDenseSolver - решение систем линейных уравнений.
  2. CNlEq - решение систем нелинейных уравнений.
specialfunctions.mqh Классы функций распределения, интегралов, полиномов:
  1. CGammaFunc - Гамма-функция.
  2. CIncGammaF - неполная Гамма-функция.
  3. CBetaF - Бета-функция.
  4. CIncBetaF - неполная Бета-функция.
  5. CPsiF - пси-функция.
  6. CAiryF - функции Эйри.
  7. CBessel - функции Бесселя целого порядка.
  8. CJacobianElliptic - эллиптические функции Якоби.
  9. CDawson - интеграл Доусона.
  10. CTrigIntegrals - тригонометрические интегралы.
  11. CElliptic - эллиптические интегралы первого и второго рода.
  12. CExpIntegrals - экспоненциальные интегралы.
  13. CFresnel - интегралы Френеля.
  14. CHermite - полиномы Эрмита.
  15. CChebyshev - полиномы Чебышева.
  16. CLaguerre - полиномы Лагерра.
  17. CLegendre - полиномы Лежандра.
  18. CChiSquareDistr - хи-квадрат распределение.
  19. CBinomialDistr - биномиальное распределение.
  20. CNormalDistr - нормальное распределение.
  21. CPoissonDistr - распределение Пуассона.
  22. CStudenttDistr - t-распределение Стъюдента.
  23. CFDistr - F-распределение.
statistics.mqh Классы статистического анализа данных:
  1. CBaseStat - базовые статистические методы.
  2. CCorrTests - тест на значимость коэффициента корреляции.
  3. CJarqueBera - критерий Жака-Бера.
  4. CMannWhitneyU - U-критерий Манна-Уитни.
  5. CSignTest - критерий знаков.
  6. CStudentTests - t-тесты Стьюдента.
  7. CVarianceTests - F-тест и тест хи-квадрат.
  8. CWilcoxonSignedRank - W-критерий Уилкоксона.


Код:

Функции библиотеки имеют развернутые комментарии, с инструкциями об использовании.

//+------------------------------------------------------------------+
//| 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;
  }
//+------------------------------------------------------------------+

Получим примерно следующий результат:

Результат работы скрипта UseAlglib.mq4


ForsesMomentum ForsesMomentum

Пытаемся определить Тренд по Нескольким скользящим средним.

OBJ_EDIT_Example OBJ_EDIT_Example

Пример работы с графическим объектом OBJ_EDIT.

Actual Resistance Line Support Actual Resistance Line Support

Вывод актуальных линий сопротивления-поддержки

BSS 1_0 BSS 1_0

Простой советник на основе скользящих средних. Таймфрейм Н1.