Реализуйте пожалуйста ADF-тест и другие тесты для проверки коинтеграции.
Очередной ништячок от fxsaber, спасибо )
// Индикатор показывает степень похожести каждого интервала истории с текущим интервалом #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 #property indicator_minimum -1 #property indicator_maximum 1 #property indicator_color1 clrRed #property indicator_type1 DRAW_LINE #property indicator_width1 2 sinput int Amount = 100; // Количество последних баров (Паттерн) #include <fxsaber\Math\Math.mqh> // https://www.mql5.com/ru/code/17982 double Buffer[]; void OnInit() { SetIndexBuffer(0, Buffer); } 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[] ) { if (rates_total > prev_calculated) { double Pattern[]; ArrayCopy(Pattern, open, 0, rates_total - Amount, Amount); MathCorrelationPearson(open, Pattern, Buffer); const int Pos = ArrayMaximum(Buffer, 0, rates_total - Amount); Comment("Наиболее похожий участок истории, соответствующий последним (" + (string)time[rates_total - 1] + ") " + (string)Amount + " барам,\nнаходится здесь " + (string)time[Pos] + " - КК Пирсона = " + (string)Buffer[Pos]); } return(rates_total); }
Пример, как можно быстро находить наиболее похожий (по Пирсону) кусок истории.
Сила реализации только в алгоритме - значительно быстрее любого другого.
fxsaber:
Пример, как можно быстро находить наиболее похожий (по Пирсону) кусок истории.
Сила реализации только в алгоритме - значительно быстрее любого другого.
На истории, это хорошо. Но хочется как бы наибарот, на истории несколько фрагментов баров выбираем, а индикатор в моменте если видит совпадения нас оповещает об этом. Такая реализация в принципе возможна?
s22aa:
На истории, это хорошо. Но хочется как бы наибарот, на истории несколько фрагментов баров выбираем, а индикатор в моменте если видит совпадения нас оповещает об этом. Такая реализация в принципе возможна?
Для этого будет достаточно простой штатной MathCorrelationPearson.
На истории, это хорошо. Но хочется как бы наибарот, на истории несколько фрагментов баров выбираем, а индикатор в моменте если видит совпадения нас оповещает об этом. Такая реализация в принципе возможна?
fxsaber:
Для этого будет достаточно простой штатной MathCorrelationPearson.
Для этого будет достаточно простой штатной MathCorrelationPearson.
Ну дык это же просто замечательно. Я как раз занялся изучением С++ на курсах, уже прошёл циклы и чувствую себя почти гуру программирования, ну не совсем гуру конечно так на половину, полугурок одним словом. Думаю лет через несколько штатная MathCorrelationPearson будет и для меня "простой".
// Пример нахождения "самого похожего" интервала на текущий (критерий - КК Пирсона). #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 #property indicator_color1 clrRed #property indicator_type1 DRAW_LINE #property indicator_width1 2 #property indicator_color2 clrYellow #property indicator_type2 DRAW_LINE #property indicator_width2 2 sinput int inAmount = 20; // Количество последних баров (Паттерн) input int inMaxBars = 1e5; // Количество баров для анализа #include <fxsaber\Math\Math.mqh> // https://www.mql5.com/ru/code/17982 double Buffer0[]; double Buffer1[]; double Buffer2[]; int handle; const long handleChart = ChartOpen(_Symbol, PERIOD_CURRENT); void OnInit() { SetIndexBuffer(0, Buffer0); SetIndexBuffer(1, Buffer1); PlotIndexSetString(0, PLOT_LABEL, "Pattern"); PlotIndexSetString(1, PLOT_LABEL, "Sample"); ChartSetInteger(handleChart, CHART_MODE, CHART_LINE); ChartSetInteger(handleChart, CHART_AUTOSCROLL, false); } //------ // Выдрано из Include\Math\Stat\Math.mqh - https://www.mql5.com/ru/forum/97153/page15#comment_5927026 const double QNaN =(double)"nan"; // QNaN //+------------------------------------------------------------------+ //| Computes the mean value of the values in array[] | //+------------------------------------------------------------------+ double MathMean(const double &array[]) { int size=ArraySize(array); //--- check data range if(size<1) return(QNaN); // need at least 1 observation //--- calculate mean double mean=0.0; for(int i=0; i<size; i++) mean+=array[i]; mean=mean/size; //--- return mean return(mean); } //+------------------------------------------------------------------+ //| Computes the variance of the values in array[] | //+------------------------------------------------------------------+ double MathVariance(const double &array[]) { int size=ArraySize(array); //--- check data range if(size<2) return(QNaN); // need at least 2 observations //--- calculate mean double mean=0.0; for(int i=0; i<size; i++) mean+=array[i]; mean=mean/size; //--- calculate variance double variance=0; for(int i=0; i<size; i++) variance+=MathPow(array[i]-mean,2); variance=variance/size; //--- return variance return(variance); } //------ // Подгоняет Sample к Pattern void NormalizeArray( const double &Pattern[], double &Sample[], const bool Reverse = false ) { const double MeanPattern = MathMean(Pattern); const double MeanSample = MathMean(Sample); const double Koef = (Reverse ? -1 : 1) * MathSqrt(MathVariance(Pattern) / MathVariance(Sample)); const int Total = ArraySize(Pattern); for (int i = 0; i < Total; i++) Sample[i] = (Sample[i] - MeanSample) * Koef + MeanPattern; } void MathLog( double &Array[] ) { for (int i = ArraySize(Array) - 1; i >= 0; i--) Array[i] = MathLog(Array[i]); } void MathExp( double &Array[] ) { for (int i = ArraySize(Array) - 1; i >= 0; i--) Array[i] = MathExp(Array[i]); } // Находит лучший Sample по Pattern int GetSample1( const int Amount, const double &Prices[], double &Sample[], double &Pattern[], int MaxBars ) { const int Total = ArraySize(Prices) - 1; // Убираем последний бар из расчетов ArrayCopy(Pattern, Prices, 0, Total - Amount, Amount); MaxBars = (Total > MaxBars) ? MaxBars : Total; double Prices2[]; ArrayCopy(Prices2, Prices, 0, Total - MaxBars, MaxBars); MathLog(Prices2); double Pattern2[]; ArrayCopy(Pattern2, Pattern); MathLog(Pattern2); double Pearson[]; MathCorrelationPearson(Prices2, Pattern2, Pearson); const int PosMax = ArrayMaximum(Pearson, 0, MaxBars - Amount); const int PosMin = ArrayMaximum(Pearson, 0, MaxBars - Amount); const bool Res = (MathAbs(Pearson[PosMax]) < MathAbs(Pearson[PosMin])); const int Pos2 = Res ? PosMin : PosMax; ArrayCopy(Sample, Prices2, 0, Pos2 - Amount + 1, Amount); NormalizeArray(Pattern2, Sample, Res); MathExp(Sample); return(Pos2 + Total - MaxBars); } void OnDeinit( const int ) { ChartClose(handleChart); } 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[] ) { if (rates_total > prev_calculated) { double Pattern[]; double Sample[]; const int Pos = GetSample1(inAmount, close, Sample, Pattern, inMaxBars); // Вывели сам паттерн ArrayInitialize(Buffer0, EMPTY_VALUE); ArrayCopy(Buffer0, Pattern, rates_total - inAmount - 1); // Вывели Sample ArrayInitialize(Buffer1, EMPTY_VALUE); ArrayCopy(Buffer1, Sample, rates_total - inAmount - 1); Comment("Interval: " + (string)time[Pos - inAmount + 1] + " - " + (string)time[Pos]); // Показываем найденный участок const int Offset = 10; ChartNavigate(handleChart, CHART_BEGIN, Pos - inAmount + 1 - Offset); // Сдвигаем график на Offset-баров раньше начала источника Sample ObjectCreate(handleChart, "Left", OBJ_VLINE, 0, time[Pos - inAmount + 1], 0); ObjectCreate(handleChart, "Right", OBJ_VLINE, 0, time[Pos], 0); } return(rates_total); }
Есть похожие вещи в кодебазе.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Кроссплатформенная библиотека оригинальных математических функций:
Подсмотренные из разных мест оригинальные математические функции, которые либо не имеют аналогов, либо выполняют свою работу значительно быстрее, чем альтернативные реализации
MathCorrelationPearson
Функция рассчитывает коэффициенты корреляции Пирсона для каждой точки исходного ряда, делая соответствующие сравнения с заданным Паттерном.
Автор: fxsaber