[¡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

 
alsu:
¿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);
}
//+------------------------------------------------------------------+

 
MK07:

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:

int start()
  {
   int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   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);
        
          if(initFinished==false)
           { 
             int win_idx=WindowFind("MACD_max-min");
             // находим номер подокна нашего индикатора
      
             if(win_idx<0)
              {
               // если номер подокна равен -1, то возникла ошибка
                 Print("Окно не найдено");
                 return(0);
              }  
              
             double   top=WindowPriceMax(win_idx); 
              //находим максимальное значение вертикальной шкалы указанного подокна текущего графика
             topBuffer[i]=top;
             Comment( "\n"," top = ",top); 

             ObjectCreate("max",OBJ_HLINE,win_idx,0,0);
             // рисуем горизонтальную линию в подокне нашего индикатора
             ObjectSet("max", OBJPROP_PRICE1, top);  
             ObjectSet("max",OBJPROP_COLOR,Yellow);
             ObjectSet("max",OBJPROP_WIDTH,0);
 
             WindowRedraw();      
             // перерисовываем окно, чтобы увидить линиию   
      
             initFinished=true;
            // рисование закончено  
        
           } 
        
            
                
        
      }  
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
//Пробуйте с учетом мнения alsu. 
#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");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");
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);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);}
//+------------------------------------------------------------------+
 
Buenos días por favor ayuda. soy un novato y instalado MetaFX y asesor experto en la demo todo funciona y no quiere trabajar en el original no quiere simplemente estar
 

¡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.

 
Roll:

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.
Ejemplo:
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):

extern string sym1="GBPUSD";
extern string sym2="GBPJPY";
extern string sym3="EURUSD";
extern string sym4="EURJPY";
extern string sym5="AUDUSD";
extern string sym6="AUDJPY";
extern string sym7="NZDUSD";
extern string sym8="USDCAD";

string sym[8];
//+------------------------------------------------------------------+
int init(){sym[1]=sym1;sym[2]=sym2;sym[3]=sym3;sym[4]=sym4;
   sym[5]=sym5;sym[6]=sym6;sym[7]=sym7;sym[8]=sym8;return(0);}

int start(){Alert("символ  ",sym[1]);return(0);}
 
Roll:

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.

 
r772ra:

Perdón por la intromisión.

topBuffer[i] detrás del bucle y el dibujo, pruébalo así:

Su opción no funciona, pero un GRAN AGRADECIMIENTO por su atención, trabajo y comprensión de los problemas de los demás.
 
Roll:

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);
}
//+------------------------------------------------------------------+


Archivos adjuntos:
Razón de la queja: