Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1345

 
Vitaly Muzichenko #:

De nuevo, ¿es necesario cambiar el prefijo al cargar la siguiente copia?

¿puede decir en palabras cuál es el propósito?

se pueden crear y controlar los botones desde fuera de su ventana.


¿qué será?

 
Igor Makanu #:

¿puede decir en palabras cuál es el propósito?

Los botones también se pueden crear y controlar desde fuera de su ventana.


¿qué sería eso?

No sé, pero debería ser así: Crear en su subventana, y al hacer clic, obtener el número de esta subventana. No es necesario dibujar nada, sólo un botón que, al ser pulsado, muestre información en Alerta sobre el número de subventana

 
Vitaly Muzichenko #:

No lo sé, pero esta es la forma de hacerlo: Crea en tu subventana, y cuando haces clic en ella, obtienes el número de subventana. No es necesario dibujar nada, sólo un botón que, al ser pulsado, muestre información en Alerta sobre el número de subventana

comprobado en mi primera fuente:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

  // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
   srand(GetTickCount());
   long c_id = ChartID();
   int c_wf = ChartWindowFind();
   Print(c_id, " / ", c_wf);
   button.Create(c_id, "button" + (string)rand(), c_wf, 10, 10, 100, 100);
   button.Text("Button");
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+


por desgracia, todo es como usted escribió - si se ejecuta varias copias de este indicador con los parámetros por defecto, el botón será sólo en el primer indicador en una subventana

pero si cambias los parámetros durante el inicio, todo está bien


en general, la situación es poco clara

 
Igor Makanu #:

Lo he comprobado en mi primera fuente:

por desgracia, todo es como usted escribe - si ejecuta varias copias de este indicador con los parámetros por defecto, el botón sólo estará en el primer indicador de la subventana

pero si cambias los parámetros durante el inicio, todo está bien

en general, la situación es poco clara

Así que, aquí hay una pregunta: ¿Cómo cambiar los parámetros automáticamente, sin entrar en la configuración?

Nada funciona hasta ahora...

---

P.D. Lo ideal sería, pero por desgracia

input long MASlow = TimeLocal(); //
 
Vitaly Muzichenko #:

Hasta ahora no está funcionando...

Y no lo hará:

añadido en:

int OnInit()
{
   Print(__FUNCTION__);

Pongo un indicador - obtengo OnInit en el registro, pero el siguiente indicador ya está en silencio, es decir, sólo una copia del indicador se está ejecutando realmente, y los otros indicadores son sólo una cáscara gráfica

 
Igor Makanu #:

y no funcionará:

añadido en:

Pongo el indicador - obtengo OnInit en el registro, pero el siguiente indicador ya está en silencio, es decir, sólo una copia del indicador se está ejecutando realmente, y los otros indicadores son sólo una cáscara gráfica

Así es. Supongo que la arquitectura de mt5 no es la adecuada. El terminal mt4 funciona bien.

Si ha decidido hacerlo en mt5, prohibiría ejecutar copias del indicador con los mismos parámetros de entrada, porque parece que está presente pero no.

 
Vitaly Muzichenko #:

Así es. La arquitectura de mt5 debe ser un desastre. Todo funciona bien en mt4.

Si decidieron hacerlo en mt5, deberían haber prohibido el lanzamiento de copias de indicadores con los mismos parámetros de entrada, porque parece que está ahí, pero en realidad no lo está.

La parte de cálculo del indicador no es la misma que la gráfica. Por lo tanto, la parte de cálculo es la misma para todos ellos. Hay varios gráficos.

¿No se pueden buscar todas las subventanas en un indicador y poner etiquetas con el número de subventana? Al mismo tiempo para captar en el temporizador el número de subventanas del gráfico: aumentado - añadir a una nueva etiqueta de subventana. Pero también busca qué indicador se coloca en él - si es diferente, entonces no añadas...

Sólo una idea no probada.

ZS. No estoy de acuerdo con la "curvatura". Una parte de cálculo para 20 indicadores idénticos es mejor que 20 partes de cálculo para 20 indicadores idénticos.

 
Artyom Trishkin #:

La parte de cálculo de un indicador no es la misma que la parte gráfica. Por lo tanto, la parte de cálculo es la misma para todos ellos. Hay varios gráficos.

¿No se pueden buscar todas las subventanas en un indicador y poner etiquetas con el número de subventana? Al mismo tiempo para captar en el temporizador el número de subventanas del gráfico: aumentado - añadir a una nueva etiqueta de subventana. Pero también busca qué indicador se coloca en él - si es diferente, entonces no añadas...

Sólo una idea no probada.

ZS. No estoy de acuerdo con la "curvatura". Una parte de cálculo para 20 indicadores idénticos es mejor que 20 partes de cálculo para 20 indicadores idénticos.

Did, no hay respuesta al botón - la copia OnChartEvent no se dispara y no entiende el número de subventana.

De todos modos, esto es lo que no funciona y junto con ello el resto del código

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

FAQ de principiantes MQL5 MT5 MetaTrader 5

Igor Makanu, 2021.09.12 21:53

no lo haces:

añadido a:

int OnInit()
{
   Print(__FUNCTION__);

Pongo un indicador - obtengo OnInit en el registro, pero el siguiente indicador ya está en silencio, es decir, sólo una copia del indicador se está ejecutando realmente, y los otros indicadores son sólo una cáscara gráfica


 
Vitaly Muzichenko #:

Did, no hay reacción al botón - la copia OnChartEvent no funciona y no entiende el número de subventana.

De todos modos, esto es lo que no funciona y con ello el resto del código


¡¡¡PERO!!! Si hago una plantilla con 2-3 de estos indicadores bajo el nombre "Debug.tpl" y comienzo a depurar el indicador, entonces OnInit() funciona como debería.

En general, hice un experimento de este tipo:

Transferí #property a su máximo en OnInit() esperando que mientras no se cree el indicador se ejecute OnInit() y se haga un nombre corto para el indicador, dependiendo del número de indicadores en la ventana.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID();
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  long windows_total = ChartGetInteger(chart_id, CHART_WINDOWS_TOTAL);
  short_name = (string)windows_total;
  Print(short_name);
  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
  PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);
  PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
  PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
  PlotIndexSetString(0, PLOT_LABEL, "Label1");
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

Pero no sirvió de nada:

Empiezo la primera copia

Nombre del indicador 2.........

Inicio la segunda copia - el nombre del indicador sigue siendo 2 para ambos indicadores

Inicio la depuración y ¡qué veo! El indicador aún no cargado ya está imprimiendo... lea la segunda y tercera línea...

¿cómo puede ser esto?


La depuración adicional se detuvo al entrar en OnInit(), la variable windows_total contiene basura, short_name sigue siendo una cadena vacía...

Hi......... pero ya está todo impreso... ¿cómo es que?

Y el nombre_corto ya ha cambiado.

Como resultado, después de una carga completa del indicador en modo de depuración, el indicador tiene los siguientes nombres

Tal vez deberíamos llamar la atención de los desarrolladores sobre estos fallos...

 
Hola amigos, tal vez estoy en el lugar equivocado, pero veo la sección llamada: "Preguntas de los principiantes MQL5 MT5 MetaTrader 5". Así que mi pregunta es: Yo solía descargar Demo EAs de mercado para las pruebas ahora lo que hice MT5 no puede descargar Demo. MT4 sin problemas, MT5 no ¿cuál es la razón?
Razón de la queja: