Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Hola, interesante indicador. Me está gustando el aspecto matemático de utilizar realmente un modelo de proyección en los gráficos. Yo no soy demasiado experimentado con el código todavía, así que me pregunto cómo usted iría sobre el establecimiento del modelo de "volver atrás" y hacer la curva de predicción que -debería- han hecho un cierto número de garrapatas hace (digamos, 100). De esa manera se podría aplicar a varios gráficos y dar una idea de cuánto varía la realidad del modelo, tal vez usar eso para identificar algunas características de un mercado donde el modelo funciona bien, etc.
Sí, yo uso Windows 7, voy a echar un vistazo
es posible que desee ejecutar mt5 en modo portátil:
terminal.exe /portable
obtendrá indicador de trabajo en el directorio actual mt5 - útil para la instalación pendrive
modificación para hacerlo retroceder en el tiempo para probar su capacidad de predicción:
en la línea 32 insertar:
input int TimeShift = 10; // cuántas barras se desplazan hacia atrás, útil para evaluar la predictibilidad del indicador
en la línea 54 sustituir:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut);
por:
PlotIndexSetInteger(0, PLOT_SHIFT, Nfut - TimeShift);
en la línea 55 insertar:
PlotIndexSetInteger(1, PLOT_SHIFT, -TimeShift);
en la línea 87 replace:
if(CopyRates(NULL, 0, 0, Npast, rates) <= 0) return(0);
with:
if(CopyRates(NULL, 0, TimeShift, Npast, rates) <= 0) return(0);
Merece la pena echarle un vistazo.
¿Quién lo utiliza en el comercio?
Lo corrí a través de la historia - resultó que el indicador no tiene en cuenta la tendencia en absoluto, se predijo en contra de la tendencia de varios miles de puntos de cinco dígitos, en mi opinión, se debe utilizar con un indicador como MA / CCI / Bandas de Bollinger, donde el extrapolador confirmará la señal, de lo contrario puede llegar a ser un drenaje
Se supone que es mejor utilizarlo en plazos más altos, en D1 predijo con una precisión asombrosa durante un mes, pero cuando comenzó la tendencia, me decepcionó mucho (véase el último párrafo).
Gracias
Merece la pena echarle un vistazo.
¿Quién lo utiliza en el comercio?
También tengo mucha curiosidad, si alguien utiliza extrapoladores en su ST, ¿cómo exactamente? ¿Y cómo de prometedora es esta dirección de búsqueda del Grial?
Puramente intuitivamente parece que esto es lo que se necesita, pero de alguna manera en las pruebas y predicciones de este extrapolador se correlacionan muy mal con la realidad, al menos para mí resultó así ...
¿Podría decirme, por favor, ¿cuál es la elección de extrapoladores y cuál de ellos es el más preciso? Quiero decir que probablemente no sólo se pueden descomponer las series de Fourier, las formas son infinitas. Por ejemplo, se puede ir desde las formas más simples y empezar desde el cruce de MA o MACD y así predecir la curva, y si no eres perezoso, a continuación, diferentes descomposiciones empíricas, a continuación, promediando y luego otra vez copponing.... Teóricamente puedo imaginar como hacerlo, pero si me pongo a intentar codificarlo, no seré capaz de hacerlo en un año((((
Estaría bien que el extrapolador estableciera la distribución de probabilidad para el futuro próximo en lugar de trazar una línea.
Molaría que el extrapolador estableciera la distribución de probabilidad para el futuro próximo, en vez de trazar una línea.
Creo que podría ser así, si se practica en photoshop)))))
¡Interesante indicador! Gracias a su creador.
Con el fin de ver la calidad de su predicción, he añadido un parámetro más Inicio al código - a partir de qué barra para empezar en lugar de la barra cero.
También he añadido un controlador de eventos para el movimiento del ratón.
Para iniciarlo sólo tienes que pulsar Ctrl y mover el ratón (te aconsejo que actives la retícula) - su posición en el gráfico será Start.
Es muy divertido verlo en dinámica.
Para apagarlo - sólo tiene que pulsar cualquier tecla excepto Ctrl
//+--------------------------------------------------------------------------------------+
//| Fourier_Extrapolator_of_Price.mq5 |
//| Copyright 2010, gpwr |
//+--------------------------------------------------------------------------------------+
// posibilidad añadida de desplazar el Start ( pulsar CTRL)
#property copyright "gpwr"
#property version "1.00"
#property description "Extrapolación de precios de apertura mediante modelo trigonométrico (multitono)"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//--- resultados futuros del modelo
#property indicator_label1 "Modeled future"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- salidas del modelo pasado
#property indicator_label2 "Modeled past"
#property indicator_type2 DRAW_LINE
#property indicator_color2 Azul
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//- constantes globales
#define pi 3.141592653589793238462643383279502884197169399375105820974944592
//--- entradas del indicador
input int Npast =300; // Barras pasadas, a las que se ajusta la serie trigonométrica
input int Nfut =50; // Predicción de barras futuras
input int Nharm =20; // Narmónicos en el modelo
input double FreqTOL =0.00001; // Tolerancia de los cálculos de frecuencia
input int Start =0; // Desde qué barra empezamos
//--- variables globales
int N;
int key=0;
int start=0;
//--- buffers de indicadores
double ym[],xm[];
//+------------------------------------------------------------------+
//| Función personalizada de inicialización del indicador |
//+------------------------------------------------------------------+
void OnInit()
{
//--- inicializar variables globales
N=MathMax(Npast,Nfut+1);
//--- mapeo de buffers de indicadores
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=Inicio;
}
//+------------------------------------------------------------------+
//| Función personalizada de iteración del indicador |
//+------------------------------------------------------------------+
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[])
{
{ // Comprobación de datos insuficientes
if(rates_total<Npast)
{
Print("Error: ¡no hay suficientes barras en el histórico!");
return(0);
}
//--- inicializar los buffers del indicador a EMPTY_VALUE
ArrayInitialize(xm,EMPTY_VALUE);
ArrayInitialize(ym,EMPTY_VALUE);
//--- hacer que todos los precios estén disponibles
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return(0);
//--- ciclo principal
//--- preparar datos de entrada
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;
//--- inicializar las salidas del modelo
for(int i=0;i<N<N;i++)
{
{ xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}
//--- ajustar el modelo trigonométrico y calcular las predicciones
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 for Ctrl press and mouse movement
void OnChartEvent(const int id, // identificador del evento
const long& lparam, // parámetro del evento de tipo long
const double& dparam, // parámetro del evento de tipo double
const string& sparam // parámetro del evento de tipo 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);
//--- make all prices available
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(NULL,0,start,Npast,rates)<=0) return;
//--- main cycle
//--- prepare input data
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;
//--- inicializar las salidas del modelo
for(int i=0;i<N;i++)
{
xm[i+start]=av;
if(i<=Nfut) ym[i+start]=av;
}
//--- ajustar el modelo trigonométrico y calcular las predicciones
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);
}
}
}
}
//+------------------------------------------------------------------+
//| Algoritmo de Quinn y Fernandes para encontrar la frecuencia |
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
//| Ajuste por mínimos cuadrados de series trigonométricas |
//+------------------------------------------------------------------+
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
{
// calculando a, b, y 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);
}
}
...