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, você pode. Quantos ciclos você precisa fazer? Ou como um caleidoscópio - o dia inteiro?
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":
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); } //+------------------------------------------------------------------+
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 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).
Um vídeo do funcionamento do EA - um caleidoscópio que alterna todos os gráficos disponíveis no modo infinito:

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Alternância de gráficos:
Autor: Vladimir Karputov