[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 131
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
¿Win_idx lo hace bien?
win_ind resulta ser correcto.
ObjectCreate("max",OBJ_HLINE,win_idx,0,top); dibuja en la ventana correcta,
ObjectSet("max",OBJPROP_COLOR,Yellow); dibuja en el color correcto,
ObjectSet("max",OBJPROP_WIDTH,0); dibuja la línea correcta,
pero no define el parámetro superior en
double top=VentanaPrecioMax(win_idx);
y topBuffer[] está vacío.
El código
#property indicador_separar_ventana
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Rojo
//--- buffers
doble ExtMapBuffer1[];
doble ExtMapBuffer2[];
double topBuffer[];
bool initFinished=false; // añadir una variable que recuerde el estado de la inicialización.
// false - la inicialización aún no se ha producido.
// true - fue inicializado
//+------------------------------------------------------------------+
//| Función de inicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int init()
{
//---- indicadores
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(2,DRAW_NONE);
SetIndexBuffer(2,topBuffer);
IndicadorDígitos(5);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Función de desinicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Función de iteración de indicadores personalizada |
//+------------------------------------------------------------------+
int inicio()
{
int barras_contadas=IndicadorContado(),
límite;
if(barras_contadas>0)
counted_bars--;
limit=Barras_contabilizadas;
//----
for(int i=0;i<limit;i++)
{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRECIO_CERRADO,SEÑAL_MODO,i);
if(initFinished==false)
{
IndicatorShortName("MACD_max-min");
int win_idx=WindowFind("MACD_max-min");
// encontrar el número de la subventana de nuestro indicador
if(win_idx<0)
{
// si el número de subventana es -1, hay un error
Print("Ventana no encontrada");
return(0);
}
double top=VentanaPrecioMax(win_idx);
//buscar el valor máximo de la escala vertical de la subventana especificada del gráfico actual
ObjectCreate("max",OBJ_HLINE,win_idx,0,top);
// dibujar una línea horizontal en una subventana de nuestro indicador
ObjectSet("max",OBJPROP_COLOR,Yellow);
ObjectSet("max",OBJPROP_WIDTH,0);
WindowRedraw();
// redibujar la ventana para ver la línea
initFinished=true;
// el dibujo está terminado
}
topBuffer[i]=top;
}
//----
return(0);
}
//+------------------------------------------------------------------+
win_ind resulta ser correcto.
ObjectCreate("max",OBJ_HLINE,win_idx,0,top); dibuja en la ventana correcta,
ObjectSet("max",OBJPROP_COLOR,Yellow); dibuja en el color correcto,
ObjectSet("max",OBJPROP_WIDTH,0); dibuja la línea correcta,
pero no define el parámetro superior en
double top=VentanaPrecioMax(win_idx);
y topBuffer[] está vacío.
Código
#property indicador_separar_ventana
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Rojo
//--- buffers
doble ExtMapBuffer1[];
doble ExtMapBuffer2[];
double topBuffer[];
bool initFinished=false; // añadir una variable que recuerde el estado de la inicialización.
// false - la inicialización aún no se ha producido.
// true - fue inicializado
//+------------------------------------------------------------------+
//| Función de inicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int init()
{
//---- indicadores
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(2,DRAW_NONE);
SetIndexBuffer(2,topBuffer);
IndicadorDígitos(5);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Función de desinicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Función de iteración de indicadores personalizada |
//+------------------------------------------------------------------+
int inicio()
{
int barras_contadas=IndicadorContado(),
límite;
if(barras_contadas>0)
counted_bars--;
limit=Barras_contabilizadas;
//----
for(int i=0;i<limit;i++)
{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRECIO_CERRADO,SEÑAL_MODO,i);
if(initFinished==false)
{
IndicatorShortName("MACD_max-min");
int win_idx=WindowFind("MACD_max-min");
// encontrar el número de la subventana de nuestro indicador
if(win_idx<0)
{
// si el número de subventana es -1, hay un error
Print("Ventana no encontrada");
return(0);
}
double top=VentanaPrecioMax(win_idx);
//buscar el valor máximo de la escala vertical de la subventana especificada del gráfico actual
ObjectCreate("max",OBJ_HLINE,win_idx,0,top);
// dibujar una línea horizontal en una subventana de nuestro indicador
ObjectSet("max",OBJPROP_COLOR,Yellow);
ObjectSet("max",OBJPROP_WIDTH,0);
WindowRedraw();
// redibujar la ventana para ver la línea
initFinished=true;
// el dibujo está terminado
}
topBuffer[i]=top;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Siento haberme entrometido.
topBuffer[i] detrás del bucle y el dibujo, prueba esto:
¡Hola !
Por favor, indíqueme la dirección correcta:
Me dan N variables externas del mismo tipo. Cómo elegir el valor máximo de ellos sin sobrecargar el código - MathMax devuelve el máximo de dos valores, pero si es, digamos, 20 ?
O bien, ¿cómo crear una matriz a partir de estos datos, que luego aplicar ArrayMaximum?
extern int A = 10;
extern int .......;
extern int N = 1253;
Gracias de antemano.
https://docs.mql4.com/ru/array/ArrayMaximum
int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)Busca el elemento con el valor máximo. La función devuelve la posición del elemento máximo en la matriz.
Parámetros:
array[] - Matriz numérica, que se busca.
count - Número de elementos a buscar.
Inicio - El índice de inicio de la búsqueda.
double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};
int maxValueIdx=Máximo de la matriz(num_array);
Print("Valor máximo = ", num_array[maxValueIdx]);
Pero, en forma de
int Max [N] = {A,.....,N};
la matriz no se crea.
Donde: A,......N son las variables dadas del mismo tipo. Número de variables = N
Ejemplo de creación de un array de cadenas a partir de variables externas (script):
Ejemplo de creación de un array de cadenas a partir de variables externas (script):
Gracias.
Funcionó, pero con una corrección: en lugar de
int init(){sym[1]=sym1;............
haga lo siguiente
int init(){sym[0]=sym1;.......
y luego se cuentan todos los elementos.
Perdón por la intromisión.
topBuffer[i] detrás del bucle y el dibujo, pruébalo así:
MUCHAS GRACIAS.
¡Su versión del indicador funciona!
Intenté resolverlos con el tutorial de MQL4 y los ejemplos revisados de indicadores, pero nada funcionó.
Si tiene el deseo, el tiempo y la inclinación de ayudarme a descubrir el porqué:
1. Cuando se instala el indicador de línea recibe un valor de 0 (cero) y sólo con la llegada del primer tick toma el valor de la variable top, o debe abrir la ventana de parámetros e inmediatamente cerrarla;
2. El parámetro top está calculado hasta el 4º signo, aunque hay la siguiente línea en init()
IndicadorDígitos(Dígitos+1);
y la línea
top=PrecioMax de la ventana(win_idx);
Lo he sustituido por
top=NormalizeDouble((WindowPriceMax(win_idx)),Digits+1);
No sirve de nada. Y los valores numéricos de la escala de la ventana indicadora son de 5 dígitos.
3. Con la eliminación del indicador El comentario no se elimina del gráfico.
Código
--------
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
double ExtMapBuffer1[],
ExtMapBuffer2[];
//--------------------------------
int init()
{
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtMapBuffer2);
IndicatorShortName("MACD_max-min_v2");
IndicatorDigits(Digits+1);
return(0);
}
//--------------------------------
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),limit,win_idx;
double top;
if(counted_bars>0)counted_bars--;
limit=Bars-counted_bars;
win_idx=WindowFind("MACD_max-min_v2");
for(int i=0;i<limit;i++)
{
ExtMapBuffer1[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
ExtMapBuffer2[i]=iMACD(0,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
}
// top=WindowPriceMax(win_idx);
top=NormalizeDouble((WindowPriceMax(win_idx)),Digits+1);
Comment( "\n"," top = ",top);
ObjectDelete("max");
if(ObjectFind("max")!=win_idx)
{
ObjectCreate("max",OBJ_HLINE,win_idx,Time[0],top);
ObjectSet("max",OBJPROP_COLOR,Yellow);
ObjectSet("max",OBJPROP_WIDTH,0);
}
return(0);
}
//+------------------------------------------------------------------+