HELP - Ayuda sobre Flechas

 

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);

  }

Archivos adjuntos:
barras.png  16 kb
 

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

Archivos adjuntos:
 
Enrique Enguix Vino:

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)

 
Miguel Antonio Rojas Martinez:

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

Archivos adjuntos:
 
Gracias por la respuesta, les dejo adjunto el indicador, es un contador de velas, donde se puede especificar que marque ( La X vela alcista o bajista), donde solo queria agregar una distancia entre la vela y la flecha.
Archivos adjuntos:
Bars_Count.mq4  12 kb
 

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.

Archivos adjuntos:
Bars_Count2.mq4  16 kb
Razón de la queja: