Код: Выделить всё
function Initialize()
{
// Область определения параметров индикатора
// Обязательные параметры:
IndicatorName = "iVar"; // Задайте название индикатора и сохраните с данным именем
PriceStudy = false; // Рисовать в области цены (true – да, false – нет)
AddInput("Input", Inputs.Candle); // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
AddSeries("A", DrawAs.Line, Color.Red); // Задаем вид линии индикатора A
AddSeries("B", DrawAs.Line, Color.Black); // Задаем вид линии индикатора B
// Дополнительные параметры:
AddParameter("Period", 5); // Задаем имя изменяемого параметра и его значение
}
function Evaluate()
{
int i, j, k, l;
int ihigh, ilow, nInterval, nint, mpow;
double Delta, Xс, Yс, Sx, Sy, Sxx, Sxy, fndl, fndh;
Sx = 0; Sy = 0; Sxx = 0; Sxy = 0; j = 0; ihigh = 0; ilow = 0;
for(i=0; i<=Period; i++)
{
nInterval = (int) Math.Pow(2,Period-i);
mpow = (int) Math.Pow(2,i);
//---- суммируем разницы максимальной и минимальной цен на интервале
for(Delta=0, k=0; k < mpow; k++)
{
// ihigh = MaxValue(Input.High, nInterval, nInterval*k+j);
fndl = 0;
fndh = 0;
for(l=0; l<nInterval; l++)
{
nint = l + nInterval*k+j;
if (fndl == 0)
{
fndh = Input.High[nint];
fndl = Input.Low[nint];
ihigh = nint;
ilow = nint;
continue;
}
if (fndh < Input.High[nint]) {
fndh = Input.High[nint];
ihigh = nint;
}
if (fndl > Input.Low[nint]) {
fndl = Input.Low[nint];
ilow = nint;
}
}
Delta += Input.High[ihigh]-Input.Low[ilow];
// WriteData("c:\\temp\\"+ IndicatorName + "_log.txt", DateTime.Today, BarDate(ihigh), BarTime(ihigh), BarDate(ilow), BarTime(ilow), k, fndh, fndl);
}
//---- вычисляем координаты вариации в двойном логарифмическом масштабе
Xс = (Period-i)*Math.Log(2.0);
Yс = Math.Log(Delta);
//---- накапливаем данные для нахождения коэффициентов линии регрессии с помощью МНК
Sx += Xс;
Sy += Yс;
Sxx += Xс*Xс;
Sxy += Xс*Yс;
}
//---- вычисляем индекс вариации (коэффициент наклона линии регрессии)
A = -(Sx*Sy-(Period+1)*Sxy)/(Sx*Sx-(Period+1)*Sxx);
B = 0.5;
}
Переносил с исходника который для mt4 по моему был. Как то он притормаживает у меня. Но вроде и работает и приверает иногда.
исходник из чего делал
Код: Выделить всё
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#property link "http://forexbig.ru"
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//+------------------------------------------------------------------+
//| iVAR.mq4 |
//| (C)opyright © 2008, Ilnur |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
// Индикатор отображает индекс вариации ценового ряда, вычисленного
// на минимальном предшествующем интервале длины 2^n. Индекс вариации
// показывает, что преобладает во временном ряду – трендовая или флетовая
// составляющая, или же ряд ведет себя случайно.
// М.М. Дубовиков и др. - Размерность минимального покрытия и локальный
// анализ фрактальных временных рядов.
#property copyright "(C)opyright © 2008, Ilnur"
#property link "http://www.metaquotes.net"
//---- настройки индикатора
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_level1 0.5
//---- входные параметры
extern int n = 5;
extern int nBars = 1000;
//---- буфер индикатора
double ibuffer[];
//+------------------------------------------------------------------+
//| Функция инициализации индикатора |
//+------------------------------------------------------------------+
int init()
{
//---- настройка параметров отрисовки
SetIndexBuffer(0,ibuffer);
SetIndexStyle(0,DRAW_LINE);
SetIndexDrawBegin(0,Bars-nBars);
SetIndexLabel(0,"iVAR");
//---- "короткое имя" отображаемое в окне индикатора
IndicatorShortName("iVAR("+n+")");
return(0);
}
//+------------------------------------------------------------------+
//| Основная функция индикатора |
//+------------------------------------------------------------------+
int start()
{
int i, j, k, nTotal, nCountedBars = IndicatorCounted();
int ihigh, ilow, nInterval;
double Delta, Xс, Yс, Sx, Sy, Sxx, Sxy;
//---- последний посчитанный бар будет пересчитан
if(nCountedBars==0) nTotal = nBars;
if(nCountedBars>0) nTotal = Bars-nCountedBars-1;
//---- основной цикл индикатора
for(j=nTotal; j>=0; j--)
{
Sx = 0; Sy = 0; Sxx = 0; Sxy = 0;
for(i=0; i<=n; i++)
{
nInterval = MathPow(2,n-i);
//---- суммируем разницы максимальной и минимальной цен на интервале
for(Delta=0, k=0; k<MathPow(2,i); k++)
{
ihigh = iHighest(Symbol(),0,MODE_HIGH,nInterval,nInterval*k+j);
ilow = iLowest(Symbol(),0,MODE_LOW,nInterval,nInterval*k+j);
Delta += High[ihigh]-Low[ilow];
}
//---- вычисляем координаты вариации в двойном логарифмическом масштабе
Xс = (n-i)*MathLog(2.0);
Yс = MathLog(Delta);
//---- накапливаем данные для нахождения коэффициентов линии регрессии с помощью МНК
Sx += Xс;
Sy += Yс;
Sxx += Xс*Xс;
Sxy += Xс*Yс;
}
//---- вычисляем индекс вариации (коэффициент наклона линии регрессии)
ibuffer[j] = -(Sx*Sy-(n+1)*Sxy)/(Sx*Sx-(n+1)*Sxx);
}
return(0);
}
может более знающие получше перенесут и меньше врать будет )