Гамма-функция

 

Хотелось бы увидеть более оптимальные методы расчета Гамма-функции

Решение в лоб есть

Для расчета использовалась следующая формула http://dic.academic.ru/pictures/enc_mathematics/010404-184.jpg

//+------------------------------------------------------------------+
//|                                                      GAMMA-F.mq4 |
//|                     Copyright © 2011, Victor Niclolaev aka Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Victor Niclolaev aka Vinin"
#property link      "vinin@mail.ru"
#property show_inputs 

extern double Z=1;
extern double Error=0.001;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start() {

   double Res=Gamma(Z);
   Print("Значение Гамма-функции для ",DoubleToStr(Z,8)," равно ", DoubleToStr(Res,8));
   

   return(0);
}
//+------------------------------------------------------------------+

double Gamma(double Z){
   double Res=0;
   
   double Res11=1.0,          Res12=Z*(1.0+Z);
   double Res21=MathPow(2,Z), Res22=Res12*(1.0+Z/2.0);
   
   double Res1=Res11/Res12;
   double Res2=Res21/Res22;
   int N=2;
   while (MathAbs(Res1-Res2)>Error) {
      N++;
      Res11=Res21;
      Res12=Res22;
      Res21=MathPow(N,Z);
      Res22=Res22*(1+Z/N);
      Res1=Res2;
      Res2=Res21/Res22;
   }
   Res=(Res1+Res2)*0.5;
   return(Res);
}
 

А вы можете помочь со скриптом МТ4 (универсальный расчет для любого инструмента, как в статье https://www.mql5.com/ru/articles/113?source=metaeditor_article, но для МТ4), который на входе получает лот, валютную пару, цену и направление сделки, sl, tp. Потом определяет и выводит выводит в левом верхнем углу плечо для счета, необходимый размер залога, потери по sl в деньгах и процентах от депозита, прибыль по tp в деньгах и процентах от депозита, спред и потери на спред в деньгах и процентах от депозита?

P.S. А с меня другой способ расчета функции...

 
Vinin:

Хотелось бы увидеть более оптимальные методы расчета Гамма-функции

http://algolist.manual.ru/maths/count_fast/gamma_function.php

 
Приближенный метод: http://www.dsplib.ru/content/gamma/gamma.html
 

Большое спасибо.
 

Второй вариант расчета

//+------------------------------------------------------------------+
//|                                                      GAMMA-F.mq4 |
//|                     Copyright © 2011, Victor Niclolaev aka Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Victor Niclolaev aka Vinin"
#property link      "vinin@mail.ru"

#define PI 3.141592653589793238462643
#property stacksize   1024
#property show_inputs 

extern double Z=-0.5;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start() {

   double Res=gamma(Z);
   Print("Значение Гамма-функции для ",DoubleToStr(Z,8)," равно ", DoubleToStr(Res,8));
   

   return(0);
}
//+------------------------------------------------------------------+



//*************************************************************************************************************
// аппроксимация гамма-функции в интервале от 1 до 2
// отношением полиномов 8 степени
double gammaapprox(double x){
   double p[]={    -1.71618513886549492533811,
                   24.76565080557591991083140,
                 -379.80425647094563509757700,
                  629.33115531281844266105200,
                  866.96620279041321129506400,
               -31451.27296884836752543570000,
               -36144.41341869117298070690000,
                66456.14382024054406278550000};

   double q[]={    -3.08402300119738975254353,
                   31.53506269796041615291440,
                 -101.51563674902191416614600, 
                 -310.77716715723110944044400,
                 2253.81184209801510330112000,
                  475.58462775278811076781500,
               -13465.99598649693063924560000,
               -11513.22596755534834972110000};
   double z = x - 1.0;
   double a = 0.0;
   double b = 1.0;
   
   for(int i = 0; i<8; i++){
      a =(a+p[i])*z;
      b = b*z+q[i];
   }
   return (a/b+1.0);
}


//*************************************************************************************************************
// Гамма-функция вещественного агрумента
// возвращает значение гамма-функции аргумента z
double gamma(double z){
   if(z<=0.0)    
      return (PI/(MathSin(PI*z)*gamma(1.0-z))); // рекурентное соотношение для z<=0 
   if(z< 1.0)    
      return(gamma(z+1.0)/z);                     // рекурентное соотношение для 0        
   if(z>2 .0)   
      return ((z-1)*gamma(z-1));                     // рекурентное соотношение для z>2        
   return(gammaapprox(z));                     // 1<=z<=2 использовать аппроксимацию
}

//*************************************************************************************************************

 
если скорость расчета критична, то думаю во втором коде нуно для массивов p[] и q[] размерность задать, возможно я ошибаюсь, но имхо - компилятор будет с p[] и q[] работать как с динамическими массивами, а время доступа к динамическим массивам больше чем к статическим
 
Vinin:

Второй вариант расчета


Я очень рад, что Вы занимаетесь этим вопросом, поскольку скоро нам надо будет разрабатывать именно вариант индикатора с Гамма - функцией при n=n, рассчитанной по (12). Советую сравнивать результаты с вариантом, который имеется в экзель.
 
yosuf:

Я очень рад, что Вы занимаетесь этим вопросом, поскольку скоро нам надо будет разрабатывать именно вариант индикатора с Гамма - функцией при n=n, рассчитанной по (12). Советую сравнивать результаты с вариантом, который имеется в экзель.

Сравнивать пока нечего. Это разные функции
Причина обращения: