Помогите написать индикатор 'Alpha', опубликованный в Stocks and Commodities

 

Нужен код индикатора в формате .mq4. Исходные коды под Tradestation, Wealth-Lab, AmiBroker находятся здесь: http://www.working-money.com/Documentation/FEEDbk_docs/Archive/062006/TradersTips/TradersTips.html

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

Вот нашёл код самого индикатора под Wealth-Lab.

function AlphaSeries( Series: Integer; StdDevBars: Integer; LinearRegBars: Integer ): integer;
begin
  var Bar: integer;
  var sName: string;
  var Value: float;
  var Pn1: float; //P(n+1) : predicted price of tomorrow
  var DeltaP: integer;//Series of price changes
  var DeltaPn: float; //Difference of predicted to yesterday's price
  var StDev: integer; //Series of standard deviation of price changes

  sName := 'Alpha(' + GetDescription( Series ) + ',' + IntToStr( StdDevBars ) + ',' + IntToStr( LinearRegBars ) + ')';
  Result := FindNamedSeries( sName );
  if Result >= 0 then
  Exit;
  Result := CreateNamedSeries( sName );
  //Calculate the Delta for all bars
  DeltaP := SubtractSeries( Series, OffsetSeries( Series, -1 ));
  StDev := StdDevSeries( DeltaP, StdDevBars );

  for Bar := Int(Max(StdDevBars, LinearRegBars)) to BarCount - 1 do
  begin
  //Filling the indicator with values
  Pn1 := LinearRegLine(Series, Bar - LinearRegBars + 1, Bar, Bar + 1 ); //Predict value of tomorrow
  DeltaPn := Pn1 - PriceClose(Bar); //Difference of predicted value to today's value
  if @StDev[Bar] <> 0 then
  Value:= DeltaPn / @StDev[Bar]
  else
  Value := 0;
  SetSeriesValue( Bar, Result, Value );
  end;
end;

function Alpha( Bar: integer; Series: Integer; StdDevBars: Integer; LinearRegBars: Integer ): float;
begin
  Result := GetSeriesValue( Bar, AlphaSeries( Series, StdDevBars, LinearRegBars ) );
end;


 

Вначале вычисляется стандартное отклонение (stDev) от однопериодного моментуума (Close[i]-Close[i-1]).

Затем вычисляется линия регрессии по формуле (mx+b). Затем линия регрессии делится на стандартное отклонение от моментуума.

 

Индикатор имеет три параметра extern: 1. Close, либо High, Либо Low. 2. Период для стандартного отклонения 3. Период для линии регрессии

 
Индикатор очерчивается в отдельном окне, колеблется вокруг 0.
 
Finch >>:

Вначале вычисляется стандартное отклонение (stDev) от однопериодного моментуума (Close[i]-Close[i-1]).

Затем вычисляется линия регрессии по формуле (mx+b). Затем линия регрессии делится на стандартное отклонение от моментуума.

Вызывает вопросы только этот момент - как вычисляется линия регрессии. Все остальное понятно.

 

По яндексу нашёл линию регрессии от mql... Попробовал написать индикатор на mq под эту линию регрессии, только возникли 2 проблемы: 1. Шкала изменяется не совсем так, как нарисовано в Wealth-Lab; 2. При изменении StdDevBars

отрисовка индикатора не изменяется. А так, в принципе, похоже на оригинал...

Вот код:

//+------------------------------------------------------------------+
//| Alpha.mq4 |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DarkViolet
//---- input parameters
extern int Series=0;
//Series: 0-Close; 1- High; 2- Low
extern int StdDevBars=21;
extern int LinearRegBars=21;

//---- buffers
double LRLBuffer[];
double tempBuffer[];
double tempBuffer2[];
int shift=0;
int n=0;
double sumx=0, sumy=0, sumxy=0, sumx2=0, sumy2=0;
double m=0, yint=0, r=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
  {
  IndicatorBuffers(3);
//---- indicators
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(0,LRLBuffer);
  SetIndexBuffer(1,tempBuffer);
  SetIndexBuffer(2,tempBuffer2);
  IndicatorDigits(Digits);
  if(LinearRegBars < 5) LinearRegBars=5;
  IndicatorShortName("Alpha ("+StdDevBars+", "+LinearRegBars+")");
  SetIndexDrawBegin(0,LinearRegBars+2);
  IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+4);
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
  {
  return(0);
  }
//+------------------------------------------------------------------+
//| Linear Regression Line |
//+------------------------------------------------------------------+
int start()
  {
  int limit;
  int counted_bars=IndicatorCounted();
  if(counted_bars<0) counted_bars=0;
  if(counted_bars>0) counted_bars--;
  limit=Bars-counted_bars;
  int i;
  while(i>=0)
  {
  if (Series == 1)
  {
  tempBuffer[i]=High[i]-High[i+1];
  }
  else if (Series == 2)
  {
  tempBuffer[i]=Low[i]-Low[i+1];
  }
  else
  {
  tempBuffer[i]=Close[i]-Close[i+1];
  }
  i--;
  }
  for(i=0; i<Bars-counted_bars; i++)
  {
  tempBuffer2[i]=iStdDevOnArray(tempBuffer,Bars,StdDevBars,0,MODE_SMA,i)-100;
  }
  for(int shift=limit-1; shift>=0; shift--)
  {
  sumx=0;
  sumy=0;
  sumxy=0;
  sumx2=0;
  sumy2=0;
  for(n=0; n<=LinearRegBars-1; n++)
  {
  sumx=sumx + n;
  if (Series == 1)
  {
  sumy=sumy + High[shift + n]-High[shift+1 + n];
  sumxy=sumxy + n * (High[shift + n]-High[shift+1 + n]);
  sumy2=sumy2 + High[shift + n] * High[shift + n];
  }
  else if (Series == 2)
  {
  sumy=sumy + Low[shift + n]-Low[shift+1 + n];
  sumxy=sumxy + n * (Low[shift + n]-Low[shift+1 + n]);
  sumy2=sumy2 + Low[shift + n] * Low[shift + n];
  }
  else
  {
  sumy=sumy + Close[shift + n]-Close[shift+1 + n];
  sumxy=sumxy + n * (Close[shift + n]-Close[shift+1 + n]);
  sumy2=sumy2 + Close[shift + n] * Close[shift + n];
  }
  sumx2=sumx2 + n * n;
  }
  m=(LinearRegBars*sumxy-sumx*sumy)/(LinearRegBars*sumx2-sumx*sumx);
  yint=(sumy+m*sumx)/LinearRegBars;
  r=(LinearRegBars*sumxy-sumx*sumy)/MathSqrt((LinearRegBars*sumx2-sumx*sumx)*(LinearRegBars*sumy2-sumy*sumy));
  if (tempBuffer2[shift]!= 0)
  LRLBuffer[shift]=(yint-m*LinearRegBars)/tempBuffer2[shift];
  else
  LRLBuffer[shift]=0;
  }
  return(0);
  }
//+------------------------------------------------------------------+
 
Finch >>:

По яндексу нашёл линию регрессии от mql... Попробовал написать индикатор на mq под эту линию регрессии, только возникли 2 проблемы: 1. Шкала изменяется не совсем так, как нарисовано в Wealth-Lab; 2. При изменении StdDevBars

отрисовка индикатора не изменяется. А так, в принципе, похоже на оригинал...

Вот код:

Пожалуйста, пользуйтесь для вставки кода штатными средствами встроенного редактора:


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