Indikatoren: Fourier Extrapolation des Kurses - Seite 4

 

Hey, interessanter Indikator. Mir gefällt der mathematische Aspekt der tatsächlichen Verwendung eines Projektionsmodells in den Charts. Ich habe noch nicht allzu viel Erfahrung mit Code, daher frage ich mich, wie man das Modell so einstellen könnte, dass es "zurückgeht" und die Vorhersagekurve erstellt, die es vor einer bestimmten Anzahl von Ticks (sagen wir 100) erstellt haben "würde". Auf diese Weise könnte es auf verschiedene Charts angewandt werden und eine Vorstellung davon vermitteln, wie sehr die Realität vom Modell abweicht, und vielleicht dazu dienen, einige Merkmale eines Marktes zu identifizieren, auf dem das Modell gut funktioniert, usw.

 
Saidar:
Ja, ich benutze Windows 7, ich werde es mir ansehen

Vielleicht möchten Sie mt5 im portablen Modus ausführen:

terminal.exe /portable

Sie erhalten einen Indikator, der im aktuellen mt5-Verzeichnis arbeitet - nützlich für die Installation eines Pendrive

 

Modifikation, um den Indikator zum Testen seiner Vorhersagefähigkeit zeitlich nach hinten zu verschieben:

in Zeile 32 einfügen:
input int TimeShift = 10; // wie viele Takte zurückgeschoben werden, nützlich für die Bewertung der Vorhersagefähigkeit des Indikators

in Zeile 54 ersetzen:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut);
mit:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut - TimeShift);

in Zeile 55 einfügen:
PlotIndexSetInteger(1, PLOT_SHIFT, -TimeShift);

in Zeile 87 replace:
if(CopyRates(NULL, 0, 0, Npast, rates) <= 0) return(0);
mit:
if(CopyRates(NULL, 0, TimeShift, Npast, rates) <= 0) return(0);

 

Ein Blick lohnt sich.

Wer benutzt ihn beim Handel?

Ich habe ihn durch die Historie laufen lassen - es hat sich herausgestellt, dass der Indikator den Trend überhaupt nicht berücksichtigt, er hat mehrere tausend fünfstellige Punkte gegen den Trend vorhergesagt, meiner Meinung nach sollte er mit einem Indikator wie MA/CCI/Bollinger Bands verwendet werden, wo der Extrapolator das Signal bestätigt, sonst kann er sich als Abfluss erweisen

Er soll am besten auf höheren Zeitrahmen verwendet werden, auf D1 hat er einen Monat lang mit erstaunlicher Genauigkeit vorhergesagt, aber als der Trend begann, war ich sehr enttäuscht (siehe letzter Absatz).

 

Dankeschön

 
lazarev-d-m:

Ein Blick lohnt sich.

Wer benutzt es im Handel?


Ich bin auch sehr neugierig, wenn jemand Extrapolatoren in seinem TS verwendet, wie genau? Und wie vielversprechend ist diese Richtung der Gralssuche?

Rein intuitiv scheint es, dass dies das ist, was gebraucht wird, aber irgendwie auf die Tests und Vorhersagen dieser Extrapolator korrelieren sehr schlecht mit der Realität, zumindest für mich stellte sich heraus, so ...

Könnten Sie mir bitte sagen, welche Extrapolatoren in Frage kommen und welcher von ihnen der genaueste ist? Ich meine, dass wahrscheinlich nicht nur Fourier-Reihen zerlegt werden können, die Möglichkeiten sind endlos. Man kann z.B. vom einfachsten Weg ausgehen und von der Kreuzung von MA oder MACD ausgehen und so die Kurve vorhersagen, und wenn man nicht faul ist, dann verschiedene empirische Zerlegungen, dann Mittelwertbildung und dann wieder Copponing.... Ich kann mir theoretisch vorstellen, wie man das macht, aber wenn ich anfange, es zu programmieren, schaffe ich es nicht in einem Jahr((((

Es wäre cool, wenn der Extrapolator die Wahrscheinlichkeitsverteilung für die nahe Zukunft festlegen würde, anstatt eine Linie zu zeichnen.

 
Alex_Bondar:


Es wäre cool, wenn der Extrapolator die Wahrscheinlichkeitsverteilung für die nahe Zukunft festlegen würde, anstatt eine Linie zu zeichnen.


Ich denke, es könnte so sein, wenn man in Photoshop übt)))))

 
Anfangs schien die Vorhersage gut zu sein, aber seit kurzem gibt sie nur noch eine gerade Linie an, obwohl sie auf alten Terminals, die ich schon lange nicht mehr benutze, sogar noch besser war - die rote Linie verläuft fast neben dem Preis. Warum passiert das? Wahrscheinlich wegen der Updates oder weil es so codiert ist, dass es mit der Zeit veraltet.
 

Interessanter Indikator! Vielen Dank an seinen Schöpfer.

Um die Qualität seiner Vorhersage zu sehen, habe ich dem Code einen weiteren Parameter Start hinzugefügt - von welchem Balken aus anstelle des Nullbalkens gestartet werden soll.

Ich habe auch einen Event-Handler für die Mausbewegung hinzugefügt.

Um ihn zu starten, brauchen Sie nur die Strg-Taste zu drücken und die Maus zu bewegen (ich empfehle Ihnen, das Fadenkreuz zu aktivieren) - seine Position auf dem Chart wird Start sein.

Es ist sehr lustig, dies in der Dynamik zu beobachten.

Um es auszuschalten, drücken Sie einfach eine beliebige Taste außer Strg.

//+--------------------------------------------------------------------------------------+
//| Fourier_Extrapolator_of_Price.mq5 |
//| Copyright 2010, gpwr |
//+--------------------------------------------------------------------------------------+
// Möglichkeit hinzugefügt, den Start zu verschieben (CTRL drücken)
#property copyright "gpwr"
#property version "1.00"
#property description "Extrapolation of open prices by trigonometric (multitone) model"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- zukünftige Modellausgaben
#property indicator_label1 "Modellierte Zukunft"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- vergangene Modellausgaben
#property indicator_label2 "Modellierte Vergangenheit"
#property indicator_type2 DRAW_LINE
#property indicator_color2 Blau
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- globale Konstanten
#define pi 3.141592653589793238462643383279502884197169399375105820974944592
//--- Indikatoreingaben
input int Npast =300; // Vergangene Balken, an die die trigonometrische Reihe angepasst wird
input int Nfut =50; // Vorausgesagte zukünftige Balken
input int Nharm =20; // Narmonische Werte im Modell
input double FreqTOL =0.00001; // Toleranz der Frequenzberechnungen
input int Start =0; // Von welchem Takt wir starten
//--- globale Variablen
int N;
int key=0;
int start=0;
//--- Indikatorpuffer
double ym[],xm[];
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikatorinitialisierungsfunktion |
//+------------------------------------------------------------------+
void OnInit()
{
//--- initialisiere globale Variablen
N=MathMax(Npast,Nfut+1);

//--- Zuordnung von Indikatorpuffern
ArraySetAsSeries(xm,true);
ArraySetAsSeries(ym,true);
SetIndexBuffer(0,ym,INDICATOR_DATA);
SetIndexBuffer(1,xm,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
IndicatorSetString(INDICATOR_SHORTNAME, "Fourier("+string(Npast)+")");
PlotIndexSetInteger(0,PLOT_SHIFT,Nfut);
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
start=Start;
}
//+------------------------------------------------------------------+
//| Eigene Indikator-Iterationsfunktion |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime& Time[],
const double& Open[],
const double& High[],
const double& Low[],
const double& Close[],
const long& tick_volume[],
const long& volume[],
const int& spread[])
{
{ // Auf unzureichende Daten prüfen

if(rates_total<Npast)
{
Print("Fehler: Nicht genügend Balken in der Vergangenheit!");
return(0);
}

//--- Indikatorpuffer auf EMPTY_VALUE initialisieren
ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);

//--- alle Kurse verfügbar machen
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return(0);

//--- Hauptzyklus
//--- Eingangsdaten vorbereiten
double x[];
ArrayResize(x,Npast);
double av=0;
for(int i=0;i<Npast;i++)
{
x[i]=rates[i].open;
av+=x[i];
}
av/=Npast;

//--- Initialisierung der Modellausgaben
for(int i=0;i<N<N;i++)
{
{ xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}

//--- trigonometrisches Modell anpassen und Vorhersagen berechnen
for(int harm=1;harm<=Nharm;harm++)
{
double w,m,a,b;
Freq(x,Npast,w,m,a,b);
for(int i=0;i<N;i++)
{
xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i);
if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i);
}
}

return(rates_total);
}
//--- event handler für Strg drücken und Mausbewegung
void OnChartEvent(const int id, // event identifier
const long& lparam, // event parameter of type long
const double& dparam, // event parameter of type double
const string& sparam // event parameter of type string
)

{
double y;
int window=0;
datetime ttt;
if(id==CHARTEVENT_KEYDOWN) key=(int)lparam;
if(id==CHARTEVENT_MOUSE_MOVE && key==17)
{
ChartXYToTimePrice(0,(int)lparam,(int)dparam,window,ttt,y);
if(ttt!=0) start=iBarShift(NULL,0,ttt,false);
Comment("x = ",lparam,", y = ",dparam,", Price = ",y,", start = ",start);


ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);

//--- alle Preise verfügbar machen
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return;

//--- Hauptzyklus
//--- Eingangsdaten vorbereiten
double x[];
ArrayResize(x,Npast);
double av=0;
for(int i=0;i<Npast;i++)
{
x[i]=rates[i].open;
av+=x[i];
}
av/=Npast;

//--- Initialisierung der Modellausgaben
for(int i=0;i<N;i++)
{
xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}

//--- trigonometrisches Modell anpassen und Vorhersagen berechnen
for(int harm=1;harm<=Nharm;harm++)
{
double w,m,a,b;
Freq(x,Npast,w,m,a,b);
for(int i=0;i<N;i++)
{
xm[i+start]+=m+a*MathCos(w*i)+b*MathSin(w*i);
if(i<=Nfut) ym[Nfut-i+start]+=m+a*MathCos(w*i)-b*MathSin(w*i);
}
}
}
}


//+------------------------------------------------------------------+
//| Algorithmus von Quinn und Fernandes zur Ermittlung der Frequenz |
//+------------------------------------------------------------------+
void Freq(double& x[],int n,double& w,double& m,double& a,double& b)
{
double z[];
ArrayResize(z,n);
double alpha=0.0;
double beta=2.0;
z[0]=x[0]-xm[0+start];
while(MathAbs(alpha-beta)>FreqTOL)
{
alpha=beta;
z[1]=x[1]-xm[1+start]+alpha*z[0];
double num=z[0]*z[1];
double den=z[0]*z[0];
for(int i=2;i<n;i++)
{
z[i]=x[i]-xm[i+start]+alpha*z[i-1]-z[i-2];
num+=z[i-1]*(z[i]+z[i-2]);
den+=z[i-1]*z[i-1];
}
beta=num/den;
}
w=MathArccos(beta/2.0);
TrigFit(x,n,w,m,a,b);
}
//+------------------------------------------------------------------+
//| Kleinste-Quadrate-Anpassung von trigonometrischen Reihen |
//+------------------------------------------------------------------+
void TrigFit(double& x[],int n,double w,double& m,double& a,double& b)
{
double Sc =0.0;
double Ss=0.0;
double Scc=0.0;
double Sss=0.0;
double Scs=0.0;
double Sx=0.0;
double Sxc=0.0;
double Sxs=0.0;
for(int i=0;i<n;i++)
{
double c=MathCos(w*i);
double s=MathSin(w*i);
double dx=x[i]-xm[i+start];
Sc +=c;
Ss +=s;
Scc+=c*c;
Sss+=s*s;
Scs+=c*s;
Sx +=dx;
Sxc+=dx*c;
Sxs+=dx*s;
}
Sc /=n;
Ss /=n;
Scc/=n;
Sss/=n;
Scs/=n;
Sx /=n;
Sxc/=n;
Sxs/=n;
if(w==0.0)
{
m=Sx;
a=0.0;
b=0.0;
}
else
{
// Berechnung von a, b, und m
double den=MathPow(Scs-Sc*Ss,2)-(Scc-Sc*Sc)*(Sss-Ss*Ss);
a=((Sxs-Sx*Ss)*(Scs-Sc*Ss)-(Sxc-Sx*Sc)*(Sss-Ss*Ss))/den;
b=((Sxc-Sx*Sc)*(Scs-Sc*Sc*Ss)-(Sxs-Sx*Ss)*(Scc-Sc*Sc*Sc))/den;
m=Sx-a*Sc-b*Ss;
}
}

int iBarShift(string symbol,int timeframe,datetime time,bool exact=false)
{
if(time<0) return(-1);
ENUM_TIMEFRAMES tf=TFMigrate(timeframe);
datetime Arr[],time1;
CopyTime(symbol,tf,0,1,Arr);
time1=Arr[0];
if(CopyTime(symbol,tf,time,time1,Arr)>0)
{
if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
if(time<time1) return(1);
else return(0);
}
else return(-1);
}
ENUM_TIMEFRAMES TFMigrate(int tf)
{
switch(tf)
{
case 0: return(PERIOD_CURRENT);
case 1: return(PERIOD_M1);
case 5: return(PERIOD_M5);
case 15: return(PERIOD_M15);
case 30: return(PERIOD_M30);
case 60: return(PERIOD_H1);
case 240: return(PERIOD_H4);
case 1440: return(PERIOD_D1);
case 10080: return(PERIOD_W1);
case 43200: return(PERIOD_MN1);

case 2: return(PERIOD_M2);
case 3: return(PERIOD_M3);
case 4: return(PERIOD_M4);
case 6: return(PERIOD_M6);
case 10: return(PERIOD_M10);
case 12: return(PERIOD_M12);
case 16385: return(PERIOD_H1);
case 16386: return(PERIOD_H2);
case 16387: return(PERIOD_H3);
case 16388: return(PERIOD_H4);
case 16390: return(PERIOD_H6);
case 16392: return(PERIOD_H8);
case 16396: return(PERIOD_H12);
case 16408: return(PERIOD_D1);
case 32769: return(PERIOD_W1);
case 49153: return(PERIOD_MN1);
default: return(PERIOD_CURRENT);
}
}

 
Nikolay7ko:

...

Bitte fügen Sie den Code richtig ein. Es ist viel angenehmer, korrekt eingefügten Code wahrzunehmen: Code korrekt im Forum einfügen