Curso Gratuito - Trading IA
Indicador PearsonsR para Metatrader 4

joseangelar
4 puntos
Buenos días compañeros,
He creado el indicador PearsonsR para Metatrader 4 y lo he compilado sin problema, pero al cargarlo en el gráfico no dibuja nada, no sé si alguien me puede ayudar. Adjunto el código:
He creado el indicador PearsonsR para Metatrader 4 y lo he compilado sin problema, pero al cargarlo en el gráfico no dibuja nada, no sé si alguien me puede ayudar. Adjunto el código:
//+------------------------------------------------------------------+
//| PearsonsR.mq4 |
//| Copyright 2023, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexStyle(0, DRAW_LINE);
SetIndexBuffer(0, upperChannelLine);
SetIndexLabel(0, "Upper Channel Line");
SetIndexStyle(1, DRAW_LINE);
SetIndexBuffer(1, medianChannelLine);
SetIndexLabel(1, "Median Channel Line");
SetIndexStyle(2, DRAW_LINE);
SetIndexBuffer(2, lowerChannelLine);
SetIndexLabel(2, "Lower Channel Line");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Yellow
#property indicator_color3 Red
extern int periodo_r = 100;
extern int desviaciones = 2;
double upperChannelLine[];
double medianChannelLine[];
double lowerChannelLine[];
void calculateChannels(int start, int end) {
double Ex = 0.0;
double Ey = 0.0;
double Ex2 = 0.0;
double Ey2 = 0.0;
double Exy = 0.0;
double slope = 0.0;
double deviation = 0.0;
double linearRegression = 0.0;
double startingPointY = 0.0;
for(int i = start; i < end; i++) {
double closeI = Close[i];
Ex += i;
Ey += closeI;
Ex2 += i * i;
Ey2 += closeI * closeI;
Exy += closeI * i;
}
double ExT2 = MathPow(Ex, 2.0);
double EyT2 = MathPow(Ey, 2.0);
double periodo_r_d = (double)periodo_r;
double PearsonsR = (Exy - ((Ex * Ey) / periodo_r_d)) / (MathSqrt(Ex2 - (ExT2 / periodo_r_d)) * MathSqrt(Ey2 - (EyT2 / periodo_r_d)));
double ExEx = Ex * Ex;
if(Ex2 == ExEx) {
slope = 0.0;
} else {
slope = (periodo_r_d * Exy - Ex * Ey) / (periodo_r_d * Ex2 - ExEx);
}
linearRegression = (Ey - slope * Ex) / periodo_r_d;
double intercept = linearRegression + (double)end * slope;
for(int i = start; i < end; i++) {
deviation += MathPow(Close[i] - (intercept - slope * i), 2.0);
}
deviation = desviaciones * MathSqrt(deviation / periodo_r_d);
startingPointY = linearRegression + slope * (periodo_r_d - 1);
upperChannelLine[end] = startingPointY + deviation;
medianChannelLine[end] = startingPointY;
lowerChannelLine[end] = startingPointY - deviation;
}
Gracias de antemano, por vuestra ayuda.
Etiquetado:
0
Comentarios
-
Hola, perdona que aproveche la oportunidad pero me estoy planteando si sería bueno comenzar con la plataforma Metatrader.
Llevo algunos meses programando para Tradestation y me gusta bastante.
¿puedes decirme cuál es tu impresión? ¿por qué usas metatrader?
¿le ves ventajas?
Gracias.0 -
Hola Manuel
En mi opinión la principal ventaja de metatrader 4 es el algorítmo genético que tiene que es capaz en poquísimos segundos de hacerte un backtest e indicarte como varían los resultados de la estrategia haciendo variaciones parametro a parametro manteniendo por ejemplo un sl y tp fijos (lo que se llama sistema tenedor). Mi email es info@jxr.es si me mandas tu teléfono de contacto te respondo con el mío y vamos hablando. Un saludo.0 -
Ok, gracias pues si que me interesa, voy a comenzar con metatrader.
0 -
Hay mucha diferencia entre programar en Pinescript y MQL5?
o más o menos siguen las mismas lógicas pero cambiando alguna forma de expresar las condiciones?0 -
Hola, normalmente saltas de plataforma o lenguaje cuando notas que el que usas te limita a la hora de resolver un problema.
Por ejemplo, en pinescript podía crear estructuras de datos, me vino muy bien para guardar todos lo parámetros de un Setup Estructura e ir apilándolos. Esto mismo en Easylanguage de tradestation no lo puedes hacer, esto me hizo tener que buscar alternativas (menos elegantes) a mi idea inical.
La limitación que estoy notando en easylanguage es que no me deja crear objetos/estructuras, cabeceras comunes para la funciones y la orientación a objetos está un poco capada.
Me he adaptado, pero creo que esto con metatrader se puede solucionar, pero a costa de complicar cada vez un poco más.
Mientras no veas que una plataforma te limita, seguramente sea porque no necesitas cambiar, esto no quita que pruebes por ti mismo otros lenguajes y plataformas. Pero te recomiendo que estudies un poco de fundamentos de programación para entender las diferencias.
Saludos.0 -
joseangelar dijo:Buenos días compañeros,
He creado el indicador PearsonsR para Metatrader 4 y lo he compilado sin problema, pero al cargarlo en el gráfico no dibuja nada, no sé si alguien me puede ayudar. Adjunto el código://+------------------------------------------------------------------+//| PearsonsR.mq4 |//| Copyright 2023, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright "Copyright 2023, MetaQuotes Software Corp."#property link "https://www.mql5.com"#property version "1.00"#property strict#property indicator_chart_window//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int OnInit(){//--- indicator buffers mappingSetIndexStyle(0, DRAW_LINE);SetIndexBuffer(0, upperChannelLine);SetIndexLabel(0, "Upper Channel Line");SetIndexStyle(1, DRAW_LINE);SetIndexBuffer(1, medianChannelLine);SetIndexLabel(1, "Median Channel Line");SetIndexStyle(2, DRAW_LINE);SetIndexBuffer(2, lowerChannelLine);SetIndexLabel(2, "Lower Channel Line");//---return(INIT_SUCCEEDED);}//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+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[]){//---//--- return value of prev_calculated for next callreturn(rates_total);}//+------------------------------------------------------------------+#property indicator_chart_window#property indicator_buffers 3#property indicator_color1 Green#property indicator_color2 Yellow#property indicator_color3 Redextern int periodo_r = 100;extern int desviaciones = 2;double upperChannelLine[];double medianChannelLine[];double lowerChannelLine[];void calculateChannels(int start, int end) {double Ex = 0.0;double Ey = 0.0;double Ex2 = 0.0;double Ey2 = 0.0;double Exy = 0.0;double slope = 0.0;double deviation = 0.0;double linearRegression = 0.0;double startingPointY = 0.0;for(int i = start; i < end; i++) {double closeI = Close[i];Ex += i;Ey += closeI;Ex2 += i * i;Ey2 += closeI * closeI;Exy += closeI * i;}double ExT2 = MathPow(Ex, 2.0);double EyT2 = MathPow(Ey, 2.0);double periodo_r_d = (double)periodo_r;double PearsonsR = (Exy - ((Ex * Ey) / periodo_r_d)) / (MathSqrt(Ex2 - (ExT2 / periodo_r_d)) * MathSqrt(Ey2 - (EyT2 / periodo_r_d)));double ExEx = Ex * Ex;if(Ex2 == ExEx) {slope = 0.0;} else {slope = (periodo_r_d * Exy - Ex * Ey) / (periodo_r_d * Ex2 - ExEx);}linearRegression = (Ey - slope * Ex) / periodo_r_d;double intercept = linearRegression + (double)end * slope;for(int i = start; i < end; i++) {deviation += MathPow(Close[i] - (intercept - slope * i), 2.0);}deviation = desviaciones * MathSqrt(deviation / periodo_r_d);startingPointY = linearRegression + slope * (periodo_r_d - 1);upperChannelLine[end] = startingPointY + deviation;medianChannelLine[end] = startingPointY;lowerChannelLine[end] = startingPointY - deviation;}
Gracias de antemano, por vuestra ayuda.
A base de estudiar ejemplos cada vez los modificaremos más fácil hasta que nos sea fácil y cómodo escribirlos desde cero.
Por otro lado, por favor, echa un ojo a este post: https://tradingia.es/discussion/125/asi-publicamos-codigos-e-imagenes-en-el-foro0 -
Manuel dijo:Hola, normalmente saltas de plataforma o lenguaje cuando notas que el que usas te limita a la hora de resolver un problema.
Por ejemplo, en pinescript podía crear estructuras de datos, me vino muy bien para guardar todos lo parámetros de un Setup Estructura e ir apilándolos. Esto mismo en Easylanguage de tradestation no lo puedes hacer, esto me hizo tener que buscar alternativas (menos elegantes) a mi idea inical.
La limitación que estoy notando en easylanguage es que no me deja crear objetos/estructuras, cabeceras comunes para la funciones y la orientación a objetos está un poco capada.
Me he adaptado, pero creo que esto con metatrader se puede solucionar, pero a costa de complicar cada vez un poco más.
Mientras no veas que una plataforma te limita, seguramente sea porque no necesitas cambiar, esto no quita que pruebes por ti mismo otros lenguajes y plataformas. Pero te recomiendo que estudies un poco de fundamentos de programación para entender las diferencias.
Saludos.
0 -
joseangelar dijo:Hola Manuel
En mi opinión la principal ventaja de metatrader 4 es el algorítmo genético que tiene que es capaz en poquísimos segundos de hacerte un backtest e indicarte como varían los resultados de la estrategia haciendo variaciones parametro a parametro manteniendo por ejemplo un sl y tp fijos (lo que se llama sistema tenedor). Mi email es info@jxr.es si me mandas tu teléfono de contacto te respondo con el mío y vamos hablando. Un saludo.joseangelar dijo:Hola Manuel
En mi opinión la principal ventaja de metatrader 4 es el algorítmo genético que tiene que es capaz en poquísimos segundos de hacerte un backtest e indicarte como varían los resultados de la estrategia haciendo variaciones parametro a parametro manteniendo por ejemplo un sl y tp fijos (lo que se llama sistema tenedor). Mi email es info@jxr.es si me mandas tu teléfono de contacto te respondo con el mío y vamos hablando. Un saludo.
0 -
Buenos días,
He conseguido que dibuje en el gráfico 3 líneas, con el siguiente código://+------------------------------------------------------------------+ //| PearsonsR.mq4 | //| Copyright 2023, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_chart_window //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexStyle(0, DRAW_LINE); SetIndexBuffer(0, upperChannelLine); SetIndexLabel(0, "Upper Channel Line"); SetIndexStyle(1, DRAW_LINE); SetIndexBuffer(1, medianChannelLine); SetIndexLabel(1, "Median Channel Line"); SetIndexStyle(2, DRAW_LINE); SetIndexBuffer(2, lowerChannelLine); SetIndexLabel(2, "Lower Channel Line"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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[]) { if(prev_calculated == 0) { int start = 0; int end = periodo_r - 1; for(int i = end; i < rates_total; i++) { calculateChannels(start, end); start++; end++; } } else { int start = rates_total - prev_calculated; int end = rates_total - 1; calculateChannels(start, end); } return(rates_total); } //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 Green #property indicator_color2 Yellow #property indicator_color3 Red extern int periodo_r = 100; extern int desviaciones = 2; double upperChannelLine[]; double medianChannelLine[]; double lowerChannelLine[]; void calculateChannels(int start, int end) { double Ex = 0.0; double Ey = 0.0; double Ex2 = 0.0; double Ey2 = 0.0; double Exy = 0.0; double slope = 0.0; double deviation = 0.0; double linearRegression = 0.0; double startingPointY = 0.0; for(int i = start; i < end; i++) { double closeI = Close[i]; Ex += i; Ey += closeI; Ex2 += i * i; Ey2 += closeI * closeI; Exy += closeI * i; } double ExT2 = MathPow(Ex, 2.0); double EyT2 = MathPow(Ey, 2.0); double periodo_r_d = (double)periodo_r; double PearsonsR = (Exy - ((Ex * Ey) / periodo_r_d)) / (MathSqrt(Ex2 - (ExT2 / periodo_r_d)) * MathSqrt(Ey2 - (EyT2 / periodo_r_d))); double ExEx = Ex * Ex; if(Ex2 == ExEx) { slope = 0.0; } else { slope = (periodo_r_d * Exy - Ex * Ey) / (periodo_r_d * Ex2 - ExEx); } linearRegression = (Ey - slope * Ex) / periodo_r_d; double intercept = linearRegression + (double)end * slope; for(int i = start; i < end; i++) { deviation += MathPow(Close[i] - (intercept - slope * i), 2.0); } deviation = desviaciones * MathSqrt(deviation / periodo_r_d); startingPointY = linearRegression + slope * (periodo_r_d - 1); upperChannelLine[end] = startingPointY + deviation; medianChannelLine[end] = startingPointY; lowerChannelLine[end] = startingPointY - deviation; }
Pero las líneas empieza a dibujarlas a 100 velas de distancia de la actual y de líneas rectas tienen poco, adjunto pantallazo de cómo se ve el indicador
:
https://drive.google.com/file/d/1P8EO_-bcuChWOBNxN5GxmwMZmQEgZsFR/view?usp=share_link
Si alguien puede echar una mano con el indicador para MT4, le doy las gracias de antemano.
Un saludo para todos.
0 -
Manuel dijo:Hola, normalmente saltas de plataforma o lenguaje cuando notas que el que usas te limita a la hora de resolver un problema.
Por ejemplo, en pinescript podía crear estructuras de datos, me vino muy bien para guardar todos lo parámetros de un Setup Estructura e ir apilándolos. Esto mismo en Easylanguage de tradestation no lo puedes hacer, esto me hizo tener que buscar alternativas (menos elegantes) a mi idea inical.
La limitación que estoy notando en easylanguage es que no me deja crear objetos/estructuras, cabeceras comunes para la funciones y la orientación a objetos está un poco capada.
Me he adaptado, pero creo que esto con metatrader se puede solucionar, pero a costa de complicar cada vez un poco más.
Mientras no veas que una plataforma te limita, seguramente sea porque no necesitas cambiar, esto no quita que pruebes por ti mismo otros lenguajes y plataformas. Pero te recomiendo que estudies un poco de fundamentos de programación para entender las diferencias.
Saludos.
https://help.tradestation.com/10_00/eng/tsdevhelp/elword/el_definitions/multi_dimensional_arrays.htm
Sí, en ese sentido metatrader ofrece más, pero tan solo veo complicar la cosa cuando hablamos de sistemas de trading, que no tienen tanta complejidad como otras aplicaciones que pueden desarrollar con c++ (el lenguaje de metatrader).
En easylanguage tenemos por ejemplo las funciones definidas fuera de nuestro indicado a reutilizar por cualquier script alojado en nuestra plataforma.0 -
Hola Luis, sé que estás de vacaciones y aún así trabajando.
No me gusta usar lenguaje demasiado técnico en el foro, en cuanto a programación se refiere, para que el resto de alumnos no se pierdan. Las estructuras a las que me refiero son para poder definir clases que representen estructuras complejas como un setup completo, pero esto ya lo solucione en easylanguage y se ha quedado bien.
Quiero publicar algún hilo en el que comente cómo he estructurado yo la estrategia y creo que ahí podré explicarme mejor.
Definitivamente he dejado de lado la idea de pasarme a Metatrader por lo que dices, demasiado complejo para mis necesidades.Saludos.0 -
Manuel dijo:Hola Luis, sé que estás de vacaciones y aún así trabajando.
No me gusta usar lenguaje demasiado técnico en el foro, en cuanto a programación se refiere, para que el resto de alumnos no se pierdan. Las estructuras a las que me refiero son para poder definir clases que representen estructuras complejas como un setup completo, pero esto ya lo solucione en easylanguage y se ha quedado bien.
Quiero publicar algún hilo en el que comente cómo he estructurado yo la estrategia y creo que ahí podré explicarme mejor.
Definitivamente he dejado de lado la idea de pasarme a Metatrader por lo que dices, demasiado complejo para mis necesidades.Saludos.
Te agradecemos mucho todo lo que estás colaborando en el foro. Necesitamos más personas como tú.0 -
luis dijo:Manuel dijo:Hola Luis, sé que estás de vacaciones y aún así trabajando.
No me gusta usar lenguaje demasiado técnico en el foro, en cuanto a programación se refiere, para que el resto de alumnos no se pierdan. Las estructuras a las que me refiero son para poder definir clases que representen estructuras complejas como un setup completo, pero esto ya lo solucione en easylanguage y se ha quedado bien.
Quiero publicar algún hilo en el que comente cómo he estructurado yo la estrategia y creo que ahí podré explicarme mejor.
Definitivamente he dejado de lado la idea de pasarme a Metatrader por lo que dices, demasiado complejo para mis necesidades.Saludos.
Te agradecemos mucho todo lo que estás colaborando en el foro. Necesitamos más personas como tú.
Llevaré más cuidado,
gracias.1
Categorías
- Todas las Categorías
- 19 Presentaciones
- 46 Nuestros sistemas (Curso gratuito)
- 70 Operativa y Sistemas de trading
- 44 Inversiones
- 12 Inteligencia Artificial y Optimización de Algoritmos
- 63 Plataformas
- 27 Programación e Inteligencia Artificial
- 21 Brokers
- 11 Bancos
- 31 Pruebas de fondeo
- 8 Psicología y Trading
- 6 Fiscalidad
- Emails
- 88 Otros temas