Normalmente a la gente nueva es a la que menos se ayuda, por desgracia. Te voy a echar un cable
En primer lugar, te recomiendo que en lugar "int init", uses int OnInit. Probablemente también usarás start. Mejor usa OnCalculate
int OnInit() { IndicatorBuffers(1); SetIndexBuffer(0, Buffer1); SetIndexEmptyValue(0, EMPTY_VALUE); SetIndexArrow(0, 241); return(INIT_SUCCEEDED); }
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[]) { //Aquí irá todo el código del cuerpo del indicador return(rates_total); }
Como no has adjuntado tu código es un poco difícil saber qué partes has incluido y cuáles no.
Vamos a considerar que hasta ahora todo está correcto en tu código y que llegamos a OnCalculate.
¿Cuál es la condición que usas para generar los Buffers?. Pongamos un ejemplo: (Un cruce de Medias Móviles)
//Indicator Buffer 1 if(iMA(NULL, PERIOD_CURRENT, 20, 0, MODE_SMA, PRICE_CLOSE, i) > iMA(NULL, PERIOD_CURRENT, 50, 0, MODE_SMA, PRICE_CLOSE, i) && iMA(NULL, PERIOD_CURRENT, 20, 0, MODE_SMA, PRICE_CLOSE, i+1) < iMA(NULL, PERIOD_CURRENT, 50, 0, MODE_SMA, PRICE_CLOSE, i+1) //Moving Average crosses above Moving Average ) { Buffer1[i] = Low[i]; //Poner la flecha del Buffer 1 en el Mínimo de la barra actual } else { Buffer1[i] = EMPTY_VALUE; }
Lo que nos interesa es lo que he marcado con fosforito. En este caso, la flecha estará en el mínimo (Low) de la barra actual.
Lo que quieres es separar la flecha más. Entonces hay que restar:
Buffer1[i] = Low[i]- DistanceArrows * Point; //
Distance Arrows depende del valor que le hayas dado. Pero quedará a esa DISTANCIA en todos los TimeFrames.
(De manera que lo que en M1 estará bien, probablemente en H4 sea demasiado cercano)
Para modificar este parámetro, añádelo como un input:
input int DistanceArrows = 10;
Es posible que quieras establecer una distancia diferente según el TimeFrame. Entonces puedes, por ejemplo, hacer lo siguiente:
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[]) { int DistanceArrows; if(Period()==1) { DistanceArrows=1; } if(Period()==5) { DistanceArrows=3; } if(Period()==15) { DistanceArrows=6; } if(Period()==30) { DistanceArrows=12; } if(Period()==60) { DistanceArrows=15; } if(Period()==240) { DistanceArrows=30; } if(Period()==1440) { DistanceArrows=50; } if(Period()==10080) { DistanceArrows=50; } if(Period()==43200) { DistanceArrows=50; } //...... }
Es bastante sencillo, pero por si acaso te adjunto un código de ejemplo
Normalmente a la gente nueva es a la que menos se ayuda, por desgracia. Te voy a echar un cable
En primer lugar, te recomiendo que en lugar "int init", uses int OnInit. Probablemente también usarás start. Mejor usa OnCalculate
Como no has adjuntado tu código es un poco difícil saber qué partes has incluido y cuáles no.
Vamos a considerar que hasta ahora todo está correcto en tu código y que llegamos a OnCalculate.
¿Cuál es la condición que usas para generar los Buffers?. Pongamos un ejemplo: (Un cruce de Medias Móviles)
Lo que no es interesa es lo que he marcado con fosforito. En este caso, la flecha estará en el mínimo (Low) de la barra actual.
Lo que quieres es separar la flecha más. Entonces hay que restar:
Distance Arrows depende del valor que le hayas dado. Pero quedará a esa DISTANCIA en todos los TimeFrames.
(De manera que lo que en M1 estará bien, probablemente en H4 sea demasiado cercano)
Para modificar este parámetro, añádelo como un input:
Es posible que quieras establecer una distancia diferente según el TimeFrame. Entonces puedes, por ejemplo, hacer lo siguiente:
Es bastante sencillo, pero por si acaso te adjunto un código de ejemplo
Es la forma facil de aplicar, y sin que sea para mi, agradezco a @Enrique Enguix Vino por poner esta respuesta.
Yo agregaria algo, mas, una segunda opcion:
por ejemplo, la distancia puede ser un porcentaje de un ATR, por lo que, se ajusta correctamente con el cambio de TF, porque el 50% de un ATR de 14 periodos en 1m puede ser 5 puntos,
Y ese mismo 50% de un ATR de 14 periodos en 1H puede ser 15 puntos y asi sucesivamente, por lo que los valores son casi que automaticos.
(Asi lo hago yo. Pero siempre he tenido a duda de como se hace en los indicadores originales de la MT, como por ejemplo el Fractals)
Es la forma facil de aplicar, y sin que sea para mi, agradezco a @Enrique Enguix Vino por poner esta respuesta.
Yo agregaria algo, mas, una segunda opcion:
por ejemplo, la distancia puede ser un porcentaje de un ATR, por lo que, se ajusta correctamente con el cambio de TF, porque el 50% de un ATR de 14 periodos en 1m puede ser 5 puntos,
Y ese mismo 50% de un ATR de 14 periodos en 1H puede ser 15 puntos y asi sucesivamente, por lo que los valores son casi que automaticos.
(Asi lo hago yo. Pero siempre he tenido a duda de como se hace en los indicadores originales de la MT, como por ejemplo el Fractals)
Tienes toda la razón. Lo podríamos dejar simplemente de esta forma:
double DistanceArrows = (iATR (_Symbol, _Period,14,0) * Porcentaje_ATR / 100) / Point;
Recuerda definir el parámetro Porcentaje_ATR en la sección del inicio (donde los inputs)
input int Porcentaje_ATR= 20;
Adjunto el ejemplo modificado. Muy buen aporte, como siempre, Miguel
Aquí tienes el código, de todas formas hay cosas que no están bien, por ejemplo, se queda fuera de rango.
Ayer usé algo de tiempo para darte una respuesta lo más explicativa posible, pero obviamente no dedicaste ni un solo segundo a intentarlo por ti mismo.

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Soy nuevo en programacion y estoy intentando separar las flechas de la barra, si bien las puedo poner las flechas arriba abajo, pero quedan pegadas a las barras
como las separo ?
Imagen adjunta
CODIGO
int init()
{
IndicatorBuffers(3);
SetIndexBuffer(0,LongBuffer);
SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID); SetIndexArrow(0,233);
SetIndexBuffer(1,ShortBuffer);
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID); SetIndexArrow(1,234);
SetIndexBuffer(2,trend);
indicatorFileName = WindowExpertName();
returnBars = TimeFrame == "returnBars"; if (returnBars) return(0);
timeFrame = stringToTimeFrame(TimeFrame);
return(0);
}