Scripts: Alternância de gráficos

 

Alternância de gráficos:

O script alterna todas os gráficos abertos após um determinado intervalo. Você também pode exibir apenas gráficos de determinados símbolos.

Autor: Vladimir Karputov

 
Boa noite, é possível fazer um loop no script? Para que, após o fim dos gráficos abertos, ele comece novamente, em vez de terminar o trabalho.
 
Skyline Real:
Boa noite, é possível fazer um loop no script? Para que, após o fim dos gráficos abertos, ele comece tudo de novo, em vez de terminar o trabalho.
Em princípio, isso é possível. Mas quantos ciclos devem ser feitos? Ou como um caleidoscópio - o dia inteiro?
 
Karputov Vladimir:
Em princípio, você pode. Quantos ciclos você precisa fazer? Ou como um caleidoscópio - o dia inteiro?
Bem, um dia inteiro seria melhor.....
 
Skyline Real:
Bem, um dia inteiro seria melhor.....

Nesse caso, você precisa de um EA para chamar o carrossel inteiro em OnTimer(). Vou pensar sobre isso.

Adicionado. Corrigido o texto.

 

De qualquer forma, aqui está o Expert Advisor. O principal é lembrar que é um pouco problemático desativar/descarregar o Expert Advisor quando os gráficos são exibidos infinitamente :) . Portanto, deixe-me lembrá-lo de que esse Expert Advisor é exibido na janela "Navigator":

Janela "Navigator" com o Expert Advisor em funcionamento

Ah, aqui está o próprio Expert Advisor:

//+------------------------------------------------------------------+
//|Chart_bring_to_top.mq5
//|Direitos autorais © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Direitos autorais © 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
//+------------------------------------------------------------------+
//| Função de inicialização de especialista|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- criar cronômetro
   if(Seconds<3)
     {
      MessageBox("Interval must be greater than 3 seconds");
      EventSetTimer(3);
     }
   else
      EventSetTimer(Seconds);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de desinicialização de especialista|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destruir o cronômetro
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Função de tique de especialista|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Função de cronômetro|
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(IsCicle)
      return;
   IsCicle=true;
//---
   uchar temp_second;
   if(Seconds<3)
      temp_second=3;
// variáveis para o ID do gráfico
   long currChart,prevChart=ChartFirst();
//--- Mostrar o primeiro gráfico
//--- Mostrar o primeiro gráfico
   ChartBringToTop(prevChart);
   Sleep((int)MathAbs(temp_second*1000));
   int i=0,limit=100;
//Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
// Provavelmente não temos mais de 100 gráficos abertos
// Certamente não temos mais de 100 gráficos abertos
   while(i<limit)// 
     {
      // Com base no anterior, obtemos um novo gráfico
      // Obter o novo ID do gráfico usando o ID do gráfico anterior
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  // Chegou ao final da lista de gráficos // Chegou ao final da lista de gráficos
                              //Print(i," ",ChartSymbol(currChart)," ID =",currChart);
      ChartBringToTop(currChart);
      Sleep((int)MathAbs(temp_second*1000));
      // Lembre-se do ID do gráfico atual para ChartNext()
      // Vamos salvar o ID do gráfico atual para o ChartNext()
      prevChart=currChart;
      // Não vamos nos esquecer de aumentar o contador
      // Não se esqueça de aumentar o contador
      i++;
     }
   IsCicle=false;
  }
//+------------------------------------------------------------------+
//| Envie um comando ao terminal para mostrar o gráfico sobre todos os outros gráficos.
//| Envia comando ao terminal para exibir o gráfico acima de todos os outros.
//+------------------------------------------------------------------+
bool ChartBringToTop(const long chart_ID=0)
  {
//--- redefinir o valor do erro
   ResetLastError();
//--- mostrar o gráfico em cima de todos os outros
   if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
     {
      //--- enviar a mensagem de erro para o registro "Experts".
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
   ChartRedraw(chart_ID);
//--- execução bem-sucedida
   return(true);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
Obrigado por sua presteza. Mas o Expert Advisor não está funcionando corretamente. Se mais de dois gráficos estiverem abertos, o Expert Advisor saltará do primeiro para o último gráfico, pulando o restante entre eles. E não há transição do último para o primeiro gráfico, ou seja, o carrossel não funciona.
 
Skyline Real:
Obrigado por sua presteza. Mas o Expert Advisor não está funcionando corretamente. Se mais de dois gráficos estiverem abertos, o Expert Advisor saltará do primeiro para o último gráfico, pulando o restante entre eles. E não há transição do último para o primeiro gráfico, ou seja, o carrossel não funciona.
O terminal mantém seu próprio registro interno da ordem de abertura dos gráficos. E se você embaralhar os gráficos durante o processo de trabalho, isso não alterará a contabilidade interna. Faça um experimento: feche todos os gráficos, abra cinco novos e anexe o Expert Advisor ao gráfico número 3.
 
Karputov Vladimir:
O terminal mantém sua própria contabilidade interna da ordem de abertura dos gráficos. E se você embaralhar os gráficos durante o processo de trabalho, isso não alterará a contabilidade interna. Faça um experimento: feche todos os gráficos, abra cinco novos e anexe o Expert Advisor ao gráfico número 3.

Eu verifiquei e tudo continua igual. Ele muda do terceiro gráfico para o último e depois para. Ele não muda do último para o primeiro, não há carrossel.

Não sei se isso afeta o programa - tenho o mt4. Renomeei o arquivo para mt4 e fiz uma compilação. O script anterior alterna corretamente....

 

EA versão 1.01. Corrigido um erro e substituído o nome da variável. Em vez de

Seconds

agora a variável tem o nome

Seconds_
porque em MQL4 a palavra Seconds não pode ser usada como um nome de variável. (Ajuda sobre Seconds).


O Expert Advisor pode ser usado tanto no MetaTrader 5 quanto no MetaTrader 4 (para o MT4, basta renomear o arquivo).

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

Um vídeo do funcionamento do EA - um caleidoscópio que alterna todos os gráficos disponíveis no modo infinito: