Séquence d'exécution de Init() et DeInit() - page 25

 
Alexey Viktorov:

Dimitri, vous me semblez être un programmeur cultivé. On ne vous a pas appris les règles de l'étiquette en programmation ?

Pour le reste, vous pouvez écrire comme dans l'ancienne mql4 avec la possibilité de dépassement de tableau et d'autres hypothèses. Vous obtenez une erreur en réponse... Eh bien, signalez le retour... Continuons, nous n'avons pas le temps... Et puis vous rencontrez un problème qui ne vaut rien dans un langage plus strict et vous commencez à blâmer les développeurs...

Le Christ est ressuscité.


Lorsque vous créez un objet existant, rien de terrible ne se produit, rien de terrible non plus, l'objet n'est pas créé et c'est tout.
 
Nikolai Semko:

Je pense que je vais aussi ajouter une solution plus tard, mais sans utiliser les variables globales du terminal et des fichiers, et avec la possibilité d'appliquer plusieurs indicateurs identiques dans une fenêtre.

À propos, c'est une tâche intéressante que d'écrire une fonction qui produit une valeur différente pour chaque ensemble différent de paramètres d'entrée de l'indicateur.

La première chose que j'ai trouvée est ChartSaveTemplate.


Renoncer à l'échelle mondiale - apparemment, aux ressources.

 
fxsaber:

À propos, c'est une tâche intéressante que d'écrire une fonction qui produit une valeur différente pour chaque ensemble différent de paramètres d'entrée de l'indicateur.

La première chose qui m'est venue à l'esprit est le recours à ChartSaveTemplate.


Pour renoncer aux globaux - apparemment des ressources.


Bien sûr, les ressources - elles me semblent la meilleure solution, car elles sont invisibles, contrairement aux variables globales et aux fichiers du terminal, et rapides. De plus, vous pouvez faire passer des tableaux à travers eux, tout comme à travers des fichiers, mais plus rapidement, car tout se passe en RAM. Ils appartiennent également à la fenêtre, et non au terminal, comme dans le cas du global. De plus, vous pouvez créer une ressource pour tous les mêmes indicateurs dans une fenêtre.

Non, je pense que ChartSaveTemplate est trop encombrant. Je vais essayer de créer une ressource commune pour toutes les instances d'un même indicateur sans utiliser de modifications globales, de modèles et de fichiers.

 
Nikolai Semko:

Mon exemple a été créé pour montrer le problème d'une séquence ambiguë de l'unité de la nouvelle TF et de l'unité de l'ancienne TF, et non comme une solution.

Vous avez juste contourné le problème, vous ne l'avez pas résolu.
Dans mon exemple, il est juste important de supprimer l'objet dans l'Unité de l'ancien TF dans tous les cas, y compris lorsque le TF est modifié, et que dans l'Unité du nouvel objet il est créé à nouveau.

Si la séquence est d'abord Deunit de l'ancienne TF, puis Unit de la nouvelle TF, comme cela devrait logiquement être le cas. L'objet est ensuite supprimé, puis recréé.

Si la séquence est d'abord l'Unité du nouveau TF et ensuite la Deunité de l'ancien TF, alors l'objet est simplement modifié lorsque vous essayez de le créer dans l'Unité, car il n'est pas encore supprimé. Et ensuite, il est supprimé par le Deunit de l'ancien TF. C'est le bug.

C'était le but de cet exemple - montrer ce que peut rencontrer tout programmeur qui n'a pas lu cette branche et qui n'est pas au courant de cette "fonctionnalité".
Cet exemple n'a pas été conçu comme une solution. Des variantes de la solution sont présentées ici et ici. Je pense que je vais aussi ajouter une solution plus tard, mais sans utiliser les variables et fichiers globaux du terminal et pour que cette solution fonctionne même si plusieurs indicateurs identiques sont définis dans une fenêtre. Avez-vous essayé de résoudre ce problème ? Ou bien vous êtes seulement capable de trouver des erreurs dans le code des autres, surtout quand elles ne sont pas là.


C'est un péché de jurer aujourd'hui, mais j'en ai envie...

Je n'ai même pas pu lire tes bêtises jusqu'au bout.

Je le répète encore une fois, ne créez pas un problème là où il n'y en a pas.

La réponse à toutes vos questions dans votre code était ici

Alexey Viktorov:

Quel est l'intérêt d'utiliser l'exemple primitif de la rue à double sens ?

Vous feriez mieux d'utiliser un exemple de code presque correct .

Je ne comptais pas sur l'absolutisme.

C'est tout... Va-t'en Satan, ne me conduis pas au péché.

 
Alexey Viktorov:

C'est un péché de jurer aujourd'hui, mais j'en ai envie...

Je n'ai même pas pu lire tes bêtises jusqu'au bout.

Je le répète, ne mettez pas le problème là où il n'existe pas.

La réponse à toutes les questions de votre code était ici.

Je ne comptais pas sur des absolus.

C'est ça... Satan, va-t'en, ne nous mène pas au péché.


Oh, mec, tu as besoin d'aller sur un autre forum. Où les psychothérapeutes donnent des conseils. Je comprends, je comprends. Déficit d'amour chez les enfants, ils veulent de l'attention et de l'amour. Je suis désolé. Je vous aiderai si vous avez besoin de quelque chose. Vous pouvez m'écrire en personne. Je ne plaisante pas.

Et vous feriez mieux de ne pas le faire ici, parce que nous avons trop amusé les gens.

LA RÉSURRECTION EN EFFET !

 

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

Séquence d'exécution de Init() et DeInit()

fxsaber, 2017.04.14 13:52

Un peu de tipster's tipster's tipster's tipster's tipster's tipster's tipster's tipster's tipster's
Aucune plainte aux développeurs.
Cool comment faire ! Exécuter
#property indicator_chart_window
#property indicator_plots   0

void OnInit()
{
  Print(__FUNCTION__ + (string)ChartIndicatorGet(0, 0, MQLInfoString(MQL_PROGRAM_NAME)));
}

void OnDeinit( const int Reason )
{
  Print(__FUNCTION__);
}

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[])
{
  return(rates_total);
}

Et changez le TF. Il n'y aura pas un seul Deinit ! Tous les indicateurs passeront inaperçus et consommeront des ressources. Et je voulais juste

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

Bugs, bugs, questions

fxsaber, 2016.09.22 16:14

Comment connaître ma poignée sur un graphique dans un indicateur ? Le passage parChartIndicatorName ne convient pas car il renvoie un nom court. Et avec le même nom, il se peut que le même indicateur fonctionne déjà avec des paramètres d'entrée différents.

Il s'avère que si vous voulez connaître son handle, vous devez utiliser ChartIndicatorGet, mais comme le montre l'exemple ci-dessus, ce sera un vrai problème - l'indicateur sera désinstallable.

Quelle déception.


Je ne peux même pas faire ça.

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

Bugs, bugs, questions

fxsaber, 2016.09.23 10:20

Comment puis-je connaître monINDICATOR_SHORTNAME ? Les fonctions IndicatorGet* n'existent pas !

L'indicateur ne permet pas de savoir quelle sous-fenêtre a été touchée. Ce n'est qu'un tas de nullités.

 
fxsaber:

L'indicateur ne permet pas de savoir dans quelle sous-fenêtre il se trouve. Ce n'est qu'un tas de nullités.

https://www.mql5.com/ru/docs/chart_operations/chartwindowfind
Документация по MQL5: Операции с графиками / ChartWindowFind
Документация по MQL5: Операции с графиками / ChartWindowFind
  • www.mql5.com
Операции с графиками / ChartWindowFind - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
Un petit truc sympa ! Exécuter

Et changez le TF. Il n'y aura pas un seul Deinit ! Tous les indicateurs passeront inaperçus et consommeront des ressources. Et je voulais seulement

Il s'avère que si vous voulez connaître son handle, vous devez utiliser ChartIndicatorGet, mais, comme le montre l'exemple ci-dessus, ce sera une vraie déception - l'indicateur sera indélébile.

Il deviendra irrécupérable.

J'ai fait face à une telle chose. Les développeurs ont conseillé de lire l'aide plus attentivement car il y a un exemple :

//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
   //--- количество окон на графике (всегда есть хотя бы одно главное окно) 
   int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); 
   //--- про ходим по окнам 
   for(int w=0;w<windows;w++) 
     { 
      //--- сколько индикаторов в данном окне/подокне 
      int total=ChartIndicatorsTotal(0,w); 
      //--- переберем все индикаторы в окне 

      for(int i=0;i<total;i++) 
        { 
         //--- получим короткое имя индикатора 
         string name=ChartIndicatorName(0,w,i); 
         //--- получим хэндл индикатора 
         int handle=ChartIndicatorGet(0,w,name); 
         //--- выведем в журнал 
         PrintFormat("Window=%d,  index=%d,  Name=%s,  handle=%d",w,i,name,handle); 
         //--- обязательно освобождаем хендл индикатора, как только он становится ненужным 
         IndicatorRelease(handle); 
        } 
     } 
  }
Toutefois, ils ont ensuite ajouté que ce comportement serait "corrigé". Mais apparemment, il est toujours en cours d'ajustement.
 
Alexey Kozitsyn:
https://www.mql5.com/ru/docs/chart_operations/chartwindowfind

Merci, mais il y a la même limitation - il n'y a aucun moyen sans un nom court (comment le connaissez-vous ?).

 
Alexey Kozitsyn:

Je suis tombé sur quelque chose comme ça. Les développeurs m'ont conseillé de lire plus attentivement l'aide car il y a un exemple :

Il a toutefois ajouté que ce comportement serait "corrigé". Mais apparemment, il est toujours en cours d'ajustement.

Cela m'a vraiment aidé, merci !

L'essentiel est de ne pas faire IndicatorRelease dans Deinit.

Raison: