Predicción del futuro con transformadas de Fourier - página 5

 

Estas son las frecuencias que han destacado en el intervalo de algo más de una semana (mostradas en días)

4.58.

2.58.

1,63 (el más fuerte, mostrado en el gráfico del centro)

1.04

0.52.

0.26.


¿Alguna sugerencia sobre la causa del período de 1,63 días (tercer armónico de la semana)?

 

Esta es la primera previsión


Todavía queda mucho trabajo por hacer

ANG3110, ¿cuál es tu previsión para mañana?

 
m_keeper:

Esta es la primera previsión


Todavía queda mucho trabajo por hacer

ANG3110, ¿cuál es tu previsión para mañana?

En realidad, no he hecho una previsión específica. Puedo hacer un dibujo a ojo.

Y lo que ves en el gráfico, descríbelo con más detalle.


 
¿Tal vez alguien tiene una transformada de Fourier no rápida a mq4? También es posible una implementación en C o Pascal.
 
vaa20003:
¿Tal vez alguien tiene una transformada de Fourier no rápida a mq4? También es posible la implementación en C o Pascal.

En la segunda página, véase

 
m_keeper:
vaa20003:
¿Tal vez alguien tiene una transformada de Fourier no rápida a mq4? También es posible una implementación en C o Pascal.

Véase la página 2.

Gracias, me lo perdí...

 

Esto es lo que tenemos hasta ahora

Buscamos las principales frecuencias del mercado, determinamos su amplitud y fase, definimos trnd y sumamos y normalizamos el conjunto.

No me gusta la forma en que se buscan los máximos locales en el periodograma, la búsqueda se basa en la distribución armónica

y no hay señales de ello, por supuesto que se pueden aislar jugando con los parámetros, pero sigue siendo inestable, y a menudo muy microlocal

de los máximos.

El segundo inconveniente es que todo se muestra en una sola ventana, es necesario repartir todo este placer en varios gráficos en la ventana principal,

y 2-3 ventanas adicionales.


¿Quién sabe cómo hacer que todos los cálculos se realicen en un solo lugar y que todos los demás -indicadores, expertos- tengan acceso a los resultados?

La selección de las frecuencias adecuadas de las fluctuaciones del mercado debe seguir haciéndose manualmente. Sería muy conveniente seleccionar los máximos con un ratón o una línea como ANG3110


ANG3110, ¿cómo has implementado el trabajo con la línea? ¿A través de guiones?



Un par de palabras sobre qué hacer con lo que he publicado ahora.

Lenght=560;//configura el tamaño de la ventana en barras
Period_count=2;//Cuántos periodos vamos a considerar, en consecuencia, la longitud debe ser period_count veces más de lo que se ve en el mercado
Garmonic=9;// Este parámetro y el siguiente se determinan por el método de ajuste terriblemente complicado (escribiré sobre ello en detalle)
GarmonicControl=1.7;

iMAperiod=4;//si el ajuste no ayudó, intenta suavizar un poco el gráfico

Futur=100;//para cuántas barras hacer la previsión
InPast=200;// operación sobre barras pasadas, para la estimación de la previsión, basada en datos ya existentes

En realidad lo que se ve en el indicador (la previsión para hoy por cierto)

Todos los gráficos deben estar en un rango de 0 a Lenght (bien +/- 5%)

Si el rango es diferente es sólo un fallo. Pulsa Refrescar y funcionará bien (no entiendo qué pasa aquí)

Gráfico fino de color rosa: serie temporal preparada, debería ser similar al curso.

Naranja grueso - periodograma, el valor del periodo es igual al valor correspondiente de la línea azul

La posición y la cantidad de barras rojas que alimentan la línea azul están determinadas por Garmonic y GarmonicControl

Las barras verdes apuntalan el periodograma: los periodos detectados dependen en gran medida de las líneas rojas. Una vez discernidos los periodos más significativos, hay que empezar a ajustar el Garmonic* hasta obtener el resultado

La fina curva verde es el fasograma, parece que si la frecuencia es estable el fasograma es suave, pero si fluctúa es que la oscilación de esa frecuencia ha sido perturbada recientemente y no se puede confiar en ella. (0 corresponde a -pi/2 ; Lenght --- 3*pi/2)


Y, en realidad, lo más importante es la línea rosa gruesa: es una previsión. La previsión no tiene por qué coincidir con el gráfico inicial en términos de elevación y repetir el anterior. Lo más importante es ver los puntos de pivote y su posible intensidad (el tiempo de pivote previsto seguramente será diferente)


Archivos adjuntos:
 
m_keeper:

Al fin y al cabo, la selección de las frecuencias de fluctuación del mercado adecuadas debe hacerse manualmente. Sería muy conveniente seleccionar los máximos con un ratón, o con una línea, como tiene ANG3110


ANG3110, ¿cómo has implementado el trabajo con la línea? ¿A través de guiones?

Para tu caso, creo que lo más adecuado es la siguiente opción:

Se hace un script para controlar el indicador:


//==============================================================
#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");
}
//**************************************************************

Se inserta después de int start() en el indicador:

   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);
   }


Primero pones el indicador en el gráfico, luego tiras el script y usas el canal LR para mover el gráfico.

Espero que puedas hacerlo tú mismo, o que yo pueda darte una pista.

 

Gracias, las líneas están ordenadas.


¿Puedo hacer una pregunta más?

Ahora tengo información en 3 gráficos, uno en la ventana principal y dos en mi ventana.

Los parámetros se fijan sólo en uno de ellos y se almacenan en variables globales

Los parámetros se establecen sólo en uno de ellos y se almacenan en variables globales con las claves "PF_"+Símbolo()+"_"+DoubleToStr(Periodo(),0)+"_clave".

También almaceno información sobre los máximos en variables globales

El problema es que tengo que realizar los cálculos tres veces para cada gráfico.

Al principio probé con iCustom, pero en mi opinión no lleva

los datos de los gráficos añadidos anteriormente, sino que los calcula de nuevo, al menos init

y ve que ya está iniciado (por variables globales)

y no hace cálculos, y iCustom devuelve un Empty.

¿Hay alguna manera de hacer que las matrices sean globales?

Me parece que si metes miles de valores en GlobalVariable, el funcionamiento será mucho más lento.

será mucho más lento para trabajar, porque la búsqueda en la cadena va

 
m_keeper:

¿Hay alguna forma de hacer globales las matrices?

No estoy muy seguro de lo que necesitas, pero cuando necesitas guardar muchos datos y luego volver a leerlos, es más fácil utilizar la escritura en un archivo intermedio, por ejemplo:

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

FileWriteArray(handle,arr,0,Narr);

Y luego leer de nuevo desde otro programa:

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

FileReadArray(handle,arr,0,Narr);

Por favor, consulte la Ayuda de MT4 para más detalles.

Razón de la queja: