Я понял в чем была проблема у Вас. Изначально вы говорите что процесс может быть максимум отклоненение на 40. и Рассчет делаете на 40. НО процесс имеет возможность ходить как в + так и в - в итоге получается 81 вариант ( с точной 0)
А график строите по 40 точкам сгрупированным с шагом 2 по оси Х
Вот по этому у Вас и получается такой график.
Я данные из Excel перенес в MQL.
И используя функционал стандартной библиотеки подобрал параметры сигма чтобы повторить Ваш график из экселя так же группируя принудительно с шагом 2.
Получается для вашего процесса с комбинаторикой подходит процесс с нормальным распределением МО 0 и сигма 6,45
//+------------------------------------------------------------------+//| NormalSimple.mq5 |//| https://www.mql5.com |//+------------------------------------------------------------------+#include <Graphics\Graphic.mqh>
#include <Math\Stat\Normal.mqh>
#include <Math\Stat\Math.mqh>
#property script_show_inputs//--- input parametersinputdouble mean_value=0; // математическое ожиданиe (mean)inputdouble std_dev=6.45; // среднеквадратическоe отклонениe (standard deviation)//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
double arrayTeoryX[41]= {-40,-38,-36,-34,-32,-30,-28,-26,-24,-22,-20,-18,-16,-14,-12,-10,-8,-6,-4,-2,0,
2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40
};
double arrayTeoryY[41]= {0.00000009,3.63798E-06,7.09406E-05,0.000898581,0.008311872,0.059845479,0.349098627,
1.695621904,6.994440355,24.86912126,77.09427591,210.2571161,508.121364,1094.415245,
2110.657973,3658.473821,5716.365345,8070.162839,10311.87474,11940.06549,12537.06876,
11940.06549,10311.87474,8070.162839,5716.365345,3658.473821,2110.657973,1094.415245,
508.121364,210.2571161,77.09427591,24.86912126,6.994440355,1.695621904,0.349098627,
0.059845479,0.008311872,0.000898581,7.09406E-05,3.63798E-06,9.09495E-08
};
//--- отключим показ ценового графикаChartSetInteger(0,CHART_SHOW,false);
//--- инициализируем генератор случайных чиселMathSrand(GetTickCount());
//--- сгенерируем выборку случайной величиныlong chart=0;
string name="GraphicNormal";
int n=100000; // количество значений в выборкеint ncells=41; // количество интервалов в гистограммеdouble x[]; // центры интервалов гистограммыdouble y[]; // количество значений из выборки, попавших в интервалdouble data[]; // выборка случайных значенийdouble max,min; // максимальное и минимальное значения в выборке//--- получим выборку из нормального распределения
MathRandomNormal(mean_value,std_dev,n,data);
//--- рассчитаем данные для построения гистограммы
CalculateHistogramArray(data,x,y,max,min,ncells);
/*
//--- получим границы последовательности и шаг для построения теоретической кривой
double step;
GetMaxMinStepValues(max,min,step);
step=MathMin(step,(max-min)/ncells);
//--- получим теоретически рассчитанные данные на интервале [min,max]
double x2[];
double y2[];
MathSequence(min,max,step,x2);
MathProbabilityDensityNormal(x2,mean_value,std_dev,false,y2);
//--- масштабируем
double theor_max=y2[ArrayMaximum(y2)];
double sample_max=y[ArrayMaximum(y)];
double k=sample_max/theor_max;
*//*
for(int i=0; i<ncells; i++)
y[i]/=k;
*///--- выводим графики
CGraphic graphic;
if(ObjectFind(chart,name)<0)
graphic.Create(chart,name,0,0,0,1000,680);
else
graphic.Attach(chart,name);
graphic.BackgroundMain(StringFormat("Normal distribution mu=%G sigma=%G",mean_value,std_dev));
graphic.BackgroundMainSize(16);
//--- plot all curves
graphic.CurveAdd(x,y,CURVE_HISTOGRAM,"MQL step 2").HistogramWidth(6);
graphic.CurveAdd(arrayTeoryX,arrayTeoryY,CURVE_LINES,"Excel");
//--- а теперь построим теоретическую кривую плотности распределения//graphic.CurveAdd(x2,y2,CURVE_LINES,"Theory");//--- plot all curves
graphic.CurvePlotAll();
graphic.Update();
double summ=0;
for(int i=0; i<ArraySize(y); i++)
{
summ+=y[i];
}
Print("Общая сумма по Y " + summ);
}
//+------------------------------------------------------------------+//| Calculate frequencies for data set |//+------------------------------------------------------------------+bool CalculateHistogramArray(constdouble &data[],double &intervals[],double &frequency[],
double &maxv,double &minv,constint cells=10)
{
if(cells<=1)
return (false);
int size=ArraySize(data);
if(size<cells*10)
return (false);
minv=data[ArrayMinimum(data)];
maxv=data[ArrayMaximum(data)];
double range=maxv-minv;
double width=range/cells;
width=2.0;
minv=-41;
if(width==0)
returnfalse;
ArrayResize(intervals,cells);
ArrayResize(frequency,cells);
//--- зададим центры интерваловfor(int i=0; i<cells; i++)
{
intervals[i]=minv+(i+0.5)*width;
frequency[i]=0;
}
//--- заполним частоты попадания в интервалfor(int i=0; i<size; i++)
{
int ind=int((data[i]-minv)/width);
if(ind>=cells)
ind=cells-1;
frequency[ind]++;
}
return (true);
}
/*
//+------------------------------------------------------------------+
//| Calculates values for sequence generation |
//+------------------------------------------------------------------+
void GetMaxMinStepValues(double &maxv,double &minv,double &stepv)
{
//--- вычислим абсолютный размах последовательности, чтобы получить точность нормализации
double range=MathAbs(maxv-minv);
int degree=(int)MathRound(MathLog10(range));
//--- нормализуем макс. и мин. значения с заданной точностью
maxv=NormalizeDouble(maxv,degree);
minv=NormalizeDouble(minv,degree);
//--- шаг генерации последовательности также зададим от заданной точности
stepv=NormalizeDouble(MathPow(10,-degree),degree);
if((maxv-minv)/stepv<10)
stepv/=10.;
}
//+------------------------------------------------------------------+
*/
Я понял в чем была проблема у Вас. Изначально вы говорите что процесс может быть максимум отклоненение на 40. и Рассчет делаете на 40. НО процесс имеет возможность ходить как в + так и в - в итоге получается 81 вариант ( с точной 0)
А график строите по 40 точкам сгрупированным с шагом 2 по оси Х
Вот по этому у Вас и получается такой график.
Я данные из Excel перенес в MQL.
И используя функционал стандартной библиотеки подобрал параметры сигма чтобы повторить Ваш график из экселя так же группируя принудительно с шагом 2.
Получается для вашего процесса с комбинаторикой подходит процесс с нормальным распределением МО 0 и сигма 6,45
О, интересно получилось. Да, там диапазон от -40...0...40 с шагом 2, правильно все вы написали. Может я этот момент не разжевал в статье. Спасибо за код.
Синяя гистограмма - повторение Вашего эксперимента только на тиковых данных GBPUSD за 365 дней
ренко по 0,0002 пункта и нарезка по 40 ренко бар.
Практически полностью повторяет Вашу теоретическую кривую из экселя.
Так что не получается Ваш рисунок 7 к статье.
Я использовал минутные свечи для анализа, когда нарезаешь их слишком маленькими блоками, то возникает некоторая ошибка.
У меня не ренко бары, алгоритм немного другой. У ренко для формировпния разворотного блока должно пройти 2х пунктов, а у меня всегда 1х.
Скиньте пожалуйста тиковую историю, я попробую у себя на след неделе и покажу что у меня получилось. На тиках должно получиться слегка трендово по идее, но по факту, тики разные бывают, сильно зависит от источника. Например на некоторых демо счетах бывают излишнее колличество тиков, и это приводит к тому, что процесс становится разворотным.
Maxim Romanov: Я использовал минутные свечи для анализа, когда нарезаешь их слишком маленькими блоками, то возникает некоторая ошибка.
У меня не ренко бары, алгоритм немного другой. У ренко для формировпния разворотного блока должно пройти 2х пунктов, а у меня всегда 1х.
Скиньте пожалуйста тиковую историю, я попробую у себя на след неделе и покажу что у меня получилось. На тиках должно получиться слегка трендово по идее, но по факту, тики разные бывают, сильно зависит от источника. Например на некоторых демо счетах бывают излишнее колличество тиков, и это приводит к тому, что процесс становится разворотным.
Тиковую историю терминал подгружает сам (MT5, сервер Alpari-MT5)
Вариант. в терминале Ctrl +U далее на закладке тики все можно сделать.
У вас нормальность распределения акций явно зависит от числа наблюдений: чем больше наблюдений, тем нормальней. Следовало бы сравнивать одинаковые по размеру выборки.
Kristian Kafarov: У вас нормальность распределения акций явно зависит от числа наблюдений: чем больше наблюдений, тем нормальней. Следовало бы сравнивать одинаковые по размеру выборки.
Из примеров приведенных в статье, действительно может так показаться. Но в реальности такого эффекта нет. Чем больше выборок, тем точнее результат, но распределение не приближается к нормальному (хотя тут тоже есть определенные условия, которые нужно выполнять при исследовании). Характер распределения больше зависит от торгового инструмента, у каждого он немного отличается.
Интересный подход к анализу тренда\флета. Но, считаю его на практике не очень приемлемым. Скорее можно отнести материал к ознакомлению с другого аспекта и не более.
Я понял в чем была проблема у Вас. Изначально вы говорите что процесс может быть максимум отклоненение на 40. и Рассчет делаете на 40. НО процесс имеет возможность ходить как в + так и в - в итоге получается 81 вариант ( с точной 0)
А график строите по 40 точкам сгрупированным с шагом 2 по оси Х
Вот по этому у Вас и получается такой график.
Я данные из Excel перенес в MQL.
И используя функционал стандартной библиотеки подобрал параметры сигма чтобы повторить Ваш график из экселя так же группируя принудительно с шагом 2.
Получается для вашего процесса с комбинаторикой подходит процесс с нормальным распределением МО 0 и сигма 6,45
Я понял в чем была проблема у Вас. Изначально вы говорите что процесс может быть максимум отклоненение на 40. и Рассчет делаете на 40. НО процесс имеет возможность ходить как в + так и в - в итоге получается 81 вариант ( с точной 0)
А график строите по 40 точкам сгрупированным с шагом 2 по оси Х
Вот по этому у Вас и получается такой график.
Я данные из Excel перенес в MQL.
И используя функционал стандартной библиотеки подобрал параметры сигма чтобы повторить Ваш график из экселя так же группируя принудительно с шагом 2.
Получается для вашего процесса с комбинаторикой подходит процесс с нормальным распределением МО 0 и сигма 6,45
День добрый
Синяя гистограмма - повторение Вашего эксперимента только на тиковых данных GBPUSD за 365 дней
ренко по 0,0002 пункта и нарезка по 40 ренко бар.
Практически полностью повторяет Вашу теоретическую кривую из экселя.
Так что не получается Ваш рисунок 7 к статье.
Вот код
Ищу ошибки и пока не нахожу.
День добрый
Синяя гистограмма - повторение Вашего эксперимента только на тиковых данных GBPUSD за 365 дней
ренко по 0,0002 пункта и нарезка по 40 ренко бар.
Практически полностью повторяет Вашу теоретическую кривую из экселя.
Так что не получается Ваш рисунок 7 к статье.
Я использовал минутные свечи для анализа, когда нарезаешь их слишком маленькими блоками, то возникает некоторая ошибка.
Тиковую историю терминал подгружает сам (MT5, сервер Alpari-MT5)
Вариант. в терминале Ctrl +U далее на закладке тики все можно сделать.
У вас нормальность распределения акций явно зависит от числа наблюдений: чем больше наблюдений, тем нормальней. Следовало бы сравнивать одинаковые по размеру выборки.
Из примеров приведенных в статье, действительно может так показаться. Но в реальности такого эффекта нет. Чем больше выборок, тем точнее результат, но распределение не приближается к нормальному (хотя тут тоже есть определенные условия, которые нужно выполнять при исследовании). Характер распределения больше зависит от торгового инструмента, у каждого он немного отличается.