Прогноз будущего при помощи Преобразований Фурье - страница 5

 

Вот частоты которые выделились на интервале чуть больше недели(показаны в днях)

4,58(почти целая неделя)

2.58(половина недели)

1.63(самая мощьная, её видно на графике посередине)

1.04(один день)

0.52(первая гармоника дня)

0.26(вторая гармоника)


Есть предположения чем обусловлен период в 1.63 дня (третья гармоника недели)?

 

Вот и первый прогноз


Много ещё из запланированного не сделано

ANG3110, какой у тебя прогноз на завтра?

 
m_keeper:

Вот и первый прогноз


Много ещё из запланированного не сделано

ANG3110, какой у тебя прогноз на завтра?

Я вообще-то специально прогноз не составлял. Могу привести просто рисунок на глаз.

А что у тебя изображено на графике, опиши подробней.


 
Может есть у кого - нибудь не быстрое преобразование Фурье в mq4? Можно и реализация на С или паскале.
 
vaa20003:
Может есть у кого - нибудь не быстрое преобразование Фурье в mq4? Можно и реализация на С или паскале.

На второй странице смотри

 
m_keeper:
vaa20003:
Может есть у кого - нибудь не быстрое преобразование Фурье в mq4? Можно и реализация на С или паскале.

На второй странице смотри

Спасибо, пропустил...

 

Ну собственно вот что пока получилось

Делается поиск основных частот рынка, определяется их амплитуда и фаза, опеделяется трнд, и всё это дело складывается и нормируется.

Мне сейчас очень ненравится, как реализован поиск локальных максимумов на периодограмме, поиск ведётся по гармоническому распределению

а им там и не пахнет, выдельть их конечно можно поигравшись с параметрами, но всёравно нестабильно, и часто совсем микролокальные

максимумы выделяются.

Второй недостатотк, это то что всё выводится в одном окне, надо разести всё это удовольствие по нескольким графикам в основном окне,

и ещё по 2-3 дополнительным окнам.


Кто знает как сделать так, чтобы все расчёты велись в каком нибудь одном месте, а к результатам имели доступ все остальные - индикаторы,эксперты?

Выбор соответствующихчастот колебания рынка надо всётаки делать вручную. Очень удобно было бы выбирать максимумы мышкой, или линией, как у ANG3110


ANG3110, как ты реализовал работу с линией? Через скрипты?



Пара слов о том что делать с тем, что я сейчас выложил.

Lenght=560;// Задает размер окна в барах
Period_count=2;// Сколько периодов мы будем рассматривать, соответственно Lenght должна быть в Period_count раз больше чем то что вы увидели на рынке
Garmonic=9;// Этот параметр и следующий определяются методом до безобразия жуткого подгона(об этом напишу подробнее)
GarmonicControl=1.7;

iMAperiod=4;//если подгон не помог попробуйте немного сгладить график

Futur=100;// На сколько баров делать прогноз
InPast=200;// Работа на прошедших барах, для оценки прогнозирования, по уже имеющимся данным

Собственно что же такое вы видите на индикаторе (прогноз на сегодня кстати)

Все графики должны лежать в диапазоне от 0 до Lenght (ну +/- 5%)

Если диапазон другой то это он просто глючит, нажмите Обновить и всё пройдёт (никак не могу понять где тут баг)

Тонкий розовый график - подготовленный временной ряд, должен быть похож на курс.

Толстая оранжевая - периодограмма, значение периода равно соответствующему значению синей прямой

положение и колличество Красных столбиков подпирающих синюю линию определяется через Garmonic и GarmonicControl

Зелёные столбики подпирающие периодограмму - обнаруженные периоды, сильно зависят от красных линий, выделив на глаз наиболее значимые периоды, надо начать подгонять Garmonic*, пока не будет достигнут результат

Тонкая зелёная кривая - это фазограмма, похоже на то, что если частота устойчива, то и фазограмма гладкая, а если колеблится, то колебания этой частоты были недавно нарушены, и им верить нельзя. (0 соответствует -pi/2 ; Lenght --- 3*pi/2)


Ну и собственно самое главное толстая розовая линия - это прогноз. Прогноз не обязан совпадать с исхдным графиком по высоте и повторять отдолённое прошлое. Главное что в нём надо видеть это точки поворота, и их возможную интенсивность (предсказанное время поворота наверняка несовпадёт)


Файлы:
 
m_keeper:

Выбор соответствующихчастот колебания рынка надо всётаки делать вручную. Очень удобно было бы выбирать максимумы мышкой, или линией, как у ANG3110


ANG3110, как ты реализовал работу с линией? Через скрипты?

Для твоего случая я думаю наиболее подходящ следующий вариант:

делаешь скрипт для управлением индикатором:


//==============================================================
#import "user32.dll"
int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
#import
#define WM_COMMAND   0x0111
//==============================================================
int i0,ip,T;
int t0,tp,t0n,tpn;
string Symb;
int Per;
//**************************************************************
int init() 
{ 
   Symb=Symbol();
   Per=Period();
   
   t0=WindowTimeOnDropped();
   T=64; 

   i0=iBarShift(Symbol(),Period(),t0);
   ip=i0+T;
   tp=Time[ip];
   t0n=t0;
   tpn=tp;
   
   ObjectCreate("RCh",4,0,tp,0,t0,0);
   ObjectSet("RCh",OBJPROP_COLOR,DodgerBlue); 
}
//**************************************************************
int start() 
{
   int hwnd=WindowHandle(Symb,Per);        
   if (hwnd!=0) 
   {
      PostMessageA(hwnd,WM_COMMAND,33324,0); 
      GlobalVariableSet("gi0",i0);
      GlobalVariableSet("gip",ip);
   } else return(0);
   //---- 
   while(IsStopped()==false) 
   {
      t0=ObjectGet("RCh",OBJPROP_TIME2); 
      if (t0>Time[0]) t0=Time[0]; 
      tp=ObjectGet("RCh",OBJPROP_TIME1); 
      i0=iBarShift(NULL,Per,t0);
      ip=iBarShift(NULL,Per,tp);
      
      T=ip-i0;
      if (T<2) {T=2; ip=i0+T; tp=Time[ip];}
      
      if (t0n!=t0 || tpn!=tp) 
      {
         GlobalVariableSet("gi0",i0);
         GlobalVariableSet("gip",ip);
         PostMessageA(hwnd,WM_COMMAND,33324,0);
         t0n=t0;
         tpn=tp;
      } 
      
      Sleep(200);
   }
   //=============================================
   return(0);
}
//**************************************************************
void deinit() 
{
   ObjectDelete("RCh"); 
   GlobalVariableDel("gi0");
   GlobalVariableDel("gip");
}
//**************************************************************

А в индикаторе, после int start() вставляешь:

   if (GlobalVariableCheck("gi0")) 
   {
      i0=GlobalVariableGet("gi0"); 
      ip=GlobalVariableGet("gip");
      T=ip-i0;
      SetIndexShift(2,T/2);
      SetIndexShift(3,T/2);
   }
   else 
   {
      i0=0; T=T0; SetIndexShift(2,T/2); SetIndexShift(3,T/2);
   }


Сначала ставишь на график индикатор, затем выбрасываешь скрипт и каналом LR двигаешь, график.

Гашение лишних линий, надеюсь сможешь сделать сам, или если что могу подсказать.

 

Спасибо, с линиями разобрался.


Можно ещё один вопрос

я сейчас инфу по 3 графикам разнёс, один в главном окне и два в своих.

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

с ключами "PF_"+Symbol()+"_"+DoubleToStr(Period(),0)+"_key"

информацию о максимумах я тоже храню в глобальных переменных

Проблема в том что расчёты приходится проводить трижды, для каждого графика

Вначале я пробывал через iCustom, но помоему при его использовании он не берёт

данные из ранее добавленных графиков, а рассчитывает их занова, покрайней init

срабатывает поновой, и видит что он уже запущен(по глобальным переменным)

и рассчётов не ведёт, а iCustom возвращает Empty

Есть какой нибудь способ сделать массивы глобальными?

Мне кажется что если в GlobalVariable тысячи значений запихнуть то будет гораздо

медленнее работать, тамже поиск по строке идёт

 
m_keeper:

Есть какой нибудь способ сделать массивы глобальными?

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

int handle=FileOpen("Test.dat",FILE_BIN|FILE_WRITE);

FileWriteArray(handle,arr,0,Narr);

А потом обратно считать из другой программы:

int handle=FileOpen("Test.dat",FILE_BIN|FILE_READ);

FileReadArray(handle,arr,0,Narr);

Подробности посмотри в Help MT4.

Причина обращения: