Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1419

 
Alexey Viktorov:

Ne serait-il pas préférable de lire plus attentivement la documentation ?

CHART_BRING_TO_TOP

Afficher le graphique au dessus de tous les autres graphiques

bool w/o


Cela signifie que cette propriété est en écriture seule. Et vous essayez de le lire. .........

De plus, vous ne donnez pas une réponse complète à la question.

Il s'agit d'un script ou d'un indicateur.
Il s'agit d'un indicateur. Et il imprime le résultat immédiatement lorsque la fenêtre change, c'est-à-dire qu'il peut lire.
 
Valeriy Yastremskiy:

Et je ne comprends pas l'intérêt du gémissement. La condition est toujours vraie.

La condition est toujours vraie, mais le nombre de graphes n'est pas connu.

 
Valeriy Yastremskiy:

Si je ne comprends pas ce qui se passe, j'imprime tout ce que j'ai, parfois ça aide. Et je ne comprends pas l'intérêt du voile. La condition est toujours vraie.

Le cas échéant, il doit être fait statiquement, sinon il réinitialise

string symbol, printsimbol="";
      long currChart=ChartFirst(); int i=0;
      while(currChart>=0)
        {
 
MakarFX:
Il s'agit d'un indicateur. Et il imprime immédiatement le résultat lorsque la fenêtre change, c'est-à-dire qu'il peut lire.

Tu ne penses pas que ça se lit comme du charabia ? Bien que non modifiable, c'est toujours du charabia.

Essayez de l'imprimer lorsque le programme change. Il est alors important de savoir comment le graphique actif évolue. Si l'indicateur se trouve sur le graphique à l'extrême gauche, passe-t-on au suivant à droite, puis à celui à l'extrême droite et ainsi de suite de manière chaotique ? Ou faut-il simplement tracer la sortie du graphique où se trouve l'indicateur et y revenir ?

 
Alexey Viktorov:

Tu ne penses pas que ça se lit comme du charabia ? Bien que non modifiable, c'est toujours du charabia.

Essayez de l'imprimer lorsque le programme change. Il est alors important de savoir comment le graphique actif évolue. Si l'indicateur se trouve sur le graphique à l'extrême gauche, passe-t-on au suivant à droite, puis à celui à l'extrême droite et ainsi de suite de manière chaotique ? Ou bien faut-il simplement tracer le fait de quitter le graphique où se trouve l'indicateur et d'y revenir ?

Je ne sais pas ce qu'il lit, mais il imprime ce dont vous avez besoin.

2021.03.16 09:33:25.650 Label USDCHF,M15: EURGBP
2021.03.16 09:33:25.148 Label USDCHF,M15: EURGBP
2021.03.16 09:33:24.647 Label USDCHF,M15: EURGBP
2021.03.16 09:33:24.145 Label USDCHF,M15: GBPCHF
2021.03.16 09:33:23.644 Label USDCHF,M15: GBPCHF
2021.03.16 09:33:23.142 Label USDCHF,M15: GBPCHF
2021.03.16 09:33:22.641 Label USDCHF,M15: USDCHF
2021.03.16 09:33:22.155 Label USDCHF,M15: USDCHF
2021.03.16 09:33:21.654 Label USDCHF,M15: USDCHF
2021.03.16 09:33:21.152 Label USDCHF,M15: EURGBP
2021.03.16 09:33:20.651 Label USDCHF,M15: EURGBP
2021.03.16 09:33:20.149 Label USDCHF,M15: EURGBP

Il fonctionne sur n'importe quel graphique (le plus à gauche, le plus à droite, le plus au centre) et sur n'importe quel ordre de commutation des graphiques.

Essayez

//+------------------------------------------------------------------+
//|                                                        Label.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(500);
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
      string symbol01;
      long currChart=ChartFirst(); int i=0;
      while(currChart>=0)
        {
         if(ChartGetInteger(currChart,CHART_BRING_TO_TOP,0)==true) 
           { 
            symbol01=ChartSymbol(currChart);      Print(symbol01);
           } 
         currChart=ChartNext(currChart);  i++;
        }
//--- 
  }
//+----------------------------------------------------------------------------+
 

Je l'ai fait de cette façon

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
      long currChart=ChartFirst(); int i=0;
      while(currChart>=0)
        {
         if(ChartGetInteger(currChart,CHART_BRING_TO_TOP,0)==true) 
           { 
            symbol01=ChartSymbol(currChart);
           } 
         currChart=ChartNext(currChart);  i++;
        }
   PrintLabel();
//--- 
  }
//+----------------------------------------------------------------------------+
void PrintLabel()
  {
   if(symbol02!=symbol01){symbol02=symbol01; Print(symbol02);}
   return;
  }

Résultat

2021.03.16 10:00:05.075 Custom indicator Label USDCHF,M15: removed
2021.03.16 10:00:05.060 Label USDCHF,M15: uninit reason 1
2021.03.16 10:00:00.046 Label USDCHF,M15: USDCHF
2021.03.16 09:59:55.486 Label USDCHF,M15: EURCAD
2021.03.16 09:59:54.498 Label USDCHF,M15: CADCHF
2021.03.16 09:59:53.511 Label USDCHF,M15: EURGBP
2021.03.16 09:59:52.994 Label USDCHF,M15: GBPCHF
2021.03.16 09:59:51.991 Label USDCHF,M15: EURUSD
2021.03.16 09:59:48.945 Label USDCHF,M15: USDCHF
2021.03.16 09:59:48.428 Label USDCHF,M15: initialized
2021.03.16 09:59:47.046 Custom indicator Label USDCHF,M15: loaded successfully

Merci à tous pour votre aide ! !!

 
MakarFX:

Je ne sais pas ce qu'il lit, mais il imprime ce dont il a besoin.

Fonctionne sur n'importe quel graphique (le plus à gauche, le plus à droite, le plus au centre) et sur n'importe quel ordre de changement de graphique.

Essayez

Il lit 1 ou 0. Je ne sais pas s'il est précis, mais il fonctionne étonnamment...

Voici donc une solution toute prête

/***************************Timer function***************************/
void OnTimer()
 {
  static long chart_ID = 0;
  string symbol01;
  long currChart = ChartFirst();
  while(currChart >= 0)
   {
    if(chart_ID != ChartGetInteger(currChart, CHART_WINDOW_HANDLE) && ChartGetInteger(currChart,CHART_BRING_TO_TOP,0) == 1)
     {
      chart_ID = ChartGetInteger(currChart, CHART_WINDOW_HANDLE);
      symbol01 = ChartSymbol(currChart);
      Print(symbol01, " ", EnumToString(ChartPeriod(currChart)), " ", chart_ID);
     }
    currChart = ChartNext(currChart);
   }
 }/*******************************************************************/
 
MakarFX:

Je l'ai fait de cette façon

Résultat

Merci à tous pour votre aide ! !!

S'il y a deux graphiques de même caractère ou plus,


ça ne marchera pas.

 
MakarFX:

Je ne sais pas ce qu'il lit, mais il imprime ce dont il a besoin.

Fonctionne sur n'importe quel graphique (le plus à gauche, le plus à droite, le plus au centre) et sur n'importe quel ordre de changement de graphique.

Essayez

void OnTimer()
{
   long currChart=0,prevChart=ChartFirst();
   int i=0,limit=100;
   static long CurrID;
   while(i<limit) { // у нас наверняка не больше 100 открытых графиков
      currChart=ChartNext(prevChart); // на основании предыдущего получим новый график
      if(ChartGetInteger(currChart,CHART_BRING_TO_TOP))
         break;
      if(currChart<0) break;          // достигли конца списка графиков
      prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
      i++;// не забудем увеличить счетчик
   }
   if(CurrID!=currChart) {
      Print(ChartSymbol(currChart));
      CurrID=currChart;
   }
}


P.S. En écrivant, les codes ont déjà été esquissés :)

 
Alexey Viktorov:

Il lit 1 ou 0. Je ne sais pas s'il est fiable, mais il fonctionne étonnamment...

Voici donc la solution.

Ça marche, merci.

Vitaly Muzichenko:


P.S. En écrivant ceci, le code a déjà été écrit :)

Saute la première fenêtre de graphique.

Alexey Viktorov:

S'il y aura deux cartes de même caractère ou plus,

ça ne marche pas

Il fonctionne comme il se doit. Le but est d'imprimer si un caractère change !

Raison: