Discusión sobre el artículo "Ejemplo del indicador que construye las líneas de soporte y resistencia"

 

Artículo publicado Ejemplo del indicador que construye las líneas de soporte y resistencia:

En este artículo se muestra el ejemplo de la implementación del indicador para construir las líneas de soporte y resistencia a base las condiciones formalizadas. Usted podrá no sólo aplicar el indicador, sino también comprenderá qué fácil implementar eso. Ahora Usted podrá formular personalmente las condiciones para construir las líneas que considere necesarias, haciendo pequeñas modificaciones en el código del indicador a su medida.

Pues así, sin complicaciones, hemos obtenido el indicador de los niveles horizontales de soporte y resistencia. En el gráfico, tendrá el siguiente aspecto.

Autor: Andrey Kisselyov

 

¿Puede trazar niveles inclinados desde el otro lado?

es decir, ¿trazar líneas de soporte y resistencia no desde abajo cuando se asciende, sino al contrario, desde arriba?

 
Alexandr Gavrilin:

¿Se pueden trazar niveles inclinados desde el otro lado?

es decir, ¿dibujar líneas de soporte y resistencia no desde abajo cuando se asciende, sino al contrario desde arriba?

Buenas tardes.
sí claro, no es tan difícil como parece.
 

Chicos literatos, por favor díganme cómo encontrar el máximo alto y bajo para el número establecido de barras en MQL5.

Por ejemplo, en mql4 es fácil hacerlo allí.

_High   = NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar,0)), Digits); // calcula el precio máximo de la última CanalBar 
_Low    = NormalizeDouble(iLow (Symb,PERIOD_CURRENT,iLowest (Symb,PERIOD_CURRENT,MODE_LOW, CanalBar,0)), Digits); // calcula el precio mínimo de la última CanalBar
   

Aquí solo tomamos lo que hemos encontrado y dibujamos una línea en el gráfico.

Pero cómo encontrar el máximo y mínimo para el número de barras en mql5 es un rompecabezas. iHighest y iLowest

como yo lo entiendo, no hay una comprensión simple aquí.

Estaré agradecido si me pueden ayudar, y si hay un código de ejemplo sería genial en general.

Gracias.

 
Konstantin Seredkin:

Chicos literatos, por favor díganme cómo encontrar el máximo alto y bajo para el número establecido de barras en MQL5.

Por ejemplo, en mql4 es fácil hacerlo allí.

Aquí solo tomamos lo que hemos encontrado y dibujamos una línea en el gráfico.

Pero cómo encontrar el máximo y mínimo para el número de barras en mql5 es un rompecabezas. iHighest y iLowest

como yo lo entiendo, no hay una comprensión simple aquí.

Estaré agradecido si me pueden ayudar, y si hay un ejemplo de código, sería genial en general.


_High   = NormalizeDouble(high[ArrayMaximum(high, 0, CanalBar)], Digits); // calcula el precio máximo de la última CanalBar 

donde high es un array de precios de barras altas

si es un indicador, te llega en OnCalculation,
si es en el Expert Advisor, lo solicitas vía CopyHigh.

no olvides ArraySetAsSeries true


gracias.

 

SPS

 
Konstantin Seredkin:

Chicos literatos, por favor díganme cómo encontrar el máximo alto y bajo para el número establecido de barras en MQL5.

Por ejemplo, en mql4 es fácil hacerlo allí.

Aquí solo tomamos lo que hemos encontrado y dibujamos una línea en el gráfico.

Pero cómo encontrar el máximo y mínimo para el número de barras en mql5 es un rompecabezas. iHighest y iLowest

como yo lo entiendo, no hay una comprensión simple aquí.

Estaré agradecido si me pueden ayudar, y si hay un ejemplo de código, sería genial en general.

Gracias.

En primer lugar, sobre tu código. yo lo simplificaría, partiendo de que solicitas el máximo en el gráfico actual, te pongo un ejemplo para vértices, para mínimos todo es casi igual.
confundes los comandos de la petición general a todos los datos con los comandos de la petición a los datos actuales, que en este caso es innecesario.
//para los datos actuales (el acceso a los datos actuales desde cualquier EA o indicador) será
   _High=NormalizeDouble(High[iHighest(Symb,_Period,MODE_HIGH,CanalBar)],_Digits);

//para datos generales (acceso desde cualquier EA o indicador a cualquier dato de la base de datos) será 
   _High=NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar)),MarketInfo(Symb,MODE_DIGITS));

y ahora sobre el código en mt5.

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(Symb,PERIOD_CURRENT,0,CanalBar,high);
   _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(Symb,SYMBOL_DIGITS));
   ArrayFree(high);

en este caso, se da el acceso a cualquier dato de la base de datos para cualquier símbolo de cualquier indicador o EA.
no hay que ser prudente con la dirección de indexación, ya que sólo necesitamos el máximo, no importa donde se encuentre.
comando ArrayMaximum() (según la ayuda) devuelve el valor requerido teniendo en cuenta la dirección de indexación del array.

c/u.

P.D. Yo no normalizaría el precio, es innecesario, a menos claro que estés construyendo un pipsmith que capte 1 Punto de una operación.

 
Andrey Kisselyov:
en primer lugar, sobre tu código. yo lo simplificaría, partiendo de que solicitas el máximo en el gráfico actual, te pongo un ejemplo para máximos, para mínimos todo es casi igual.
confundes comandos de petición general a todos los datos con comandos de petición a los datos actuales, que en este caso es innecesario.

y ahora sobre el código en mt5.

en este caso, se da el acceso a cualquier dato de la base de datos para cualquier símbolo de cualquier indicador o EA.
no hay necesidad de ser sabio acerca de la dirección de indexación, ya que sólo necesitamos el máximo, no importa donde se encuentra.
ArrayMaximum() comando (de acuerdo con la ayuda) devuelve el valor necesario teniendo en cuenta la dirección de indexación de la matriz.

c/u.

P.D. Yo no normalizaría el precio, es innecesario, a menos claro que estés construyendo un pipsmith que capte 1 Punto de una operación.


Genial, ya está todo solucionado

Ahora otra pregunta

La implementación es la siguiente

input int CanalBar  = 200; // Número de barras a calcular

//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(_Symbol,PERIOD_CURRENT,0,CanalBar,high);
   double _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
   ArrayFree(high);
   
   
   HLineCreate(0,"HIGH",0,_High,"",clrBlue,1,1); // Dibuja una línea en el gráfico.

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Crea una línea horizontal|
//+------------------------------------------------------------------+
//| Basado en:|
//| Guía de Referencia MQL5 / Constantes estándar, enums y estructuras|
//| / Constantes de objeto / Tipos de objeto / OBJ_HLINE |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // ID del gráfico
                 const string          name="HLine",      // nombre de la línea
                 const int             sub_window=0,      // número de subventana
                 double                price=0,           // precio de línea
                 const string          toolTip="\n",      // texto de ayuda
                 const color           clr=clrRed,        // color de la línea
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de línea
                 const int             line_width=1,      // grosor de la línea
                 const bool            back=false,        // en segundo plano
                 const bool            selection=true,    // seleccionar para mover
                 const bool            hidden=true,       // oculto en la lista de objetos
                 const long            z_order=0,         // prioridad del clic del ratón
                 const int             timeFrames=OBJ_ALL_PERIODS)//visualizar el objeto en diferentes periodos
  {
//--- restablecer el valor de error
   ResetLastError();
//--- crear una línea horizontal
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(LINE_NUMBER,__FUNCTION__,
            ": failed to create a horizontal line! Error code = ",GetLastError());
      return(false);
     }
//--- establecer el texto de la información sobre herramientas
   ObSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- establecer el color de la línea 
   ObSetIntegerColor(chart_ID,name,OBJPROP_COLOR,clr);
//--- establecer el estilo de visualización de líneas
   ObSetIntegerLineStyle(chart_ID,name,style);
//--- establecer el grosor de la línea
   ObSetIntegerInt(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- mostrar en primer plano (false) o en segundo plano (true)
   ObSetIntegerBool(chart_ID,name,OBJPROP_BACK,back);
//--- activar (true) o desactivar (false) el modo de movimiento de la línea del ratón
//--- cuando se crea un objeto gráfico con la función ObjectCreate, por defecto el objeto
//--- no se puede seleccionar y mover. Dentro de este método, el parámetro de selección
//--- por defecto a true, lo que le permite seleccionar y mover este objeto
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) o mostrar (false) el nombre del objeto gráfico en la lista de objetos
   ObSetIntegerBool(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- establecer la prioridad para recibir el evento de clic del ratón en el gráfico
   ObSetIntegerLong(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- establecer la visibilidad del objeto en diferentes marcos temporales 
   ObSetIntegerInt(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
//--- ejecución con éxito
   return(true);
  }


Al iniciar la prueba visual, la línea en el gráfico se dibuja, pero se queda quieta, la línea no cambia sus valores en el curso de la prueba, en mql5 es necesario dar a los cálculos una patada adicional en el culo de alguna manera?

 
Konstantin Seredkin:

Muy bien, ya está solucionado.

Ahora aquí hay otra pregunta

La implementación es la siguiente


Cuando se inicia la prueba visual, la línea en el gráfico se dibuja, pero se queda quieto, su línea de valores no cambia durante la prueba, en mql5 que necesita adicionalmente de alguna manera dar a los cálculos una patada en el culo ?

Pruebe esto:

void HLineCreate(const long            chart_ID=0,        // ID del gráfico
                 const string          name="HLine",      // nombre de la línea
                 const int             sub_window=0,      // número de subventana
                 double                price=0,           // precio de línea
                 const string          toolTip="\n",      // texto de ayuda
                 const color           clr=clrRed,        // color de la línea
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // estilo de línea
                 const int             line_width=1,      // grosor de la línea
                 const bool            back=false,        // en segundo plano
                 const bool            selection=true,    // seleccionar para mover
                 const bool            hidden=true,       // oculto en la lista de objetos
                 const long            z_order=0,         // prioridad del clic del ratón
                 const int             timeFrames=OBJ_ALL_PERIODS)//visualizar el objeto en diferentes periodos
  {
  if(ObjectFind(chart_ID, name)<0) {
//--- crear una línea horizontal
   ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price);
//--- establecer el texto de la información sobre herramientas
   ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- establecer el color de la línea 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- establecer el estilo de visualización de líneas
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- establecer el grosor de la línea
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- mostrar en primer plano (false) o en segundo plano (true)
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- activar (true) o desactivar (false) el modo de movimiento de la línea del ratón
//--- cuando se crea un objeto gráfico con la función ObjectCreate, por defecto el objeto
//--- no se puede seleccionar y mover. Dentro de este método, el parámetro de selección
//--- por defecto a true, lo que le permite seleccionar y mover este objeto
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- ocultar (true) o mostrar (false) el nombre del objeto gráfico en la lista de objetos
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- establecer la prioridad para recibir el evento de clic del ratón en el gráfico
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- establecer la visibilidad del objeto en diferentes marcos temporales 
   ObjectSetInteger(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
     }
//--- establecer el método de vinculación
   ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
  }
 
Konstantin Seredkin:

Muy bien, ya está solucionado.

Ahora aquí hay otra pregunta

La implementación es la siguiente


Cuando se inicia la prueba visual, la línea en el gráfico se dibuja, pero se queda quieto, su línea de valores no cambia durante la prueba, en mql5 que necesita adicionalmente de alguna manera dar a los cálculos una patada en el culo ?

comando
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
si ya existe un objeto con este nombre no se implementa, como consecuencia, su precio en la línea existente no va a cambiar.
como se le dijo con razón, se debe hacer por el comando.

ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
y una observación más, trate de no involucrarse en las clases y otra sabiduría, si hay una posibilidad de escribir más simple, utilizando comandos de acceso directo.
aplicar sólo los comandos que son necesarios, no es necesario pasar por todos los parámetros de la línea en cada acceso, porque usted necesita para cambiar sólo el precio de la línea.

con respeto.
 

Gracias chicos, ya está todo solucionado.