Рассмотрены функции для работы с основными статистическими распределениями, реализованными в языке R. Это распределения Коши, Вейбулла, нормальное, логнормальное, логистическое, экспоненциальное, равномерное, гамма-распределение, центральное и нецентральные распределения Бета, хи-квадрат, F-распределения Фишера, t-распределения Стьюдента, а также дискретные биномиальное и отрицательное биномиальные распределения, геометрическое, гипергеометрическое и распределение Пуассона. Есть функции расчета теоретических моментов распределений, которые позволяют оценить степень соответствия реального распределения модельному.
//-Фильтр //1. Суммируем последовательно две дельты и умножаем значение на два for ( int i= 1 ;i<massivSize;i++) { summDelta[i- 1 ]=((Digit[i]-Digit[i- 1 ])+(Digit[i+ 1 ]-Digit[i]))* 2 ; } for ( int i= 0 ;i<massivSize- 1 ;i++) printf ( "summDelta[%d] = %G" ,i,summDelta[i]);
//3. Составляем новый числовой ряд, если значение меньше среднего значения //4. Повторяем пункт 2-3 пока числовой ряд не будет меньше половины первоначального ряда for ( int Z= 0 ;N>massivSize/ 2 ;Z++) { SizeMass= ArraySize (summDelta); //Узнаем размер массива SizeMassDigit= ArraySize (Digit); //Узнаем размер массива avrMass= 0 ; int NOL= 0 ; int CalcZero= 0 ;
//2. Находим среднее значение получившегося числового ряда for ( int i= 0 ;i<SizeMass;i++) { if (summDelta[i]!= 0 )avrMass=avrMass+summDelta[i]; else NOL++; } avrMass=avrMass/(SizeMass-NOL); Print ( "Среднее значение получившегося числового ряда " ,Z, "=" ,avrMass);
//Обнуляем отфильтрованные значения массива summDelta for ( int i= 0 ;i<SizeMass;i++) { if (summDelta[i]>avrMass) { summDelta[i]= 0 ; N--; } } for ( int i= 0 ;i<SizeMass;i++) printf ( "Обнуление summDelta[%d] = %G" ,i,summDelta[i]);
//Обнуляем отфильтрованные значения массива SizeMassDigit for ( int i= 0 ;i<SizeMassDigit;i++) { if (i== 0 ) { if (summDelta[i]!= 0 ) Digit[i]=Digit[i]; else Digit[i]= 0 ; } if (i== 1 ) { if (summDelta[i- 1 ]!= 0 || summDelta[i]!= 0 ) Digit[i]=Digit[i]; else Digit[i]= 0 ; } if (i> 1 && i<SizeMass) { if (summDelta[i- 2 ]!= 0 || summDelta[i- 1 ]!= 0 || summDelta[i]!= 0 ) Digit[i]=Digit[i]; else Digit[i]= 0 ; } if (i==SizeMass- 1 + 1 ) //Предпоследняя ячейка { if (summDelta[i- 1 - 1 ]!= 0 || summDelta[i- 1 - 2 ]!= 0 ) Digit[i]=Digit[i]; else Digit[i]= 0 ; } if (i==SizeMass- 1 + 2 ) //Последняя ячейка { if (summDelta[i- 1 - 2 ]!= 0 ) Digit[i]=Digit[i]; else Digit[i]= 0 ; } } for ( int i= 0 ;i<SizeMassDigit;i++) printf ( "Обнуление Digit[%d] = %G" ,i,Digit[i]); }
SizeMass= ArraySize (summDelta); //Узнаем размер массива SizeMassDigit= ArraySize (Digit); //Узнаем размер массива avrMass= 0 ; int NOL= 0 ; int CalcZero= 0 ;
//Удаление обнуленных данных массива summDelta for ( int i= 0 ;i<SizeMass;i++) { if (summDelta[i]!= 0 ) { ArrayCopy (summDelta,summDelta,i-CalcZero,i, 1 ); } else CalcZero++; }
//Удаление обнуленных данных массива Digit CalcZero= 0 ; for ( int i= 0 ;i<SizeMassDigit;i++) { if (Digit[i]!= 0 ) { ArrayCopy (Digit,Digit,i-CalcZero,i, 1 ); } else CalcZero++; }
for ( int i= 0 ;i<SizeMass;i++) printf ( "До обрезания массива summDelta[%d] = %G" ,i,summDelta[i]); for ( int i= 0 ;i<SizeMassDigit;i++) printf ( "До обрезания массива Digit[%d] = %G" ,i,Digit[i]);
SizeMass= ArraySize (summDelta); //Узнаем размер массива SizeMassDigit= ArraySize (Digit); //Узнаем размер массива
Print ( "N=" ,N); if (N!= 0 ) { ArrayResize (summDelta,N, 0 ); for ( int i= 0 ;i<N;i++) printf ( "summDelta[%d] = %G" ,i,summDelta[i]); ArrayResize (Digit,SizeMassDigit-CalcZero, 0 ); for ( int i= 0 ;i<SizeMassDigit-CalcZero;i++) printf ( "Digit[%d] = %G" ,i,Digit[i]); } else { for ( int i= 0 ;i<N;i++) printf ( "summDelta[%d] = %G" ,i,summDelta[i]); for ( int i= 0 ;i<SizeMassDigit-CalcZero;i++) printf ( "Digit[%d] = %G" ,i,Digit[i]); return ; }
//-Основной алгоритм //1. Находим разницу между числами - это как раз их близость друг от друга.
//2. Если число меньше среднего значения дельт, получившихся из п.1, то - 1, а если нет - 0.
//3. Если значение из п.2 равно 1, то суммируем значение с предыдущим итогом, если нет - 0.
//4. Находим максимальное значение из пункта 3.
//5. Определяем диапазон - находим значение из пункта 4 и ищем вверх из пункта 3 число с нулевым значением, потом увеличиваем найденное число на единицу. //Таким образом мы получаем диапазон чисел, плотность которых наибольшая по отношению к другим. } //+------------------------------------------------------------------+
ln(a)는 1에서 a까지의 곡선 f(x) = 1/x 아래의 면적으로 정의됩니다.
도움이 될까요?
ln(a)는 1에서 a까지의 곡선 f(x) = 1/x 아래의 면적으로 정의됩니다.
도움이 될까요?
어떻게 도움이 될까요?
모든 것이 여기에 있습니다.
어떤 기능으로 알 수 있습니까?
1. 숫자 그룹의 수
2. 다른 그룹에 대한 각 그룹의 밀도;
3. 그룹 간의 평균 밀도
4. 숫자 시리즈의 그룹을 채우는 비율.
어떤 기능으로 알 수 있습니까?
모르겠어. 스레드 제목을 읽으십시오.
이해했다. 분명히 지점의 이름은 문제의 전체 본질을 드러내지 않기 때문에 그다지 성공적이지 않습니다.
필터를 만들었습니다 - 전투의 절반. 코드를 개선하기 위한 비판 - 환영합니다!
//| Test_FindOblast'.mq4 |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com/ru/users/-aleks- |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link " https://www.mql5.com/ru/users/-aleks -"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart ()
{
int massivSize= 19 ; //размер массива
double Digit[ 19 ]=
{
10 ,
20 ,
30 ,
40 ,
50 ,
51 ,
52 ,
53 ,
54 ,
60 ,
70 ,
80 ,
120 ,
150 ,
190 ,
210 ,
223 ,
232 ,
250 ,
260
};
double summDelta[ 19 - 1 ];
int N=massivSize- 1 ; //Количество оставшихся цифровых значений
double avrMass= 0 ; //Среднее значение массива дельт
int SizeMass= 0 ; //Узнаем размер массива
int SizeMassDigit= 0 ; //Узнаем размер массива
//-Фильтр
//1. Суммируем последовательно две дельты и умножаем значение на два
for ( int i= 1 ;i<massivSize;i++)
{
summDelta[i- 1 ]=((Digit[i]-Digit[i- 1 ])+(Digit[i+ 1 ]-Digit[i]))* 2 ;
}
for ( int i= 0 ;i<massivSize- 1 ;i++) printf ( "summDelta[%d] = %G" ,i,summDelta[i]);
//3. Составляем новый числовой ряд, если значение меньше среднего значения
//4. Повторяем пункт 2-3 пока числовой ряд не будет меньше половины первоначального ряда
for ( int Z= 0 ;N>massivSize/ 2 ;Z++)
{
SizeMass= ArraySize (summDelta); //Узнаем размер массива
SizeMassDigit= ArraySize (Digit); //Узнаем размер массива
avrMass= 0 ;
int NOL= 0 ;
int CalcZero= 0 ;
//2. Находим среднее значение получившегося числового ряда
for ( int i= 0 ;i<SizeMass;i++)
{
if (summDelta[i]!= 0 )avrMass=avrMass+summDelta[i];
else NOL++;
}
avrMass=avrMass/(SizeMass-NOL);
Print ( "Среднее значение получившегося числового ряда " ,Z, "=" ,avrMass);
//Обнуляем отфильтрованные значения массива summDelta
for ( int i= 0 ;i<SizeMass;i++)
{
if (summDelta[i]>avrMass)
{
summDelta[i]= 0 ;
N--;
}
}
for ( int i= 0 ;i<SizeMass;i++) printf ( "Обнуление summDelta[%d] = %G" ,i,summDelta[i]);
//Обнуляем отфильтрованные значения массива SizeMassDigit
for ( int i= 0 ;i<SizeMassDigit;i++)
{
if (i== 0 )
{
if (summDelta[i]!= 0 ) Digit[i]=Digit[i];
else Digit[i]= 0 ;
}
if (i== 1 )
{
if (summDelta[i- 1 ]!= 0 || summDelta[i]!= 0 ) Digit[i]=Digit[i];
else Digit[i]= 0 ;
}
if (i> 1 && i<SizeMass)
{
if (summDelta[i- 2 ]!= 0 || summDelta[i- 1 ]!= 0 || summDelta[i]!= 0 ) Digit[i]=Digit[i];
else Digit[i]= 0 ;
}
if (i==SizeMass- 1 + 1 ) //Предпоследняя ячейка
{
if (summDelta[i- 1 - 1 ]!= 0 || summDelta[i- 1 - 2 ]!= 0 ) Digit[i]=Digit[i];
else Digit[i]= 0 ;
}
if (i==SizeMass- 1 + 2 ) //Последняя ячейка
{
if (summDelta[i- 1 - 2 ]!= 0 ) Digit[i]=Digit[i];
else Digit[i]= 0 ;
}
}
for ( int i= 0 ;i<SizeMassDigit;i++) printf ( "Обнуление Digit[%d] = %G" ,i,Digit[i]);
}
SizeMass= ArraySize (summDelta); //Узнаем размер массива
SizeMassDigit= ArraySize (Digit); //Узнаем размер массива
avrMass= 0 ;
int NOL= 0 ;
int CalcZero= 0 ;
//Удаление обнуленных данных массива summDelta
for ( int i= 0 ;i<SizeMass;i++)
{
if (summDelta[i]!= 0 )
{
ArrayCopy (summDelta,summDelta,i-CalcZero,i, 1 );
}
else CalcZero++;
}
//Удаление обнуленных данных массива Digit
CalcZero= 0 ;
for ( int i= 0 ;i<SizeMassDigit;i++)
{
if (Digit[i]!= 0 )
{
ArrayCopy (Digit,Digit,i-CalcZero,i, 1 );
}
else CalcZero++;
}
for ( int i= 0 ;i<SizeMass;i++) printf ( "До обрезания массива summDelta[%d] = %G" ,i,summDelta[i]);
for ( int i= 0 ;i<SizeMassDigit;i++) printf ( "До обрезания массива Digit[%d] = %G" ,i,Digit[i]);
SizeMass= ArraySize (summDelta); //Узнаем размер массива
SizeMassDigit= ArraySize (Digit); //Узнаем размер массива
Print ( "N=" ,N);
if (N!= 0 )
{
ArrayResize (summDelta,N, 0 );
for ( int i= 0 ;i<N;i++) printf ( "summDelta[%d] = %G" ,i,summDelta[i]);
ArrayResize (Digit,SizeMassDigit-CalcZero, 0 );
for ( int i= 0 ;i<SizeMassDigit-CalcZero;i++) printf ( "Digit[%d] = %G" ,i,Digit[i]);
}
else
{
for ( int i= 0 ;i<N;i++) printf ( "summDelta[%d] = %G" ,i,summDelta[i]);
for ( int i= 0 ;i<SizeMassDigit-CalcZero;i++) printf ( "Digit[%d] = %G" ,i,Digit[i]);
return ;
}
SizeMass= ArraySize (summDelta); //Узнаем размер массива
avrMass= iMAOnArray (summDelta, 0 ,SizeMass, 0 , 0 , 0 );
Print ( "Среднее значение получившегося числового ряда=" ,avrMass);
//-Основной алгоритм
//1. Находим разницу между числами - это как раз их близость друг от друга.
//2. Если число меньше среднего значения дельт, получившихся из п.1, то - 1, а если нет - 0.
//3. Если значение из п.2 равно 1, то суммируем значение с предыдущим итогом, если нет - 0.
//4. Находим максимальное значение из пункта 3.
//5. Определяем диапазон - находим значение из пункта 4 и ищем вверх из пункта 3 число с нулевым значением, потом увеличиваем найденное число на единицу.
//Таким образом мы получаем диапазон чисел, плотность которых наибольшая по отношению к другим.
}
//+------------------------------------------------------------------+
필터를 만들었습니다 - 전투의 절반. 코드를 개선하기 위한 비판 - 환영합니다!
나는 필터를 만들고 그 특성을 설명합니다.
무엇을 비판할 것인가 - 코드 품질 또는 필터링 품질?
나는 필터를 만들고 그 특성을 설명합니다.
무엇을 비판할 것인가 - 코드 품질 또는 필터링 품질?
여기에서 필터 설명 https://www.mql5.com/ru/forum/163871/page3#comment_3940913
코드나 아이디어를 비판하기 위해 - 이 주제에 대한 커뮤니케이션에 대해 기쁘게 생각합니다.
여기에서 필터 설명 https://www.mql5.com/en/forum/163871/page3#comment_3940913
코드나 아이디어를 비판하기 위해 - 이 주제에 대한 커뮤니케이션에 대해 기쁘게 생각합니다.
> 처리하기 전에 다음 데이터 필터링 알고리즘을 테스트합니다.
> 1. 두 개의 델타를 직렬로 합산하고 값에 2를 곱합니다.
> 2. 결과 숫자 시리즈의 평균 값 찾기
이것은 아기 이야기입니다.
항목 1은 (SMA 2) * 4입니다.
point 2 - "결과 숫자 시리즈"의 평균값은 얼마입니까?