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

 
Une question s'est posée. Comment connaître le nombre de fenêtres ouvertes et leurs identifiants. Je n'ai pu obtenir que l'identifiant de la première fenêtre, de la fenêtre actuelle et de la fenêtre suivante. Je comprends bien que l'on ne peut pas obtenir le total, mais seulement la première, non-ext et comment comprendre qu'il n'y a pas de fenêtre suivante.
 
Valeriy Yastremskiy #:
Une question s'est posée. Comment connaître le nombre de fenêtres ouvertes et leurs identifiants. Je n'ai pu obtenir que l'identifiant de la première fenêtre, de la fenêtre actuelle et de la fenêtre suivante. Je comprends bien que l'on ne peut pas obtenir le total, mais seulement la première, non-ext et comment comprendre qu'il n'y a pas de fenêtre suivante.
    long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol)
        break;
      currChart=ChartNext(currChart);
      if(currChart==-1) break;
      i++;
    }
    symb=ChartSymbol(currChart);
 
Vitaly Muzichenko #:

On ne peut pas supposer que les fenêtres sont ouvertes pour tous les postes ouverts. L'algorithme doit donc rechercher une fenêtre avec le symbole requis, et si elle est absente, ouvrir une fenêtre et dessiner la situation. C'est-à-dire les niveaux, puis trouver sur quel SL la modification a eu lieu, et soit supprimer ou changer la couleur du niveau.

 
Valeriy Yastremskiy #:

On ne peut pas supposer que les fenêtres sont ouvertes pour tous les postes ouverts. L'algorithme doit donc rechercher la fenêtre avec le symbole requis, et si elle est absente, ouvrir la fenêtre et dessiner la situation. C'est-à-dire les niveaux, puis trouver sur quel SL la modification a eu lieu et soit supprimer ou changer la couleur du niveau.

Mettez un drapeau, s'il y a une fenêtre ouverte, alors dessinez, s'il n'y a pas d'ouverture - passez. Il n'y a aucun sens à ouvrir et dessiner si ce n'est pas ouvert/fermé.

    long currChart=ChartFirst();
    int i=0;
    flag=false;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol) {
        flag=true;
        break;
      }
      currChart=ChartNext(currChart);
      if(currChart==-1) break;
      i++;
    }
    if(flag) {
    symb=ChartSymbol(currChart);
    ...
 
Vitaly Muzichenko #:

Mettez un drapeau s'il y a une fenêtre ouverte, alors dessinez, s'il n'y a pas de fenêtre ouverte, alors ignorez-la. Il ne sert à rien d'ouvrir et de dessiner si l'on ne sait pas qu'il est ouvert/fermé.

C'est au client de décider s'il doit en ouvrir un nouveau si le symbole n'est pas ouvert. Pour moi, avec l'ouverture, c'est un compte rendu plus complet de la situation du client. Dans la recherche, vous avez besoin de l'identifiant de la fenêtre du symbole que vous recherchez.Ensuite, dessinez la fenêtre que vous recherchez.

int FcurrChartSimbol(symbol){   
long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol)
      return(currChart);
      currChart=ChartNext(currChart);i++;
      if(currChart==-1)return(-1);
      
    }}

Zy a corrigé. C'est une fonction)))

 
Valeriy Yastremskiy #:

La décision d'en ouvrir un nouveau, si le symbole n'est pas ouvert, appartient au client. Pour moi, l'ouverture est un compte rendu plus complet de la situation du client. Dans la recherche, vous avez besoin de l'identifiant de la fenêtre du symbole que vous recherchez.Ensuite, dessinez la fenêtre que vous recherchez.


Zy a corrigé. C'est une fonction)))

L'idéal est de remplir un tableau de graphiques ouverts visible dans le monde entier, puis de travailler avec ce tableau.

int FcurrChartSimbol(symbol) {   
   long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      i++;
      mass[i-1]=currChart;
      currChart=ChartNext(currChart);
      if(currChart==-1)
        break;
    }
   return(i); // количество графиков
}

Ensuite, exécutez-la sur un événement pour rafraîchir le remplissage, par exemple lorsque le nombre de positions a changé.

int OT=OrderTotal();
if(OT != pOT) {
 FcurrChartSimbol(symbol);
 pOT=OT;
}

Cela réduira la charge, il n'y aura pas besoin de faire tourner une boucle inutile.

 
Vitaly Muzichenko #:

Idéalement, remplissez un tableau visible globalement avec des graphiques ouverts, puis travaillez avec ce tableau.

Ensuite, exécutez-la sur un événement pour rafraîchir le remplissage, par exemple lorsque le nombre de positions change.

Cela réduira la charge, et il n'y aura pas besoin de boucles inutiles.

Peut-être que quelque chose m'échappe, mais je ne comprends pas pourquoi vous n'utilisez pas SYMBOL_SELECT et SYMBOL_VISIBLE pour déterminer si le graphique est ouvert.

Lorsque vous passez les commandes, faites le contrôle

    if(!SymbolInfoInteger(Order_Symbol, SYMBOL_SELECT) || !SymbolInfoInteger(Order_Symbol, SYMBOL_VISIBLE))
      SymbolSelect(Order_Symbol, true);
 
Alexey Viktorov #:

Peut-être que quelque chose m'échappe, mais je ne comprends pas pourquoi vous n'utilisez pas SYMBOL_SELECT et SYMBOL_VISIBLE pour déterminer l'ouverture du graphique.

Passez les commandes et faites le contrôle

Ceci provient d'un autre opéra et a trait à Market Watch, pas aux graphiques ouverts. Ou est-ce le cas ?

P.S. S'il y a une position ouverte, le symbole dansMarket Watch sera de toute façon visible.
 
Vitaly Muzichenko #:

Cela vient d'un autre fil de discussion et a à voir avec Market Watch, pas avec les graphiques ouverts. Ou est-ce le cas ?

P.S. S'il y a une position ouverte, le symbole dansMarket Watch sera de toute façon visible.

SYMBOL_SELECT oui, mais SYMBOL_VISIBLE n'est pas nécessaire.

Et oui, je suis d'accord, ça n'a pas besoin d'être un tableau ouvert.

 
Vitaly Muzichenko #:

Idéalement, remplissez un tableau visible globalement avec des graphiques ouverts, puis travaillez avec ce tableau.

Ensuite, exécutez-la sur un événement pour rafraîchir le remplissage, par exemple lorsque le nombre de positions change.

Cela réduira la charge, pas besoin de faire tourner une boucle inutile.

Je ne comprends pas la logique. Les événements d'ouverture d'une position, de modification du SL, de fermeture d'une position sont suivis pendant quelques symboles. Lors de l'ouverture d'une position, nous cherchons si une fenêtre avec le symbole donné est ouverte (chercher l'id de la fenêtre) ; si elle est ouverte, nous tirons des niveaux et surveillons ensuite le chalutage SL. Si ce n'est pas le cas, soit nous ouvrons une fenêtre avec le symbole et le délai requis et nous traçons des niveaux, soit nous ne l'ouvrons pas. L'événement de modification, trouver la fenêtre de symbole nécessaire, les niveaux ont déjà été dessinés et changer la couleur du niveau ou le supprimer et dessiner le niveau à nouveau.

En général, pour exclure l'influence du client, nous devons, au début du travail, analyser les positions et les fenêtres et ouvrir des fenêtres pour les symboles avec des positions ouvertes et non ouvertes.