Скачать MetaTrader 5

Спектральный анализ

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Opeyda
1105
Andrey Opeyda  
Видел как ребята проводили спектральный анализ валютных пар. Но чесно говоря не понял как вообще построить кривую спектра. Может есть линки. Зараннее благодарен.
Yury Reshetov
13463
Yury Reshetov  
njel:
Видел как ребята проводили спектральный анализ валютных пар. Но чесно говоря не понял как вообще построить кривую спектра. Может есть линки. Зараннее благодарен.
Кривой спектра не бывает, а бывают значения амплитуд и фаз спектра (или, как его еще называют - гармоники). А вычисляют очень просто, т.е. берут целочисленные гармоники и по формулам Фурье получают комплексные числа. Потом остается только вычислить по этим самым комплексным числам амплитуду и фазу спектров. Короче говоря, обычная тригонометрическая аппроксимация.
Andrey Opeyda
1105
Andrey Opeyda  
ок. спасибо.
я думал по спектру определять устойчивость канала... например лин. регрессии. Хмм...
Andrey Opeyda
1105
Andrey Opeyda  
klot если прочитаешь этот пост, пожалуйста откликнись (njel(собака)rambler. ru).
Candid
1630
Candid  

Я для себя такой индикатор сделал: рисует ln спектральной плотности для участка нужной длины от задаваемой в параметрах даты и если надо, записывает в файл

//+------------------------------------------------------------------+
//|                                                           SD.mq4 |
//|                                         Copyright © 2007, Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
// Делаем realfastfouriertransform нужной длины от заданной даты,
// вычисляем спектральную плотность и при желании записываем в файл.
#property copyright "Copyright © 2007, Candid"
#property link      "likh@yandex.ru"
 
#property show_inputs
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Blue
 
#import "#_lib_FFT.ex4"
void fastfouriertransform(double& a[], int nn, bool inversefft);
void realfastfouriertransform(double& a[], int tnn, bool inversefft);
void fastcorellation(double& signal[], int signallen,  double& pattern[],  int patternlen);
void fastconvolution(double& signal[], int signallen, double& response[], int negativelen, int positivelen);
void fastsinetransform(double& a[], int tnn, bool inversefst);
void fastcosinetransform(double& a[], int tnn, bool inversefct);
void tworealffts(double a1[], double a2[],  double& a[],  double& b[], int tn);
#import
 
extern double n=9;   //ширина окна (окно 2^n баров)
extern datetime FromDate= D'2004.01.01 00:00';   //начало данных
extern bool SaveSD = false;   
 
double SD[];  //  Спектральная плотность
double Data[];
int M,N;
int pos,FirstPos,LastPos;
int ind;
int handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
  IndicatorShortName("SD");
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(0,SD);
 
  M=MathPow(2,n-1);
  N = 2*M;
  ArrayResize(Data,N);
 
  if (SaveSD) handle = FileOpen("SD.txt",FILE_CSV|FILE_WRITE,';');
 
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |                                                                 |
//+------------------------------------------------------------------+
int deinit() {
  if (SaveSD) FileClose(handle);
  return(0);
}
//+------------------------------------------------------------------+
//|                Start function                                    |
//+------------------------------------------------------------------+
int start() {
//----
  
  FirstPos = iBarShift(NULL,0,FromDate,false);
  LastPos = FirstPos-N+1;
  for (pos=FirstPos; pos>=LastPos; pos--) {
    ind = FirstPos-pos;
    Data[ind] = Close[pos];
  }
  realfastfouriertransform(Data,N,false);
//  SD[FirstPos] = MathLog(Data[0]*Data[0]);
  SD[FirstPos-M] = MathLog(Data[1]*Data[1]);
  for (ind=1;ind<M;ind++) {
    pos = ind+ind;
    SD[FirstPos-ind]=MathLog(Data[pos]*Data[pos] + Data[pos+1]*Data[pos+1]);
  }
  if (SaveSD) {
    for (ind=1;ind<=M;ind++) {
      FileWrite(handle,ind,SD[ind]);
    }
  }
//----
  return(0);
}
//+------------------------------------------------------------------+
Andrey Opeyda
1105
Andrey Opeyda  
а я так выганялся. (индюк прогнать на тестере)
Файлы:
Candid
1630
Candid  

Визуализация вэйвлетов в МТ4 - это просто! :) Респект!
Маленькая ремарка: если я правильно понял формат возвращаемых realfastfouriertransform данных, фрагмент

   for( i=0; i<=N-1; i++)
   {
      SpecktrBuffer[i]=MathSqrt(aa[i*2]*aa[i*2]+aa[i*2+1]*aa[i*2+1]); 
      LineBuffer[i] = 0.1;  
   }

даёт ошибку для нулевой частоты (ср. мой код). Впрочем, это постоянная составляющая, обычно она вообще не нужна. У меня она закомментирована и просто не выводится.
А вообще мой код на самом деле всего лишь заготовка - на зашумленных данных без усреднения спектральная плотность бесполезна практически.

Andrey Opeyda
1105
Andrey Opeyda  
чё то я заблудился короче.
Dmitrii
328
Dmitrii  
Вообщем, ситуация такая, - главный недостаток Фурье и всех остальных методов разложения заключается в том, то они предполагают периодическую структуру процесса, а рынок, в принципе не является таковой. .... Применение данных методов я нашел только с помощью использования алгоритмов . Нейросети распознают спеткр, который на данный момент существует и принимаю решение о входе в рынок.
Суть метода аналогична распознаванию паттернов. Вообщем получается пока, для анализа я использую нейрошелелл и кучу собственных написанных dll-ок с разнами алгоритмами преобразования...
Candid
1630
Candid  
А я сейчас использую спектральную плотность для сбора информации к размышлению https://www.mql5.com/ru/forum/50458
Nikitoss
107
Nikitoss  

Хотелось бы развить оборованные подобные темы, которые быстро затихли в свое время.

В часности посты клота с паука.

вот

вот

По моим скромным наблюдениям, нейросеть хорошо "раскусывает" первую производную, если мы хотим прогнозировать значение переменной(цену). Если мы хотим прогнозировать изменение (цены), то на вход лучше подавать вторую производную, т.е. ускорение - изменение изменения цены. Тут, кстати важную роль играет относительный угол (приращение цены на бар - единицу времени).
Иследования еще не закнчены, когда будут закончены, никто не знает... Мне кажется, что это больше флосовский вопрос...
Однако, использование формулы для определения угла, которую пердожил бугира имеет определенный смысл, который выражается в стат. исследовании, я пробовал в нейрошелдейтрейдере - результат положительный.

==================

Вы прогнозируете 2-ую производную?


Нет, прогнозирую 1-ю,а на вход подаю 2-ю и 1-ю с прошлых значений.

===============================

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий