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

 
Vitaly Muzichenko #:

Encore une fois, devez-vous changer le préfixe lors du chargement de la prochaine copie ?

pouvez-vous dire avec des mots quel en est le but ?

peuvent être créés et contrôlés depuis l'extérieur de votre fenêtre.


qu'est-ce que ce sera ?

 
Igor Makanu #:

pouvez-vous dire avec des mots quel en est le but ?

Les boutons peuvent également être créés et contrôlés en dehors de votre fenêtre.


qu'est-ce que ça serait ?

Je ne sais pas, mais ça devrait être comme ça : créer dans votre sous-fenêtre, et quand vous cliquez, obtenir le numéro de cette sous-fenêtre. Vous n'avez pas besoin de dessiner quoi que ce soit, juste un bouton qui, lorsqu'il est cliqué, affiche des informations dans Alert sur le numéro de la sous-fenêtre.

 
Vitaly Muzichenko #:

Je ne sais pas, mais c'est ainsi qu'il faut procéder : créer dans votre sous-fenêtre, et lorsque vous cliquez, vous obtenez le numéro de la sous-fenêtre. Vous n'avez pas besoin de dessiner quoi que ce soit, juste un bouton qui, lorsqu'il est cliqué, affiche des informations dans Alert sur le numéro de la sous-fenêtre.

vérifié sur ma première source :

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#include <Controls\Button.mqh>
CButton button;

//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   string short_name = MQLInfoString(MQL_PROGRAM_NAME) + "=Set (" + (string)MASlow + "/" + (string)MAFast + ")";
   IndicatorSetString(INDICATOR_SHORTNAME, short_name);

  // IndicatorSetString(INDICATOR_SHORTNAME, "IndicatorSetString() Demo");
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
   srand(GetTickCount());
   long c_id = ChartID();
   int c_wf = ChartWindowFind();
   Print(c_id, " / ", c_wf);
   button.Create(c_id, "button" + (string)rand(), c_wf, 10, 10, 100, 100);
   button.Text("Button");
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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[])
{
   for(int i = prev_calculated == 0 ? 0 : prev_calculated - 1; i < rates_total; i++)
   {
      Label1Buffer[i] = close[i];
   }
   return(rates_total);
}
//+------------------------------------------------------------------+


hélas, tout est comme vous l'avez écrit - si vous exécutez plusieurs copies de cet indicateur avec les paramètres par défaut, le bouton ne sera que sur le premier indicateur dans une sous-fenêtre.

mais si vous modifiez les paramètres pendant le démarrage, tout est OK


en général, la situation n'est pas claire

 
Igor Makanu #:

Je l'ai vérifié sur ma première source :

hélas, tout est comme vous l'écrivez - si vous exécutez plusieurs copies de cet indicateur avec les paramètres par défaut, le bouton ne sera que sur le premier indicateur dans la sous-fenêtre

mais si vous changez les paramètres pendant le démarrage, tout est OK

en général, la situation n'est pas claire

Voici donc une question : comment modifier les paramètres automatiquement, sans aller dans les réglages ?

Rien ne fonctionne jusqu'à présent ...

---

P.S. Idéalement, mais hélas

input long MASlow = TimeLocal(); //
 
Vitaly Muzichenko #:

Pour l'instant, ça ne marche pas...

Et ça ne le sera pas :

ajouté dans :

int OnInit()
{
   Print(__FUNCTION__);

Je place un indicateur - j'obtiens OnInit dans le journal, mais l'indicateur suivant est déjà silencieux, c'est-à-dire qu'une seule copie de l'indicateur est réellement en cours d'exécution, et les autres indicateurs ne sont qu'une coquille graphique.

 
Igor Makanu #:

et ça ne marchera pas :

ajouté dans :

Je place l'indicateur - j'obtiens OnInit dans le journal, mais l'indicateur suivant est déjà silencieux, c'est-à-dire qu'une seule copie de l'indicateur est réellement en cours d'exécution, et les autres indicateurs ne sont qu'une coquille graphique.

C'est comme ça. Je suppose que l'architecture de mt5 n'est pas bonne. Le terminal mt4 fonctionne bien.

Si vous avez décidé de le faire dans mt5, vous interdisez d'exécuter des copies de l'indicateur avec les mêmes paramètres d'entrée, car il semble être présent mais absent.

 
Vitaly Muzichenko #:

C'est comme ça. L'architecture de mt5 doit être un désordre. Tout fonctionne bien dans mt4.

Si vous avez décidé de le faire dans mt5, vous auriez dû interdire le lancement de copies d'indicateurs avec les mêmes paramètres d'entrée, car il semble être là, mais en fait il ne l'est pas.

La partie calcul de l'indicateur n'est pas la même que la partie graphique. Par conséquent, la partie calcul est la même pour tous. Il en existe plusieurs de type graphique.

Ne pouvez-vous pas simplement rechercher toutes les sous-fenêtres dans un indicateur et mettre des étiquettes avec le numéro de la sous-fenêtre ? En même temps pour attraper dans le timer le nombre de sous-fenêtres du graphique : quand il est augmenté - ajouter à une nouvelle étiquette de sous-fenêtre. Mais cherchez aussi quel indicateur y est placé - s'il est différent, alors n'ajoutez pas...

C'est juste une idée non testée.

ZS. Je ne suis pas d'accord sur la "courbure". Une partie de calcul pour 20 indicateurs identiques est préférable à 20 parties de calcul pour 20 indicateurs identiques.

 
Artyom Trishkin #:

La partie calcul d'un indicateur n'est pas la même que la partie graphique. Par conséquent, la partie calcul est la même pour tous. Il en existe plusieurs de type graphique.

Ne pouvons-nous pas simplement rechercher toutes les sous-fenêtres dans un indicateur, et mettre des étiquettes avec le numéro de la sous-fenêtre ? En même temps pour attraper dans le timer le nombre de sous-fenêtres du graphique : augmenté - ajouter à une nouvelle étiquette de sous-fenêtre. Mais cherchez aussi quel indicateur y est placé - s'il est différent, alors n'ajoutez pas...

C'est juste une idée non testée.

ZS. Je ne suis pas d'accord sur la "courbure". Une partie de calcul pour 20 indicateurs identiques est préférable à 20 parties de calcul pour 20 indicateurs identiques.

En effet, aucune réponse au bouton - la copie OnChartEvent ne se déclenche pas et ne comprend pas le numéro de la sous-fenêtre.

Quoi qu'il en soit, voici ce qui ne fonctionne pas et avec cela le reste du code

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie

FAQ des débutants MQL5 MT5 MetaTrader 5

Igor Makanu, 2021.09.12 21:53

vous ne le faites pas :

ajouté à :

int OnInit()
{
   Print(__FUNCTION__);

Je place un indicateur - j'obtiens OnInit dans le journal, mais l'indicateur suivant est déjà silencieux, c'est-à-dire qu'une seule copie de l'indicateur est réellement en cours d'exécution, et les autres indicateurs ne sont qu'une coquille graphique.


 
Vitaly Muzichenko #:

Did, aucune réaction au bouton - la copie OnChartEvent ne fonctionne pas et ne comprend pas le numéro de sous-fenêtre.

Quoi qu'il en soit, voici ce qui ne fonctionne pas et avec cela le reste du code


MAIS ! !! Si je crée un modèle avec 2-3 de ces indicateurs sous le nom de "Debug.tpl" et que je commence à déboguer l'indicateur, alors OnInit() fonctionne comme il le devrait.

En général, j'ai fait une telle expérience :

J'ai transféré #property à son maximum dans OnInit() en espérant que tant que l'indicateur n'est pas créé, OnInit() s'exécutera et fera un nom court pour l'indicateur, selon le nombre d'indicateurs dans la fenêtre.

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
//#property indicator_label1  "Label1"
//#property indicator_type1   DRAW_LINE
//#property indicator_color1  clrRed
//#property indicator_style1  STYLE_SOLID
//#property indicator_width1  2
//--- indicator buffers
double         Label1Buffer[];
input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА
//input string shortName = "1";  // Префикс…
long chart_id = ChartID();
string short_name = "";
/********************************************************************\
|           Custom indicator initialization function                 |
\********************************************************************/
int OnInit()
 {
//--- indicator buffers mapping
  long windows_total = ChartGetInteger(chart_id, CHART_WINDOWS_TOTAL);
  short_name = (string)windows_total;
  Print(short_name);
  PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_LINE);
  PlotIndexSetInteger(0, PLOT_LINE_COLOR, clrRed);
  PlotIndexSetInteger(0, PLOT_LINE_STYLE, STYLE_SOLID);
  PlotIndexSetInteger(0, PLOT_LINE_WIDTH, 2);
  PlotIndexSetString(0, PLOT_LABEL, "Label1");
  IndicatorSetString(INDICATOR_SHORTNAME, short_name);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

Mais ça n'a pas aidé :

Je commence la première copie

Nom de l'indicateur 2.........

Je lance la deuxième copie - le nom de l'indicateur est toujours 2 pour les deux indicateurs.

Je lance le débogage et qu'est-ce que je vois ! L'indicateur pas encore chargé est déjà en train d'imprimer... lisez la deuxième et la troisième ligne...

Comment est-ce possible ?


La poursuite du débogage s'arrête à l'entrée de OnInit(), la variable windows_total contient des déchets, short_name est toujours une chaîne vide...

Hi......... mais tout est déjà imprimé... comment ça se fait ? ??

Et le nom court a déjà changé.

En conséquence, après un chargement complet de l'indicateur en mode débogage, l'indicateur a les noms suivants

Peut-être devrions-nous attirer l'attention des développeurs sur de tels bugs...

 
Bonjour les amis, je ne suis peut-être pas au bon endroit, mais je vois la section intitulée : "Questions de débutants MQL5 MT5 MetaTrader 5". Ma question est donc la suivante : j'avais l'habitude de télécharger des EA de démonstration à partir du marché pour les tester, maintenant, quoi que je fasse, MT5 ne peut pas télécharger de démo. MT4 sans problèmes, MT5 non, quelle est la raison ?