Erreurs, bugs, questions - page 2796

 
Artyom Trishkin:

Mais quand même, vous avez clairement écrit "bug". Cela indique un défaut signalé dans la plate-forme, et non que vous n'avez pas lu la documentation jusqu'à sa conclusion logique.

Eh bien, oui, je l'ai fait. J'ai lu la note dans la description de la fonction ObjectDelete, mais je ne pensais pas que c'était le problème... Qui peut faire ça ?...

Mais tout cela tourne en rond. Pour être plus exact, ça tourne en rond que je l'ai mal écrit ou mélangé... Mais pour une raison quelconque, personne n'a dit un mot sur la façon de résoudre ce bug... Bien sûr, sauf pour la fonction ObjectsDeleteAll suggérée, pour laquelle je devrais refaire tout le projet, ce que je souhaite le moins.

 
Mihail Matkovskij:

Oui, je me suis trompé. J'ai lu la note dans la description de la fonction ObjectDelete, mais je ne pensais pas que c'était le problème... Qui ne le fait pas ?

Ça arrive...

 

Mihail Matkovskij:

... Personne n'a dit un mot sur la façon de résoudre ce bug pour une raison quelconque... Bien sûr, à l'exception de la fonction ObjectsDeleteAll suggérée, pour laquelle je devrais refaire tout le projet, ce que je souhaite le moins.

Essayez d'utiliser un préfixe pour les noms des objets graphiques - c'est une pratique normale pour identifier vos objets. Utilisez le préfixe pour vérifier la présence de déchets et les enlever en même temps.

L'ajout du préfixe aux noms d'objets nécessitera de refaire tout le projet?

Vous écrivez dans un style procédural ? Il n'est pas non plus très difficile de changer les fonctions de création de noms d'objets.

 
Artyom Trishkin:

Essayez d'utiliser un préfixe pour les noms des objets graphiques - c'est une pratique normale pour identifier vos objets. Utilisez le préfixe pour vérifier la présence de déchets et les enlever en même temps.

L'ajout d'un préfixe aux noms d'objets nécessitera de refaire tout le projet ?

Ok, s'il n'y a pas d'autres options, je vais essayer.

Artyom Trishkin:

Vous écrivez dans un style procédural ? Il n'est pas très difficile de modifier la fonction qui crée les noms d'objets.

Une tâche sisyphéenne ? :)


Merci à Rashid Umarov pour son aide à trouver la cause du bug de mon indicateur !
 
Mihail Matkovskij:

N'avez-vous rien d'autre à faire sur ce forum, Alexey, que de déformer mes posts pour les faire passer pour des réclamations aux développeurs en mon nom... ? Je me demande ce qui a suscité cet étrange "enthousiasme" de votre part ? Vous préférez aider les nouveaux venus à répondre à leurs questions dans les fils appropriés plutôt que de faire des bêtises ici... !

C'est pour ça que j'essaie de vous aider. J'essaie de t'aider et de t'expliquer en quoi tu te trompes. Essayez une autre option pour supprimer les objets graphiques et tout ira bien. Et tous les bugs dont vous parliez vont disparaître. Vous n'avez pas besoin de déformer vos mots et je vous citerai.

 
Alexey Viktorov:

C'est pour ça que j'essaie de vous aider. Je vous explique ce sur quoi vous vous trompez. Essayez de supprimer les objets graphiques d'une autre manière et tout ira bien. Et tous les bugs dont vous parliez vont disparaître. Il n'y a pas besoin de déformer vos mots, vous l'avez dit, je l'ai cité.

J'essaie de vous aider et en même temps d'accuser sans fondement, n'oubliez pas d'ajouter. J'ai demandé ce qui provoquait un tel enthousiasme maniaque, mais pour une raison quelconque, vous ne m'avez pas répondu ! Pourquoi éludez-vous la réponse, Alexey ?

 
Mihail Matkovskij:

J'essaie de vous aider et en même temps de vous accuser sans ambages, n'oubliez pas d'ajouter. J'ai demandé ce qui motivait un tel enthousiasme maniaque, mais pour une raison quelconque, vous ne m'avez pas répondu ! Pourquoi évites-tu de répondre, Alexey ?

Tu aurais dû te taire il y a longtemps et je n'aurais pas continué.

Voici ma tentative franche d'aider sans aucun soupçon d'accusation.

Il s'agit du forum pour le trading, les systèmes de trading automatisés et les tests de stratégies de trading.

Erreurs, bugs, questions

Alexey Viktorov, 2020.07.11 17:12

Comment se peut-il que la boucle dure plus longtemps que le temps nécessaire à l'exécution de OnDeinit ?

Après tout, tous les objets de votre exemple ont le préfixe "trend" ; pourquoi ne pas l'utiliser et refuser la boucle ?

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

Quelle est la réponse ? Lisez vos réponses.
 
Alexey Viktorov:

Tu te serais tu depuis longtemps et je n'aurais pas continué.

А... Voilà la raison des accusations portées contre moi ! Je vois... :)

Alexey Viktorov:
Quelle est votre réponse ? Lisez vos réponses.

Tout va bien ici. Le seul problème, c'est que j'ai initialement refusé d'utiliser cette fonction. Et ça a dû t'embarrasser. Eh bien, je suis désolé alors... :)

 

J'ai remplacé la fonction ObjectDeleteAll par la première dans votre exemple :

//+------------------------------------------------------------------+
//|                                           DeleteChartObjects.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"
#property indicator_chart_window

#property indicator_plots 0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

#include <ChartObjects\ChartObjectsLines.mqh>
#include <Arrays\ArrayObj.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- input parameters
input int      nBars = 100000;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int customN_Bars = 0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CArrayObj listOfTrendLines;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  int totalBars = iBars(NULL, PERIOD_CURRENT);
  customN_Bars = (nBars < totalBars) ? nBars : totalBars;
//---
  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[]
) {
  CChartObjectTrend * trend;
  int delta = rates_total - customN_Bars;
  int shift;
  int i;
  for(i = 0; i < customN_Bars; i++) {
    shift = delta + customN_Bars - i - 1;
    trend = new CChartObjectTrend();
    if(trend.Create(0, "trend"+(string)i, 0, time[shift], low[shift], time[shift], high[shift]))
      listOfTrendLines.Add(trend);
    else
      delete trend;
  }
  return(rates_total);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  
  ObjectsDeleteAll(0, "trend", 0, OBJ_TREND);
  
  CChartObjectTrend * trend;
  
  int i = listOfTrendLines.Total() - 1;
  for(; i >= 0; i--) {
    trend = dynamic_cast <CChartObjectTrend *> (listOfTrendLines.At(i));
    
    if(CheckPointer(trend) == POINTER_INVALID)
      continue;
    
    delete trend;
  }
}
//+------------------------------------------------------------------+

Puis dans l'indicateur.

Artyom Trishkin:

L'ajout d'un préfixe aux noms d'objets nécessitera de refaire tout le projet ?

Il s'est avéré que l'utilisation d'ObjectDeleteAll dans mon projet était facile. Pour supprimer tous les objets, il me suffisait de changer le préfixe 3 fois et d'appeler ObjectDeleteAll 3 fois. Le graphique est donc clair. Le langage MQL5 présente de nombreuses subtilités. Mais en même temps, c'est une langue très bien pensée.

Merci à tous ceux qui m'ont aidé à résoudre ce problème !

 
Roman:

Bild 2530

Sur le troisième attachement de la structure, aucun IntelliSense n'apparaît.

L'intelligence IntelliSense continue de faire ses preuves ;))


c'est-à-dire qu'un indice est tout ce sur quoi vous pouvez compter.