Никогда не шарил как правильно пишутся индикаторы, помогите плз.. :) - страница 2

 
forexman77:

Когда сам делал индикатор корреляции Пирсона  на MQL4,  решил проверить, как раз с iBeta сверял.


и что получилось, способ в ибете быстрый? так то вроде махом считает, чисто визуально

 
Maxim Dmitrievsky:

и что получилось, способ в ибете быстрый? так то вроде махом считает, чисто визуально

Индикаторов корреляции много в КБ. Надо забег (бенч) устраивать, чтобы узнать точно.

 
fxsaber:

Индикаторов корреляции много в КБ. Надо забег (бенч) устраивать, чтобы узнать точно.


устрою чуть позже, любопытно даже стало :) по меньшей мере 2 каких-нибудь сравнить хотя бы

 
Maxim Dmitrievsky:

и что получилось, способ в ибете быстрый? так то вроде махом считает, чисто визуально


Да вроде нормально было, но я бы лучше попробовал и с файлом включаемым считать.

 
Maxim Dmitrievsky:

устрою чуть позже, любопытно даже стало :) по меньшей мере 2 каких-нибудь сравнить хотя бы

И результаты вычислений с эталоном сравнить - мат. пакет.

 

Давно делал, может что упустил. Какие-то уж маленькие изменения в значениях получаются.

И корреляция высчитывалась из моментумов, может надо тоже что-то наподобие делать.

#include <MovingAverages.mqh>

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1

#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkViolet
#property indicator_style1  STYLE_SOLID

input int DPperiod   =15;
input int CorrPeriod = 15;
double m[];
double Pearson[];
int begin1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Pearson,INDICATOR_DATA);
   SetIndexBuffer(1,m,INDICATOR_CALCULATIONS);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+10);
   begin1=DPperiod-1;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
   double sMN,x,xKV,y,yKV,Q;
   if(prev_calculated==0){limit=DPperiod+CorrPeriod+1;}
   else
     {limit=prev_calculated-1;}
//---
   ExponentialMAOnBuffer(rates_total,prev_calculated,begin1,DPperiod,open,m);
   for(i=limit;i<rates_total;i++)
     {
      sMN=0.0;
      x=0.0;
      y=0.0;
      xKV=0.0;
      yKV=0.0;
      for(int k=i;k>i-CorrPeriod;k--)
        {
         x=open[k];
         y=m[k];
         sMN=sMN+(x*y);
         xKV=xKV+(x*x);
         yKV=yKV+(y*y);
        }
      Q=MathSqrt(xKV*yKV);
      if(Q!=0.0)Pearson[i]=sMN/Q;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

На моментумах, более правильно считаю. Если кто хорошо в формулах рубит, пусть поправит переделать недолго.

Файлы:
Pearson.mq5  3 kb
 
forexman77:

Давно делал, может что упустил. Какие-то уж маленькие изменения в значениях получаются.

И корреляция высчитывалась из моментумов, может надо тоже что-то наподобие делать.


если сравнить расчеты то у вас маленько по другому, не расчитывается xmean и ymean, вроде бы..

в либе мат:

//--- additonally we calculate SameX and SameY - flag variables which are set to true 
//--- when all X[] (or Y[]) contain exactly same value.
//--- if at least one of them is true, we return zero 
//--- (othwerwise we risk to get nonzero correlation because of roundoff).
   for(int i=0; i<size; i++)
     {
      s=array1[i];
      samex=samex && s==x0;
      xmean+=s*v;
      s=array2[i];
      samey=samey && s==y0;
      ymean+=s*v;
     }
//--- check
   if(samex || samey)
      return(false);
//--- calculation
   s=0;
   for(int i=0; i<size; i++)
     {
      t1=array1[i]-xmean;
      t2=array2[i]-ymean;
      xv+=t1*t1;
      yv+=t2*t2;
      s+=t1*t2;
     }
//--- check
   if(xv==0 || yv==0)
      return(false);
//---
   r=s/MathSqrt(xv*yv);

а у вас

 for(int k=i;k>i-CorrPeriod;k--)
        {
         x=open[k];
         y=m[k];
         sMN=sMN+(x*y);
         xKV=xKV+(x*x);
         yKV=yKV+(y*y);
         s+=x*y;
        }
      Q=s/MathSqrt(xKV*yKV);
      if(Q!=0.0)Pearson[i]=Q;

т.е. как будто бы 1-я часть пропущена, но я не знаю формулы как правильно считается :)

 
Maxim Dmitrievsky:

если сравнить расчеты то у вас маленько по другому, не расчитывается xmean и ymean, вроде бы..

в либе мат:

а у вас

т.е. как будто бы 1-я часть пропущена, но я не знаю формулы как правильно считается :)


Если честно, то взял из своего старого индикатора на mql4, сравнил с iBeta все совпадает.https://www.mql5.com/ru/code/10404 Прилагаю свой индикатор на мт4.

Еще попробовал сейчас период машки поставить один, корреляция один становится на всем участке, только в файле "MovingAverages.mqh"

нужно поправить строку:

if(period<=0 || rates_total-begin<period) return(0);//вместо 1 поставить ноль

Да, там получается, что xmean и ymean это суммы, а не скользящие средние или это какая-то заумная схема получения средней..?

Сейчас подумал первый вариант наверное не рабочий, на моментумах однозначно нужно использовать)

iBeta
iBeta
  • голосов: 5
  • 2011.07.27
  • Dmitry Fedoseev
  • www.mql5.com
Индикатор ковариации, корреляции и коэффициента Beta двух символов.
Файлы:
Pearson.mq4  2 kb
 

xmean и ymean -это простые скользящие.

void OnStart()
  {
//---
   double xmean=0;
   double s=0;
   bool   samex=true;
   double v=1.0/(double)10.0;
   
   double Open[];
   ArraySetAsSeries(Open,true);
   CopyOpen(_Symbol,_Period,0,10,Open);
   
   double x0=Open[0];
   
   for(int i=0; i<10; i++)
     {
      s=Open[i];
      samex=samex && s==x0;
      xmean+=s*v;
     }
     Print("xmean=",xmean);
  }
//+------------------------------------------------------------------+

Теперь остается один вопрос, что взять для сравнения в корреляции. Моментумы цены и скользящей средней, как в последнем варианте:

x=open[k]-open[i];
y=m[k]-m[i];

или подавать данные, как-то по другому?

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