Discusión sobre el artículo "Ejemplo del indicador que construye las líneas de soporte y resistencia"
¿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?
¿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?
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.
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
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.
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.
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?
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); }
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 ?
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.
- 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
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