Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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.
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
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.
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)))))
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);
}
}
...