Scripts: Conmutación de gráficos

 

Conmutación de gráficos:

El script cambia entre todos los gráficos abiertos dentro de un determinado intervalo de tiempo. También se puede visualizar los gráficos sólo de los símbolos especificados.

Autor: Vladimir Karputov

 
Buenas noches! ¿Es posible hacer un bucle en el script? De modo que después de que el final de los gráficos abiertos que empezar de nuevo, en lugar de terminar el trabajo.
 
Skyline Real:
Buenas noches! ¿Es posible hacer un bucle en el script? De forma que al terminar de abrir los gráficos volviera a empezar, en lugar de terminar el trabajo.
En principio, es posible. Pero, ¿cuántos ciclos se debe hacer? O como un caleidoscopio - durante todo el día?
 
Karputov Vladimir:
En principio, se puede. ¿Cuántos ciclos hay que hacer? O como un caleidoscopio: ¿todo el día?
Bueno, un día entero sería mejor.....
 
Skyline Real:
Bueno, un día entero sería mejor.....

En ese caso, necesitas un EA en el que llamar a todo el carrusel en OnTimer(). Me lo pensaré.

Añadido. Corregido el texto.

 

De todos modos, aquí está el Asesor Experto. Lo principal es recordar que es un poco problemático apagar/descargar el Asesor Experto cuando se muestran infinitamente los gráficos :) . Por lo tanto, permítame recordarle que este Asesor Experto se muestra en la ventana "Navegador":

Ventana "Navegador" con el Asesor Experto en funcionamiento

Ah, aquí está el Asesor Experto:

//+------------------------------------------------------------------+
//|Chart_bringing_to_top.mq5
//|Copyright © 2016, Vladimir Karputov ||
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "The indicator switches all open charts after a certain interval."
//--- parámetro de entrada
//--- parámetro de entrada
input uchar Seconds=3;              // intervalo // intervalo
//---
bool        IsCicle=false;          // true - in cicle // true - in cicle
//+------------------------------------------------------------------+
//| Función de inicialización experta|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- crear temporizador
   if(Seconds<3)
     {
      MessageBox("Interval must be greater than 3 seconds");
      EventSetTimer(3);
     }
   else
      EventSetTimer(Seconds);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Función de desinicialización experta|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destruir temporizador
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Función tick experto|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Función temporizador|
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(IsCicle)
      return;
   IsCicle=true;
//---
   uchar temp_second;
   if(Seconds<3)
      temp_second=3;
// variables para el ID del gráfico
   long currChart,prevChart=ChartFirst();
//--- Mostrar el primer gráfico
//--- Mostrar el primer gráfico
   ChartBringToTop(prevChart);
   Sleep((int)MathAbs(temp_second*1000));
   int i=0,limit=100;
//Print("GráficoPrimero = ",GráficoSímbolo(gráficoprevio)," ID = ",gráficoprevio);
// Probablemente no tengamos más de 100 gráficos abiertos
// Ciertamente no tenemos más de 100 cartas abiertas
   while(i<limit)// 
     {
      // A partir del anterior, obtenemos un nuevo gráfico
      // Obtener el nuevo ID del gráfico utilizando el ID del gráfico anterior
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  // Ha llegado al final de la lista de gráficos // Ha llegado al final de la lista de gráficos
                              //Print(i," ",ChartSymbol(currChart)," ID =",currChart);
      ChartBringToTop(currChart);
      Sleep((int)MathAbs(temp_second*1000));
      // Recordar el ID del gráfico actual para ChartNext()
      // Guardemos el ID del gráfico actual para el ChartNext()
      prevChart=currChart;
      // No olvidemos aumentar el contador
      // No olvides aumentar el contador
      i++;
     }
   IsCicle=false;
  }
//+------------------------------------------------------------------+
//| Envía un comando al terminal para mostrar el gráfico encima de todos los demás gráficos. |||
//| Envía un comando al terminal para mostrar el gráfico por encima de todos los demás ||
//+------------------------------------------------------------------+
bool ChartBringToTop(const long chart_ID=0)
  {
//--- restablecer el valor de error
   ResetLastError();
//--- mostrar el gráfico encima de todos los demás
   if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
     {
      //--- envía el mensaje de error al registro de "Expertos".
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
   ChartRedraw(chart_ID);
//--- ejecución con éxito
   return(true);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 
Gracias por su prontitud. Pero el Asesor Experto no funciona correctamente. Si hay más de dos gráficos abiertos, el Asesor Experto salta del 1er gráfico al último, saltándose el resto entre ellos. Y no hay transición del último al primer gráfico, es decir, el carrusel no funciona.
 
Skyline Real:
Gracias por su prontitud. Pero el Asesor Experto no funciona correctamente. Si hay más de dos gráficos abiertos, el Asesor Experto salta del 1er gráfico al último, saltándose el resto entre ellos. Y no hay transición del último al primer gráfico, es decir, el carrusel no funciona.
El terminal mantiene su propio registro interno del orden de apertura de los gráficos. Y si baraja los gráficos en el proceso de trabajo, no cambiará la contabilidad interna. Realice un experimento: cierre todos los gráficos, abra cinco nuevos y adjunte el Asesor Experto al gráfico número 3.
 
Karputov Vladimir:
El terminal mantiene su propia contabilidad interna del orden de apertura de las cartas. Y si baraja los gráficos en el proceso de trabajo, no cambiará la contabilidad interna. Haga un experimento: cierre todos los gráficos, abra cinco nuevos y adjunte el Asesor Experto al gráfico número 3.

Lo he comprobado, todo sigue igual. Pasa del tercer gráfico al último y se detiene. No pasa del último al primero, no hay carrusel.

No sé si afecta - tengo mt4. He renombrado el archivo a mt4 y he hecho una compilación. El script anterior cambia correctamente....

 

EA versión 1.01. Corregido un error y sustituido el nombre de la variable. En lugar de

Seconds

ahora la variable tiene el nombre

Seconds_
porque en MQL4 la palabra Segundos no se puede usar como nombre de variable. (Ayuda sobre Segundos).


El Asesor Experto se puede utilizar tanto en MetaTrader 5 y MetaTrader 4 (para MT4 sólo tiene que cambiar el nombre del archivo).

Seconds - Документация на MQL4
  • docs.mql4.com
Seconds - Документация на MQL4
Archivos adjuntos:
 

Un video del funcionamiento del EA - un caleidoscopio que cambia todos los gráficos disponibles en modo infinito: