Vorhersage der Zukunft mit Fourier-Transformationen - Seite 5

 

Im Folgenden sind die Häufigkeiten aufgeführt, die im Zeitraum von etwas mehr als einer Woche auffielen (Angabe in Tagen)

4.58.

2.58.

1,63 (der stärkste, in der Grafik in der Mitte dargestellt)

1.04

0.52.

0.26.


Gibt es Hinweise auf die Ursache für die Periode von 1,63 Tagen (dritte Harmonische der Woche)?

 

Hier ist die erste Prognose


Es gibt noch eine Menge Arbeit zu tun

ANG3110, wie lautet Ihre Prognose für morgen?

 
m_keeper:

Hier ist die erste Prognose


Es gibt noch eine Menge Arbeit zu tun

ANG3110, wie lautet Ihre Prognose für morgen?

Ich habe noch keine konkrete Prognose abgegeben. Ich kann Ihnen nur eine Zeichnung nach Augenmaß geben.

Und was sehen Sie auf dem Diagramm? Beschreiben Sie es genauer.


 
Vielleicht hat jemand eine nicht-schnelle Fourier-Transformation nach mq4? Eine Implementierung in C oder Pascal ist ebenfalls möglich.
 
vaa20003:
Vielleicht hat jemand eine nicht-schnelle Fourier-Transformation nach mq4? Eine Implementierung in C oder Pascal ist ebenfalls möglich.

Auf der zweiten Seite finden Sie

 
m_keeper:
vaa20003:
Vielleicht hat jemand eine nicht-schnelle Fourier-Transformation nach mq4? Eine Implementierung in C oder Pascal ist ebenfalls möglich.

Siehe Seite zwei.

Danke, ich habe es verpasst...

 

Das haben wir bis jetzt herausgefunden

Wir suchen nach den wichtigsten Marktfrequenzen, bestimmen ihre Amplitude und Phase, definieren trnd, addieren und normalisieren das Ganze.

Mir gefällt nicht, wie im Periodogramm nach lokalen Maxima gesucht wird; die Suche basiert auf der harmonischen Verteilung

und es gibt keine Anzeichen dafür. Natürlich kann man sie isolieren, indem man mit den Parametern spielt, aber es ist immer noch instabil und oft sehr mikrolokal

der Maxima.

Der zweite Nachteil besteht darin, dass alles in einem Fenster angezeigt wird und man all dieses Vergnügen auf mehrere Diagramme im Hauptfenster verteilen muss,

und 2-3 zusätzliche Fenster.


Wer kann dafür sorgen, dass alle Berechnungen an einer Stelle durchgeführt werden und alle anderen - Indikatoren, Experten - Zugang zu den Ergebnissen haben?

Die Auswahl der geeigneten Häufigkeit von Marktschwankungen sollte weiterhin manuell erfolgen. Es wäre sehr praktisch, Maxima mit einer Maus oder einer Linie wie ANG3110 auszuwählen.


ANG3110, wie haben Sie die Arbeit mit der Linie umgesetzt? Durch Skripte?



Ein paar Worte dazu, was mit dem, was ich jetzt geschrieben habe, zu tun ist.

Lenght=560;//Einstellung der Fenstergröße in Takten
Period_count=2;//Wie viele Perioden wir berücksichtigen werden, dementsprechend sollte die Länge period_count mal mehr sein als das, was Sie auf dem Markt sehen
Garmonic=9;// Dieser und der nächste Parameter werden durch die Methode der furchtbar komplizierten Anpassung bestimmt (ich werde darüber im Detail schreiben)
GarmonicControl=1.7;

iMAperiod=4;//wenn die Anpassung nicht geholfen hat, versuchen Sie, den Graphen ein wenig zu glätten

Futur=100;//für wie viele Balken die Prognose erstellt werden soll
InPast=200;// Operation auf den vorherigen Balken, für die Schätzung der Prognose, unter Verwendung bereits vorhandener Daten

Was sehen Sie eigentlich auf dem Indikator (übrigens die Vorhersage für heute)

Alle Graphen sollten in einem Bereich von 0 bis Lenght liegen (gut +/- 5%)

Wenn der Bereich anders ist, ist das nur eine Störung. Drücken Sie Refresh und es wird funktionieren (ich verstehe nicht, was hier falsch ist)

Dünnes rosafarbenes Diagramm - vorbereitete Zeitreihe, sollte dem Verlauf ähnlich sein.

Dickes Orange - Periodogramm, Periodenwert ist gleich dem entsprechenden Wert der blauen Linie

Position und Menge der roten Balken, die in die blaue Linie einfließen, werden von Garmonic und GarmonicControl bestimmt

Die grünen Balken, die das Periodogramm stützen - die erkannten Perioden hängen stark von den roten Linien ab. Wenn Sie die wichtigsten Perioden erkannt haben, sollten Sie die Garmonic* so lange einstellen, bis Sie das Ergebnis erhalten

Die dünne grüne Kurve ist das Phasogramm. Wenn die Frequenz stabil ist, sieht es so aus, als ob das Phasogramm glatt ist, aber wenn es schwankt, dann wurde die Oszillation dieser Frequenz vor kurzem gestört und man kann ihr nicht trauen. (0 entspricht -pi/2 ; Länge --- 3*pi/2)


Und das Wichtigste ist eigentlich die dicke rosa Linie - sie ist eine Vorhersage. Die Vorhersage muss nicht mit der anfänglichen Grafik übereinstimmen und die vorherige wiederholen. Das Wichtigste sind die Pivot-Punkte und ihre mögliche Intensität (die vorhergesagte Pivot-Zeit wird sicherlich anders sein)


Dateien:
 
m_keeper:

Die Auswahl geeigneter Marktschwankungsfrequenzen muss schließlich manuell vorgenommen werden. Es wäre sehr bequem, Maxima mit der Maus oder mit einer Linie auszuwählen, wie es ANG3110 hat


ANG3110, wie haben Sie die Arbeit mit der Linie umgesetzt? Durch Skripte?

Für Ihren Fall halte ich die folgende Option für am besten geeignet:

Sie erstellen ein Skript zur Steuerung des Indikators:


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

Sie fügen ihn nach int start() in den Indikator ein:

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


Zuerst setzen Sie den Indikator auf den Chart, dann werfen Sie das Skript weg und verwenden den LR-Kanal, um den Chart zu bewegen.

Ich hoffe, Sie können es selbst tun, oder ich kann Ihnen einen Tipp geben.

 

Vielen Dank, die Zeilen sind sortiert.


Darf ich noch eine Frage stellen?

Ich habe jetzt Informationen in 3 Diagrammen, eines im Hauptfenster und zwei in meinem Fenster.

Die Parameter werden nur in einem von ihnen festgelegt und in globalen Variablen gespeichert

Die Variablen werden in globalen Variablen mit den Schlüsseln "PF_"+Symbol()+"_"+DoubleToStr(Zeitraum(),0)+"_key" gespeichert.

Ich speichere auch Informationen über Maxima in globalen Variablen

Das Problem ist, dass ich die Berechnungen für jedes Diagramm dreimal durchführen muss.

Am Anfang habe ich iCustom ausprobiert, aber meiner Meinung nach nimmt es nicht

die Daten aus den zuvor hinzugefügten Diagrammen, sondern berechnet sie erneut, zumindest init

und sieht, dass es bereits gestartet ist (durch globale Variablen)

und führt keine Berechnungen durch, und iCustom gibt ein Leerzeichen zurück.

Gibt es eine Möglichkeit, die Arrays global zu machen?

Es scheint mir, dass, wenn Sie Tausende von Werten in GlobalVariable stopfen, es wird viel langsamer zu arbeiten.

wird es viel langsamer gehen, weil die Suche nach der Zeichenkette

 
m_keeper:

Gibt es eine Möglichkeit, Arrays global zu machen?

Ich bin mir nicht ganz sicher, was Sie brauchen, aber wenn Sie viele Daten speichern und dann wieder lesen müssen, ist es einfacher, z. B. in eine Zwischendatei zu schreiben:

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

FileWriteArray(handle,arr,0,Narr);

Und dann von einem anderen Programm zurücklesen:

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

FileReadArray(handle,arr,0,Narr);

Weitere Einzelheiten finden Sie in der MT4-Hilfe.