Создаем мультивалютный советник

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Re: Создаем мультивалютный советник

Сообщение Haos » 04 июл 2017, 19:38

Вот здесь посмотрите - в библиотеке есть функции корреляции. Умеете пользоваться готовыми функциями?
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Создаем мультивалютный советник

Сообщение ВЯЧЕСЛАВПЕТРОВ » 05 июл 2017, 06:34

Haos писал(а):Вот здесь посмотрите - в библиотеке есть функции корреляции. Умеете пользоваться готовыми функциями?

С этим делом пока туговато. Нужно разобрать какая из формул нам нужна и как работает.
Это ссылки https://www.mql5.com/ru/code/9155
Код: выделить все
double p(double cov, double DX, double DY) // коэффициент выборочной корреляции
  {
   return(cov/MathSqrt(DX)/MathSqrt(DY));
  }

double Dp(double p, int size) // дисперсия выборочной корреляции
  {
   return(MathPow(1.0-MathPow(p,2),2)/(size-1));
  }

double AutoKorel(double arr[], double MX, int por) // автокорреляция порядка por
  {
   int    size=ArraySize(arr)-por;
   double Sum1=0.0,
          Sum2=0.0,
          Sum3=0.0;
   for(int i=0; i<size; i++) {
       Sum1+=(arr[i]-MX)*(arr[i+por]-MX);
       Sum2+=MathPow(arr[i]-MX,2);
       Sum3+=MathPow(arr[i+por]-MX,2);
      }
   return(Sum1/MathSqrt(Sum2)/MathSqrt(Sum3));
  }

void AutoKorelFunc(double arr[], double MX, int count, double& res[]) // автокорреляционная функция (АКФ)
  {
   int    size=ArraySize(arr);
   double Sum1=0.0,
          Sum2=0.0;
   count++;
   ArrayResize(res,count);
   res[0]=1.0;
   for(int i=1; i<count; i++)
       res[i]=AutoKorel(arr,MX,i);
  }
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.

Re: Создаем мультивалютный советник

Сообщение Haos » 05 июл 2017, 13:30

ВЯЧЕСЛАВПЕТРОВ писал(а):
Haos писал(а):Вот здесь посмотрите - в библиотеке есть функции корреляции. Умеете пользоваться готовыми функциями?

С этим делом пока туговато. Нужно разобрать какая из формул нам нужна и как работает.

Я посмотрю, но зачем Вы пытаетесь использовать то, что не понимаете? Я вот прекрасно знаю что такое корреляция уже лет 25, но не использую на рынке, т.к. не вижу оснований для её применения.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Создаем мультивалютный советник

Сообщение ВЯЧЕСЛАВПЕТРОВ » 05 июл 2017, 15:13

Haos писал(а):Я посмотрю, но зачем Вы пытаетесь использовать то, что не понимаете? Я вот прекрасно знаю что такое корреляция уже лет 25, но не использую на рынке, т.к. не вижу оснований для её применения.

Это продолжение темы про миф о трейде. Я потихонечку забиваю свой советник реальными данными. Такими как индексы доллара, индексы евро. Данные со сторонних ресурсов которые могут сделать хотя бы прототип книги заказов или стакана цен. Одно из данных это отклонение или выход из корреляции одной из пар. Сам я торгую треугольник евро-доллар- фунт.Для меня это может быть важно. Саму корреляцию можно закладывать в расчеты рисков в треугольнике. На первом этапе это конечно просто статистические данные в советника. На этом уровне сейчас у меня работают индексы евро и доллара. Реального толка пока мало, но приятно видеть в одном месте не переключаясь на разные ресурсы.
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.

Re: Создаем мультивалютный советник

Сообщение Haos » 05 июл 2017, 15:20

Используете эту формулу:
Код: выделить все
double p(double cov, double DX, double DY) // коэффициент выборочной корреляции
  {
   return(cov/MathSqrt(DX)/MathSqrt(DY));
  }

Используются функция дисперсии (вообще-то берется корень и получается среднеквадратическое отклонение) одного ряда данных:
Код: выделить все
double DX(double arr[], double MX) // дисперсия
  {
   int size=ArraySize(arr);
   double Sum=0.0;
   for(int i=0; i<size; i++)
       Sum+=MathPow(arr[i]-MX,2);
   return(Sum/(size-1));
  }

Дисперсии другого ряда данных DY и ковариация. Каждая сама по себе из этих функций использует ряд других, так что понадобятся и они. А ряды передаются через массивы. Что нибудь поняли? И оно Вам надо? :hi_hi_hi:
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Создаем мультивалютный советник

Сообщение Haos » 05 июл 2017, 15:26

Можете брать уже рассчитанные значения корреляции с какого-нибудь сайта. Только всё это я не знаю как может помочь.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Создаем мультивалютный советник

Сообщение ВЯЧЕСЛАВПЕТРОВ » 05 июл 2017, 16:14

Haos писал(а):Можете брать уже рассчитанные значения корреляции с какого-нибудь сайта. Только всё это я не знаю как может помочь.

На сайте посмотреть проще. Только ставить нужно задачу которая даст результат. Здесь будет вопрос каким образом советник посмотрит на сайте. С помощью формул советнику работать легче чем на сайт заглядывать. Получив данные советник уже может принимать действия когда я сплю, гуляю или работаю. Например расширять шаг сетки или ставить противоположный ордер или закрывать прибыль.
Код: выделить все
double DX(double arr[], double MX) // дисперсия
  {
   int size=ArraySize(arr);
   double Sum=0.0;
   for(int i=0; i<size; i++)
       Sum+=MathPow(arr[i]-MX,2);
   return(Sum/(size-1));
  }

double m3(double arr[], double MX) // 3-ий центральный момент
  {
   int size=ArraySize(arr);
   double Sum=0.0;
   for(int i=0; i<size; i++)
       Sum+=MathPow(arr[i]-MX,3);
   return(size/(size-1)/(size-2)*Sum);
  }

double m4(double arr[], double MX) // 4-ый центральный момент
  {
   double Sum2=0.0,
          Sum4=0.0;
   int size=ArraySize(arr);
   for(int i=0; i<size; i++) {
       Sum2+=MathPow(arr[i]-MX,2);
       Sum4+=MathPow(arr[i]-MX,4);
      }
   return(((MathPow(size,2)-2*size+3)*Sum4-
          (6*size-9)/size*MathPow(Sum2,2))/
          (size-1)*(size-2)*(size-3));
  }

double A(double arr[], double MX, double DX) // выборочная асиметрия
  {
   double Sum=0.0,
          size=ArraySize(arr);
   for(int i=0; i<size; i++)
       Sum+=MathPow(arr[i]-MX,3);
   return(size/(size-1)/(size-2)/MathPow(DX,1.5)*Sum);
  }

double E2(double arr[], double MX, double DX) // Эксцесс (другой способ вычисления)
  {
   double Sum2=0.0,
          Sum4=0.0,
          size=ArraySize(arr);
   for(int i=0; i<size; i++) {
       Sum2+=MathPow(arr[i]-MX,2);
       Sum4+=MathPow(arr[i]-MX,4);
      }
   return((size*(size+1)*Sum4-3*Sum2*Sum2*(size-1))/(size-1)/(size-2)/(size-3)/DX/DX);
  }

double E(double arr[], double MX, double DX) // Эксцесс
  {
   double Sum=0.0,
          size=ArraySize(arr);
   for(int i=0; i<size; i++)
       Sum+=MathPow(arr[i]-MX,4);
   return(((MathPow(size,2)-2*size+3)/(size-1)/DX*DX*Sum-
          (6*size-9)*(size-1)/size)/(size-2)/(size-3));
  }

double Gamma(double x) // гамма-функция Эйлера для x>0
  {
        double p = 0.0,
               pp = 0.0,
               qq = 0.0,
               z = 1.0,
               sgngam = 1.0;
        int    i = 0;

        if( x>33.0 )
            return(sgngam*gammastirf(x));
        while( x>=3 ) {
            x--;
            z = z*x;
           }
        while( x<2 ) {
            if( x<0.000000001 )
                return(z/((1+0.5772156649015329*x)*x));
            z/=x;
            x++;
           }
        if( x==2 )
            return(z);
        x-=2.0;
        pp = 0.000160119522476751861407;
        pp = 0.00119135147006586384913+x*pp;
        pp = 0.0104213797561761569935+x*pp;
        pp = 0.0476367800457137231464+x*pp;
        pp = 0.207448227648435975150+x*pp;
        pp = 0.494214826801497100753+x*pp;
        pp = 0.999999999999999996796+x*pp;
        qq = -0.0000231581873324120129819;
        qq = 0.000539605580493303397842+x*qq;
        qq = -0.00445641913851797240494+x*qq;
        qq = 0.0118139785222060435552+x*qq;
        qq = 0.0358236398605498653373+x*qq;
        qq = -0.234591795718243348568+x*qq;
        qq = 0.0714304917030273074085+x*qq;
        qq = 1.00000000000000000320+x*qq;
        return(z*pp/qq);
  }

double gammastirf(double x) // формула Стирлинга, используется для вычисления гамма-функции Эйлера для x>33
  {
   double y = 0.0,
          w = 0.0,
          v = 0.0,
          stir = 0.0;
   //--------
   w = 1.0/x;
   stir = 0.000787311395793093628397;
   stir = -0.000229549961613378126380+w*stir;
   stir = -0.00268132617805781232825+w*stir;
   stir = 0.00347222221605458667310+w*stir;
   stir = 0.0833333333333482257126+w*stir;
   w = 1+w*stir;
   y = MathExp(x);
   if(x>143.01608) {
      v = MathPow(x, 0.5*x-0.25);
      y = v*(v/y);
     }
   else y = MathPow(x, x-0.5)/y;
   return(2.50662827463100050242*y*w);
  }

double DDX(double arr[], double m4, double DX) // дисперсия выборочной дисперсии
  {
   return((m4-MathPow(DX,2))/ArraySize(arr));
  }

double Dsig(double arr[], double m4, double DX) // дисперсия выборочного среднего квадратического отклонения
  {
   return(DDX(arr,m4,DX)/DX/4);
  }

double DA(double size) // дисперсия выборочной асиметрии
  {
   return((6*size-6)/(size+1)/(size+3));
  }

double DE(double size) // дисперсия воборочного эксцеса
  {
   return(24*size*(size-2)*(size-3)/
          MathPow(size-1,2)/(size+3)/(size+5));
  }

double DMX(double DX, int size) // дисперсия выборочного матиматического ожыдания
  {
   return(DX/size);
  }

double Log(double x, double a) // логарифм х по основанию а
  {
   return(MathLog(x)/MathLog(a));
  }

Нашел еще индикатор.
Вложения
IND_Correlation.mq4
(5.96 KB) Скачиваний: 41
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.

Re: Создаем мультивалютный советник

Сообщение Рэндом » 07 июл 2017, 07:44

Почему бы не найти формулу корреляции в интернете и не написать код который нужен. Я так и сделал когда писал индикатор корреляции. Правда не помню на каком сайте смотрел формулу. Пришлось покопаться прежде чем нашел то что нужно. Но помню что код был не сложный. С индикатором который вы привели все сложно. Я не смог разобраться в его коде, но мне не особо удается читать чужой код.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Создаем мультивалютный советник

Сообщение Haos » 21 июл 2017, 10:27

Вот тот индикатор, что Вы нашли (Вячеслав), случаем, не отсюда? Там в чем удобство - задаете только символы по которым корреляция считаться будет и глубину анализа. Он выводит в виде графика, но если подправить инд., то, думаю, можно будет сделать вывод в виде цифры или на экран или в текст файл для дальнейшего чтения. Ну или нечто подобного.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Создаем мультивалютный советник

Сообщение ВЯЧЕСЛАВПЕТРОВ » 21 июл 2017, 10:48

Да я тоже уже подумал что индикатор можно внедрить в советник с помощью функции iCustom(). Спасибо за помощь. Взял наверное на том ресурсе. Уже точно не помню.
Значение буфера внешнего индикатора берется при помощи функции iCustom():
Теперь уже можно подумать как реально применить в торговле. Продолжим тему о корреляции в клубе стратегов с как позже.
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 71

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron