Características del lenguaje mql5, sutilezas y técnicas - página 196

 
fxsaber:

Ninguna sugerencia sobre la procedencia de la hora (lo mismo para mí). Tal vez dependa de la zona horaria.


Esto ya no es interesante.

No hay que adivinar. Tengo Moscú. Con GMT no una hora... No hay otros pensamientos.

 

Andrey Khatimlianskii:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

¿Cómo utilizar el control automático de errores en el terminal?

Renat Fatkhullin, 2021.01.22 16:12

Existe una forma no documentada de restablecer forzosamente los registros en el disco a través de Print(NULL)

¡Genial!

 
Andrey Khatimlianskii:

fxsaber:

¡Genial!

Con prisa por compartir sin comprobarlo.

 
Andrey Khatimlianskii:

En mi prisa por compartir sin comprobar.


¿Qué pasa si la cadena se pone a cero primero y luego se imprime
 

Opción de mostrar (no activar) el gráfico (sólo MT5)

// Показывает (не активирует) данный чарт.
bool ChartShow( const long Chart )
{
  const bool IsDocked = ChartGetInteger(Chart, CHART_IS_DOCKED);
  
  return(ChartSetInteger(Chart, CHART_IS_DOCKED, !IsDocked) && 
         ChartSetInteger(Chart, CHART_IS_DOCKED, IsDocked) &&
         ChartGetInteger(Chart, CHART_WINDOW_HANDLE));  
}


Ejemplo de uso.

// Переключает чарты клавишами клавиатуры '<'/'>'.

#define  KEY_LEFT2 188  // '<'
#define  KEY_RIGHT2 190 // '>'

int GetExpertCharts( long &Charts[], const string ExpertName = NULL )
{
  int Amount = 0;
  
  for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart))
    if ((ExpertName == NULL ) || (ChartGetString(Chart, CHART_EXPERT_NAME) == ExpertName))
    {
      Amount = ArrayResize(Charts, Amount + 1, 10);
      
      Charts[Amount - 1] = Chart;
    }
    
  return(ArrayResize(Charts, Amount));
}

long ChartNextShow( const long Chart, const int Step = 1 )
{
  long ResChart = Chart;
  
  long Charts[];  
  const int Size = GetExpertCharts(Charts);
  
  if ((Size > 1) && (bool)(Step % Size))
    for (int i = 0; i < Size; i++)  
      if (Charts[i] == Chart)
      {
        ResChart = Charts[(i + ((Step > 0) ? Step : (Size - ((-Step) % Size)))) % Size];
        
        ChartShow(ResChart); // https://www.mql5.com/ru/forum/170952/page196#comment_20841674
        
        break;
      }

  return(ResChart);  
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& ) 
{         
  static long Chart = ChartID();
  
  if (id == CHARTEVENT_KEYDOWN) 
    switch ((int)lparam)
    {
    case KEY_LEFT2:
      Chart = ChartNextShow(Chart, -1); // Показали чарт слева
      break;

    case KEY_RIGHT2:
      Chart = ChartNextShow(Chart); // Показали чарт справа
      break;
    }
}

Lamentablemente, no se ha podido encontrar ninguna opción de activación de gráficos. Sólo se muestra.

 
Solución a un viejo problema.
/*
// https://www.mql5.com/ru/forum/1111/page2863#comment_18591240
#define VALUE 10

#define MACROS

#ifdef MACROS
  // Нужно VALUE увеличить в два раза.
#endif
*/

// https://www.mql5.com/ru/forum/1111/page2965#comment_20841725
#define  MACRO(  x, y, z )       enum nn##z { y = x };
#define  MACRO2( x, y )          MACRO( x, y, __LINE__ )

// https://www.mql5.com/ru/forum/1111/page2866#comment_18603128
#define  VALUE 10

MACRO2(VALUE, VALUE_TMP) // VALUE_TMP - поле enum, поэтому имя не должно повторяться.
#undef  VALUE
#define  VALUE (VALUE_TMP * 2)

void OnStart()
{
  Print(VALUE);
}

Esta opción es mejor que ésta.

#define  MACRO3(x, y)            const int y = x;

MACRO3(VALUE, VALUE_TMP)

No necesita una variable. Todos los valores se establecen en tiempo de compilación. ¡Gracias @A100!

 
fxsaber:

Lamentablemente, no se ha podido encontrar ninguna opción de activación de gráficos. Sólo la pantalla.

No entiendo......... ¿es eso a lo que te refieres? Es un guión.


ps; Y qué es esto

  const bool IsDocked = ChartGetInteger(Chart, CHART_IS_DOCKED);

No lo encuentro en la documentación...

Archivos adjuntos:
200.mq5  2 kb
 
Alexey Viktorov:

ps; ¿Qué es esto

No lo encuentro en la documentación...

Es ALT+D en el gráfico.

 
Alexey Viktorov:

No lo entiendo......... ¿es eso a lo que te refieres? Es un guión.

Gracias, algo que he hecho de más. Por supuesto, por encima se consiguió la gestión de los gráficos que antes no se podía conseguir. Pero mi objetivo era otro.

// Активирует данный чарт.
bool ChartActivate( const long Chart )
{
  return(ChartSetInteger(Chart, CHART_BRING_TO_TOP, true) && ChartGetInteger(Chart, CHART_WINDOW_HANDLE));
}


Ejemplo de uso.

// Переключает чарты с одним и тем же советником клавишами клавиатуры '<'/'>'.

void ChartNextActivate( const int Step = 1, const bool Expert = true )
{
  long Charts[];  
  // https://www.mql5.com/ru/forum/170952/page196#comment_20841674
  const int Size = GetExpertCharts(Charts, Expert ? ChartGetString(0, CHART_EXPERT_NAME) : NULL);
  const long Chart = ChartID();
  
  if ((Size > 1) && (bool)(Step % Size))
    for (int i = 0; i < Size; i++)  
      if (Charts[i] == Chart)
      {
        // https://www.mql5.com/ru/forum/170952/page197#comment_20845067
        ChartActivate(Charts[(i + ((Step > 0) ? Step : (Size - ((-Step) % Size)))) % Size]);
        
        break;
      }

  return;  
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& ) 
{         
  if (id == CHARTEVENT_KEYDOWN) 
    switch ((int)lparam)
    {
    case KEY_LEFT2:
      ChartNextActivate(-1);
      break;

    case KEY_RIGHT2:
      ChartNextActivate();      
      break;
    }
}