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

 
Vladimir Karputov #:

Dans OnDeinit vous devriez faireObjectsDeleteAll- supprimer par préfixe (dans votre cas le préfixe est "HLine")

Sur quelle ligne faut-il écrire "HLine" ?

 
Green handsome #:

Dans quelle ligne faut-il écrire "HLine" ?

Qu'est-ce qui n'est pas clair ?

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

FAQ des débutants MQL5 MT5 MetaTrader 5

Vladimir Karputov, 2021.09.10 15:53

Vous devez faireObjectsDeleteAll dans OnDeinit - supprimer par préfixe(dans votre cas, le préfixe est "HLine").

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   );


 
Vladimir Karputov #:

Qu'est-ce qui n'est pas clair exactement ?


int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string      HLine,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   
   );

Ici, je l'ai fait, il ne veut toujours pas le supprimer.

 
void OnDeinit(const int reason)
  {
     {
      ObjectsDeleteAll(0,prefix,0);
     }
//---
   //ChartRedraw();
  }

le préfixe contient les noms des étiquettes graphiques

Vous savez ce que signifie le préfixe ?

 
Fast235 #:

le préfixe contient les noms des étiquettes graphiques

Vous savez ce que signifie le préfixe ?

Je ne connais pas du tout MQL.... Je me suis dit que j'allais juste corriger quelques lignes et c'est tout.

 
Green handsome #:

Je ne connais rien du tout aux MQL..... Je me suis dit que j'allais juste corriger quelques lignes et c'est tout.

le code ci-dessus devrait aider, sinon regardez le préfixe avec lequel les objets sont créés

 

Quelle est la raison pour laquelle le nom court n'est pas affiché dans la sous-fenêtre dans le coin supérieur gauche?


De plus, si je charge un indicateur sur le graphique, la deuxième copie ne fonctionne plus - OnInit() = rien n'est déclenché et il n'y a pas d'impression. Mais si je change les "paramètres d'entrée" pour d'autres, cela fonctionne.

#property indicator_separate_window

#property indicator_plots 0

input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА

//+------------------------------------------------------------------+
string prog_name,short_name;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
{
  prog_name=MQLInfoString(MQL_PROGRAM_NAME);
  short_name="=Set ("+(string)MASlow+"/"+(string)MAFast+")";
  IndicatorSetString(INDICATOR_SHORTNAME,short_name);
  Print("INIT_SUCCEEDED");
  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[])
{
//---

//--- return value of prev_calculated for next call
  return(rates_total);
}

---

Quel est le problème, dans mt4 ce code fonctionne.

 
Vitaly Muzichenko #:

Quelle est la raison pour laquelle le nom court n'est pas affiché dans la sous-fenêtre dans le coin supérieur gauche?


De plus, si je charge un indicateur sur le graphique, la deuxième copie ne fonctionne plus - OnInit() = rien n'est déclenché et il n'y a pas d'impression. Mais si je change les "paramètres d'entrée" pour d'autres, cela fonctionne.

---

Quel est le problème, dans mt4 ce code fonctionne.

Peut-être que c'est juste parce que c'est trop court ? Pas de mapping, pas de buffers... Pourquoi faire une deuxième copie d'un tel indicateur, pour que le terminal soit arbitraire...

 
Vitaly Muzichenko #:

Quelle est la raison pour laquelle le nom court n'est pas affiché dans la sous-fenêtre dans le coin supérieur gauche?


De plus, si je charge un indicateur sur le graphique, la deuxième copie ne fonctionne plus - OnInit() = rien n'est déclenché et il n'y a pas d'impression. Mais si je change les "paramètres d'entrée" pour d'autres, cela fonctionne.

---

Ce qui est faux, ce code fonctionne dans mt4.

J'ai eu un problème avec lui aussi, mais j'ai construit l'indicateur, tout est OK.

#property copyright "Copyright 2021, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#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;  // Период быстрой МА
//+------------------------------------------------------------------+
//| 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);
   SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+

Je pourrais le commenter pour savoir quand il arrête d'écrire le nom de l'indicateur dans la sous-fenêtre .... mais trop paresseux

 
Igor Makanu #:

il manque quelque chose - probablement une sorte de propriété, j'ai aussi été confronté à ce problème, mais ici j'ai esquissé l'indicateur, tout est OK

vous pouvez le commenter pour rechercher le moment où il arrête d'écrire le nom de l'indicateur dans la sous-fenêtre... mais paresseux

Les données sont affichées, mais d'où viennent-elles, si la fonctionOnInit() n'a pas fonctionné ? Nous lançons une copie sur le graphique et OnInit() peut être déclenché par accident, mais si c'est une autre copie, c'est tout, il n'y a même pas d'impression. Mais si nous changeons les paramètres d'entrée - alors cela fonctionne.

#property copyright "Copyright 2021, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#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


input int MASlow = 21; // Период медленной МА
input int MAFast = 8;  // Период быстрой МА

//+------------------------------------------------------------------+
int wndNum;
string short_name;
double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
  short_name="Set ("+(string)MASlow+"/"+(string)MAFast+")";
  IndicatorSetString(INDICATOR_SHORTNAME,short_name);
  wndNum=ChartWindowFind();
  Print("INIT SUCCEEDED: "+(string)wndNum);
  SetIndexBuffer(0, Label1Buffer, INDICATOR_DATA);
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
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);
}

---

Quelle est la solution, pourquoi OnInit ne fonctionne pas ?

Raison: