Prédire l'avenir avec les transformées de Fourier - page 5

 

Voici les fréquences qui se sont distinguées dans l'intervalle d'un peu plus d'une semaine (indiquées en jours)

4.58.

2.58.

1,63 (la plus forte, indiquée dans le graphique du milieu)

1.04

0.52.

0.26.


Avez-vous des suggestions sur ce qui cause la période de 1,63 jours (troisième harmonique de la semaine) ?

 

Voici la première prévision


Il y a encore beaucoup de travail à faire.

ANG3110, quelles sont vos prévisions pour demain ?

 
m_keeper:

Voici la première prévision


Il y a encore beaucoup de travail à faire.

ANG3110, quelles sont vos prévisions pour demain ?

Je n'ai pas vraiment fait de prévisions spécifiques. Je peux juste vous donner un dessin à l'œil.

Et que voyez-vous sur le graphique, décrivez-le plus en détail.


 
Peut-être que quelqu'un a une transformation de Fourier non rapide en mq4 ? Une implémentation en C ou en Pascal est également possible.
 
vaa20003:
Peut-être que quelqu'un a une transformation de Fourier non rapide en mq4 ? Une mise en œuvre en C ou en Pascal est également possible.

Sur la deuxième page, voir

 
m_keeper:
vaa20003:
Peut-être que quelqu'un a une transformation de Fourier non rapide en mq4 ? Une implémentation en C ou en Pascal est également possible.

Voir page deux.

Merci, ça m'a manqué...

 

Voici ce que nous avons obtenu jusqu'à présent

Nous recherchons les principales fréquences du marché, déterminons leur amplitude et leur phase, définissons les trnds, puis additionnons et normalisons le tout.

Je n'aime pas la façon dont les maxima locaux sont recherchés sur le périodogramme, la recherche est basée sur la distribution harmonique.

et il n'y a aucun signe de cela, bien sûr vous pouvez les isoler en jouant avec les paramètres, mais c'est toujours instable, et souvent très microlocal

des maxima.

Le deuxième inconvénient est que tout est affiché dans une seule fenêtre, il faut répartir tout ce plaisir sur plusieurs graphiques dans la fenêtre principale,

et 2 ou 3 fenêtres supplémentaires.


Qui sait comment faire pour que tous les calculs soient effectués en un seul endroit et que tous les autres - indicateurs, experts - aient accès aux résultats ?

La sélection des fréquences appropriées des fluctuations du marché doit encore être effectuée manuellement. Il serait très pratique de pouvoir sélectionner les maxima avec une souris ou une ligne comme ANG3110.


ANG3110, comment avez-vous mis en œuvre le travail avec la ligne ? Par le biais de scripts ?



Quelques mots sur ce qu'il faut faire avec ce que je viens de poster.

Lenght=560;//définir la taille de la fenêtre en barres
Period_count=2;//Combien de périodes nous allons considérer, en conséquence, la longueur devrait être period_count fois plus que ce que vous voyez sur le marché.
Garmonic=9;// Ce paramètre et le suivant sont déterminés par la méthode d'ajustement terriblement compliquée (je l'écrirai en détail).
GarmonicControl=1.7 ;

iMAperiod=4;//si l'ajustement n'a pas aidé, essayez de lisser un peu le graphique.

Futur=100;//pour combien de barres faire la prévision
InPast=200;// opération sur les barres précédentes, pour l'estimation de la prévision, en utilisant des données déjà existantes.

En fait, que voyez-vous sur l'indicateur (les prévisions pour aujourd'hui d'ailleurs) ?

Tous les graphiques doivent se situer dans une fourchette allant de 0 à la longueur (bien +/- 5 %).

Si la portée est différente, c'est juste un problème. Appuyez sur Refresh et cela fonctionnera bien (je ne comprends pas ce qui ne va pas ici).

Graphique rose fin - série chronologique préparée, devrait être similaire au cours.

Orange épais - périodogramme, la valeur de la période est égale à la valeur correspondante de la ligne bleue.

la position et la quantité de barres rouges alimentant la ligne bleue sont déterminées par Garmonic et GarmonicControl

Les barres vertes soutiennent le périodogramme - les périodes détectées dépendent fortement des lignes rouges. Après avoir discerné les périodes les plus significatives, vous devriez commencer à ajuster le Garmonic* jusqu'à ce que vous obteniez le résultat suivant

La fine courbe verte est le phasogramme. Il semble que si la fréquence est stable, le phasogramme est lisse, mais s'il fluctue, c'est que la fluctuation de cette fréquence a été récemment perturbée et qu'on ne peut s'y fier. (0 correspond à -pi/2 ; Longueur --- 3*pi/2)


Et en fait, la chose la plus importante est la ligne rose épaisse - c'est une prévision. La prévision ne doit pas nécessairement coïncider avec le graphique initial par élévation et répéter le précédent. La chose la plus importante à voir est les points de pivot et leur intensité possible (le temps de pivot prédit sera sûrement différent).


Dossiers :
 
m_keeper:

Après tout, la sélection des fréquences de fluctuation du marché appropriées doit être effectuée manuellement. Il serait très pratique de sélectionner les maxima avec une souris, ou avec une ligne, comme ANG3110 l'a fait.


ANG3110, comment avez-vous mis en œuvre le travail avec la ligne ? Par le biais de scripts ?

Dans votre cas, je pense que l'option suivante est la plus appropriée :

Vous créez un script pour contrôler l'indicateur :


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

Vous l'insérez après int start() dans l'indicateur :

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


D'abord, vous placez l'indicateur sur le graphique, puis vous jetez le script et utilisez le canal LR pour déplacer le graphique.

J'espère que vous pourrez le faire vous-même, ou que je pourrai vous donner un indice.

 

Merci, les lignes sont réglées.


Puis-je poser une autre question ?

J'ai maintenant des informations dans 3 graphiques, un dans la fenêtre principale et deux dans ma fenêtre.

Les paramètres sont définis uniquement dans l'un d'entre eux et stockés dans des variables globales.

Les paramètres sont définis uniquement dans l'un d'entre eux et stockés dans des variables globales avec les clés "PF_"+Symbol()+"_"+DoubleToStr(Period(),0)+"_key".

Je stocke également les informations sur les maxima dans des variables globales

Le problème est que je dois effectuer les calculs trois fois pour chaque graphique.

Au début j'ai essayé iCustom, mais à mon avis il ne prend pas

les données des graphiques précédemment ajoutés, mais les calcule à nouveau, au moins init

et voit qu'il est déjà lancé (par les variables globales)

et ne fait pas de calculs, et iCustom retourne un Empty.

Existe-t-il un moyen de rendre les tableaux globaux ?

Il me semble que si vous entassez des milliers de valeurs dans GlobalVariable, le fonctionnement sera beaucoup plus lent.

il sera beaucoup plus lent à fonctionner, car la recherche sur la chaîne va

 
m_keeper:

Existe-t-il un moyen de rendre les tableaux globaux ?

Je ne suis pas tout à fait sûr de ce dont vous avez besoin, mais lorsque vous devez enregistrer un grand nombre de données et les relire ensuite, il est plus facile d'utiliser l'écriture dans un fichier intermédiaire, par exemple :

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

FileWriteArray(handle,arr,0,Narr) ;

Et ensuite relire un autre programme :

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

FileReadArray(handle,arr,0,Narr) ;

Veuillez consulter l'aide MT4 pour plus de détails.