Questions des débutants MQL5 MT5 MetaTrader 5 - page 1384

 

leonerd #:
Здравствуйте. А как программно узнать символ и таймфрейм активного чарта в клиентском терминале? Т.е. чарта выбранного в настоящее время во вкладке. Есть какая-то функция из MQL5 для этого?

long  ChartGetInteger(
   long  chart_id,          // идентификатор графика
   int   prop_id,           // идентификатор свойства
   int   sub_window=0       // номер подокна, если требуется
   );

CHART_BRING_TO_TOP

Afficher le graphique au dessus de tous les autres graphiques

bool


string  ChartSymbol(
   long  chart_id=0      // идентификатор графика
   );
ENUM_TIMEFRAMES  ChartPeriod(
   long  chart_id=0      // идентификатор графика
   );

Comment définir un identifiant de graphique à afficher également ?

Документация по MQL5: Операции с графиками
Документация по MQL5: Операции с графиками
  • www.mql5.com
Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

CHART_BRING_TO_TOP

Afficher le graphique au dessus de tous les autres graphiques

bool


Comment définir un ID de graphique à afficher également ?

https://www.mql5.com/ru/docs/constants/chartconstants/charts_samples#chart_foreground

Merci. CHART_FOREGROUND est probablement le plus approprié. Je n'ai pas besoin de définir de force le graphique actif, j'ai juste besoin de déterminer lequel est actif. Ai-je raison de penser que je vais devoir passer en revue tous les graphiques ouverts en vérifiant CHART_FOREGROUND ?

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Примеры работы с графиком
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Примеры работы с графиком
  • www.mql5.com
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
leonerd #:

https://www.mql5.com/ru/docs/constants/chartconstants/charts_samples#chart_foreground

Merci. CHART_FOREGROUND est probablement le plus approprié. Ce n'est pas comme si j'avais besoin de définir de force le graphique actif, mais seulement d'identifier celui qui est actif. Est-ce que je comprends bien que je dois passer par tous les graphiques ouverts en vérifiant CHART_FOREGROUND ?

CHART_FOREGROUND est un graphique sur le dessus.

Et pour ne pas l'imposer, vous devriez remplacer ChartSetInteger par ChartGetInteger

 

Bonjour.
Pouvez-vous me donner un indice - je pense à un robot et il y a quatre conditions différentes - je ne sais pas encore lesquelles supprimer : je veux le découvrir plus tard lors de l'optimisation pour différents délais.

C'est-à-dire : quatre conditions (f1,f2,f3,f4). Il peut y avoir de nombreuses combinaisons (0,0,1,1) ou (1,0,1,0) et ainsi de suite - soit un total de 16 combinaisons. Exactement 15 - la variante (0, 0, 0, 0) n'est pas prise en compte.

Question : comment créer une logique de programme afin de ne pas décrire les 15 combinaisons dans le code. Il existe une fonction permettant de vérifier chacune de ces conditions, et dans quelles combinaisons de ces conditions s'appliquent - vérifiez comment.

Je serais heureux si vous pouviez me montrer un conseiller expert qui me permette de saisir un grand nombre de conditions dans un code concis.

 
qadexys #:

Bonjour.
Pouvez-vous me donner un indice - je pense à un robot et il y a quatre conditions différentes - je ne sais pas encore lesquelles supprimer : je veux le découvrir plus tard lors de l'optimisation pour différents délais.

C'est-à-dire : quatre conditions (f1,f2,f3,f4). Il peut y avoir de nombreuses combinaisons (0,0,1,1) ou (1,0,1,0) et ainsi de suite - soit un total de 16 combinaisons. Exactement 15 - la variante (0, 0, 0, 0) n'est pas prise en compte.

Question : comment créer une logique de programme afin de ne pas décrire les 15 combinaisons dans le code. Il existe une fonction permettant de vérifier chacune de ces conditions, et dans quelles combinaisons de ces conditions s'appliquent - vérifiez comment.

Je serais heureux si vous me montriez un conseiller expert qui me permette d'introduire plusieurs conditions dans un code concis.

Je vais peut-être faire comme ça :

input bool F1;
input bool F2;
input bool F3;
input bool F4;

   ...
   if(  ( !F1 || f1)
      &&( !F2 || f2)
      &&( !F3 || f3)
      &&( !F4 || f4)
     )
     {
      open_pos();
     }
   ...

Ou quelque chose comme ça :

#define  MODE_f1    0x1
#define  MODE_f2    0x2
#define  MODE_f3    0x4
#define  MODE_f4    0x8

bool expert::create_strategy(ulong m, int om, int cm)
  {
   magic=m;
   open_mode=om;
   close_mode=cm;
   ...
  }

int OnInit()
  {
   ...
   my_strat[i].create_strategy(MAGIC, MODE_f1|MODE_f2|MODE_f4,MODE_c2|MODE_c3);
   ...
  }

expert::check_open()
  {
   ...
   if(  ((open_mode & MODE_f1)==0 || f1)
      &&((open_mode & MODE_f2)==0 || f2)
      &&((open_mode & MODE_f3)==0 || f3)
      &&((open_mode & MODE_f4)==0 || f4)
     )
     {
      open_pos();
     }
   ...
  }
 
Alexey Viktorov #:

CHART_FOREGROUND est le graphique en haut de l'écran.

Et pour ne pas le forcer, remplacez ChartSetInteger par ChartGetInteger

merci

 
JRandomTrader #:

Tu pourrais faire ça :

Ou quelque chose comme ça :

Et voici la première construction - quel serait le comportement du code dans les conditions (0, 1, 0, 1) ?

Pourriez-vous expliquer le corps de la condition "If" ?

 
qadexys #:

Et voici la première construction - quel sera le comportement du code dans les conditions (0, 1, 0, 1) ?

Pouvez-vous expliquer le corps de la condition Si

C'est très simple ici. Si F1==false, alors ( !F1 || f1) sera vrai quelle que soit la condition f1.

C'est-à-dire que si Fn==vrai, la condition fn est vérifiée, et si Fn==faux, la condition fn n'est pas vérifiée.

Par conséquent, pour (0, 1, 0, 1), seules les conditions f2 et f4 seront vérifiées, et si elles sont toutes deux valides, le code open_pos() sera exécuté.

 
JRandomTrader #:

C'est très simple. Si F1==faux, alors ( !F1 || f1) sera vrai quelle que soit la condition f1.

C'est-à-dire que si Fn==vrai, la condition fn est vérifiée, et si Fn==faux, la condition fn n'est pas vérifiée.

Par conséquent, pour (0, 1, 0, 1), seules les conditions f2 et f4 seront vérifiées, et si elles sont toutes deux vérifiées, le code open_pos() sera exécuté.

Mais pour le cas où f1 et les autres ne sont pas seulement 0 ou 1. Je pensais que si la condition f1 est satisfaite pour une position courte, alors une est retournée. Si c'est pour une position longue, il retourne 2. Si la condition n'est pas du tout remplie - 0.

Mais dans une telle construction, nous ne devrions probablement pas compter sur une telle variété de valeurs de paramètres et formuler la condition d'une autre manière ?

 
qadexys #:

Mais pour le cas où f1 et les autres ne sont pas seulement 0 ou 1. Penser que si la condition f1 est remplie pour la position courte, alors un est retourné. Si pour une position longue, il retourne 2. Si la condition n'est pas du tout remplie - 0.

Mais peut-être ne devrions-nous pas compter sur une telle diversité de valeurs de paramètres dans cette construction et formuler la condition d'une autre manière, n'est-ce pas ?

Les ensembles de conditions pour l'ouverture longue et courte sont considérés séparément.

Je veux dire, par exemple, comme ça :

 ...
   if(  ( !F1 || f1==1 )
      &&( !F2 || f2==1 )
      &&( !F3 || f3==1 )
      &&( !F4 || f4==1 )
     )
     {
      open_short();
     }
   else if(  ( !F1 || f1==2 )
           &&( !F2 || f2==2 )
           &&( !F3 || f3==2 )
           &&( !F4 || f4==2 )
          )
     {
      open_long();
     }
 ...

Je vendrai même un morceau de mon vrai code - il ne révèlera aucun savoir-faire sans information sur les valeurs de "bataille" des variables et les conditions de tenue des positions.

Vous pouvez en fait spécifier l'une des 224 options ici :

   if(true
      && ((OpenMode & MODE_St1)==0 || St_Buf[St_Rq-1]>80)
      && ((OpenMode & MODE_St2)==0 || St_Buf2[St_Rq-1]>80)
      && ((OpenMode & MODE_BB1)==0 || last_tick.bid > bb[BandsReq-1].U)
      && ((OpenMode & MODE_BB2)==0 || last_tick.bid > bb2[BandsReq-1].U)
      && ((OpenMode & MODE_D1)==0  || rt[RtReq-1].high<rt[RtReq-2].high) 
     )
     {
      switch(OpenMode & (MODE_VR|MODE_OR|MODE_A))
        {
         case 0 :
         case MODE_A :
           res=-2;
           break;
         case MODE_VR :
           if((1/VR)>VRO)
             res=-2;
           break;
         case MODE_OR :
           if((1/OR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_A :
           if((1/AVR)>VRO)
             res=-2;
           break;
         case MODE_OR|MODE_A :
           if((1/AOR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_OR :
           if((1/VR)>VRO && (1/OR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_OR|MODE_A :
           if((1/AVR)>VRO && (1/AOR)>VRO)
             res=-2;
           break;
        }