Mt4 Fin de l'assistance. - page 44

 
Реter Konow:

Maintenant, dites-moi - ai-je accompli la tâche ?

Vous (Pierre et les opposants) abordez la question du mauvais côté ! La tâche peut être effectuée dans les deux sens !

Un assembleur viendra dire qu'il peut le faire encore plus efficacement, et en consommant encore moins de ressources informatiques !

Mais quel est le sens de tout cela ?

À mon avis, nous ne devrions penser à l'efficacité que lorsque nous manquons de vitesse ou de mémoire. Lorsque vous en avez suffisamment, il est plus important qu'il soit facile de maintenir et de modifier le système. Même si cela se fait au détriment de la vitesse du programme et de la mémoire utilisée.

Les noms russes ne me dérangent pas, la seule chose qui me dérange - je suis habitué aux préfixes, de sorte que vous pouvez immédiatement comprendre le type de variable par son apparence. Et l'identifiant russe ou anglais - la différence n'est pas grande (1C - il y a beaucoup de russe).

Mais je suis surtout surpris par le refus volontaire d'un débogueur. C'est juste du masochisme... Je peux comprendre qu'il n'y ait pas de débogueur (à une époque, il n'y avait pas de débogueur sur les données historiques) - il faut se tortiller, émettre des messages de débogage, des journaux... Mais si vous disposez d'un débogueur, il est beaucoup plus pratique et efficace de travailler avec lui !

 
George Merts:

Vous (Pierre et les opposants) abordez la question du mauvais côté ! La tâche peut être effectuée dans les deux sens !

Un assembleur viendra dire qu'il peut le faire encore plus efficacement, et en consommant encore moins de ressources informatiques !

Mais quel est le sens de tout cela ?

À mon avis, nous ne devrions penser à l'efficacité que lorsque nous manquons de vitesse ou de mémoire. Lorsque vous en avez suffisamment, il est plus important qu'il soit facile de maintenir et de modifier le système. Même si cela se fait au détriment de la vitesse du programme et de la mémoire utilisée.

Les noms russes ne me dérangent pas, la seule chose qui me dérange - je suis habitué aux préfixes, de sorte que vous pouvez immédiatement comprendre le type de variable par son apparence. Et l'identifiant russe ou anglais - la différence n'est pas grande (1C - il y a beaucoup de russe).

Mais je suis surtout surpris par le refus volontaire d'un débogueur. C'est juste du masochisme... Je peux comprendre qu'il n'y ait pas de débogueur (à une époque, il n'y avait pas de débogueur sur les données historiques) - il faut se tortiller, émettre des messages de débogage, des journaux... Mais si vous disposez d'un débogueur, il est beaucoup plus pratique et efficace de travailler avec lui !

George, je n'avais aucune idée de comment utiliser un débogueur. Je ne savais même pas ou ne me demandais pas à quoi ça servait. Donc il n'y a pas de masochisme ici. Et maintenant, c'est trop tard.
 

Peter, vous avez substitué la tâche. Votre solution est parfois nécessaire, mais très rarement, et pas uniquement sous cette forme, mais sous une forme similaire.

Plus souvent une tâche différente - l'apparition de nouvelles barres doit être suivie à différents endroits du programme. Par conséquent, passer un symbole et un délai dans des fonctions et les rechercher dans des tableaux n'est pas du tout une bonne solution. Comme la fonction isNewBar possède une variable statique, nous devons faire une copie de la fonction pour chaque symbole de la fenêtre temporelle. Il est possible de passer une variable pour la dernière période de temps dans la fonction par référence.

Mais il existe une variante idéale avec la POO - elle crée son propre objet pour chaque symbole - le délai.

Ceci, si nous ne considérons pas que la fonction isNewBar n'est pas du tout nécessaire, juste pour stéréotyper à partir de rien à faire.

 
Dmitry Fedoseev:

Peter, vous avez substitué la tâche. Votre solution est parfois nécessaire, mais très rarement, et pas uniquement sous cette forme, mais sous une forme similaire.

Plus souvent une tâche différente - l'apparition de nouvelles barres doit être suivie à différents endroits du programme. Par conséquent, passer un symbole et un délai dans des fonctions et les rechercher dans des tableaux n'est pas du tout une bonne solution. Comme la fonction isNewBar possède une variable statique, nous devons faire une copie de la fonction pour chaque symbole de la fenêtre temporelle. Il est possible de passer une variable pour la dernière période de temps dans la fonction par référence.

Mais il existe une variante idéale avec la POO - elle crée son propre objet pour chaque symbole - le délai.

C'est-à-dire, si nous ne considérons pas que la fonction isNewBar n'est pas du tout nécessaire, elle est purement à la poubelle, de rien à faire.

Je n'ai rien changé. J'ai juste résolu cette tâche d'une manière différente. En suivant votre logique, je dois inévitablement en arriver à la nécessité de la POO. Cependant, quelle que soit la façon dont vous voyez les choses, vous pouvez utiliser ma solution en toute sécurité. N'importe quelle fonction, à n'importe quel moment et depuis n'importe quel endroit du programme, accède au tableau global pour un nouvel événement de barre sur n'importe quel symbole et n'importe quelle période de temps.

Le nombre de symboles et d'horizons temporels n'a pas d'importance - dans ma solution, leur nombre n'augmente pas la charge du système. Il suffit de regarder le tableau - qu'il y ait un nouvel événement de bar ou non.

Vous pouvez réduire la liste des symboles si vous ne les prenez pas dans le rapport de marché mais les saisissez manuellement dans le tableau Symbols[]. S'il vous plaît.


Ajouté :

Au fait, veuillez noter que la fonction New_bar() n'existe plus. Il s'est avéré que c'était vraiment inutile. Tu avais raison.

 
Реter Konow:

J'ai été chargé de faire en sorte que je puisse obtenir les événements des nouvelles barres d' un ensemble de symboles, sur un ensemble de délais, sans OOP, et que le code soit court et efficace.

Maintenant dites-moi - ai-je accompli la tâche ?

Absolument OUI. Mais ! !! Il se trouve que ma suggestion était un peu tordue et que, par conséquent, vous l'avez comprise comme vous l'avez comprise. En forex, vous ne vous intéressez qu'aux données dont vous avez besoin ici et maintenant. J'ai besoin des informations pour un symbole et pour la période en cours, c'est tout - les autres ne m'intéressent pas. Nous avons besoin de l'information pour un autre symbole et une certaine période, alors le même code devrait l'obtenir. Et il n'est pas nécessaire de surcharger le système en recevant des informations, qui ne sont pas nécessaires maintenant.

Ce n'est pas ta faute, c'est juste arrivé. J'ai essayé de t'arrêter, mais je n'ai pas pu.

 
Dmitry Fedoseev:

Peter, vous avez substitué la tâche.

Il ne l'a pas changé. C'est la façon dont la phrase a été paraphrasée qui lui a permis de la comprendre ainsi.

 
Alexey Viktorov:

Absolument OUI. Mais ! !! Il se trouve que ma suggestion a été un peu déformée et que, par conséquent, vous l'avez comprise comme vous l'avez comprise. En forex, vous ne vous intéressez qu'aux données dont vous avez besoin ici et maintenant. J'ai besoin des informations pour un symbole et pour la période en cours, c'est tout - les autres ne m'intéressent pas. Nous avons besoin de l'information pour un autre symbole et une certaine période, alors le même code devrait l'obtenir. Et il n'est pas nécessaire de surcharger le système en recevant des informations, ce qui n'est pas nécessaire maintenant.

Ce n'est pas ta faute, c'est juste arrivé comme ça. J'ai essayé de t'arrêter, mais je n'ai pas pu.

Pas de problème, il suffit d'écrire les noms des symboles nécessaires dans le tableau Symbols[].

Supprime l'enregistrement de OnInit() :

   for(int a1 = 0; a1 < All_symbols; a1++)
     {
      Symbols[a1] = SymbolName(a1 + 1,true); 
      //Возможно, нумерация символов в обзора рынка идет с нуля.
      //Тогда: Symbols[a1] = SymbolName(a1,true);
     }

Et initialiser le tableau dans la portée globale :

Symbols[3] = {"EURUSD","AUDUSD","GBPUSD"};

Et supprimer les délais inutiles du tableau Timeframes[] ;

int    Timeframes[3] = {PERIOD_M1,PERIOD_M5,PERIOD_M15};

Changez la variable.

int    All_Timeframes = 3;

Et changez la variable All_Symbols :

int    All_symbols = 3;

De cette façon, vous ne recevrez que les événements relatifs aux bons symboles et aux bonnes échéances.

Ajouté :

Supprimez également le paramètre de taille du tableau dans OnInit(), puisque vous connaissez le nombre de symboles :

   //-------------------------------------------------------------   
   All_symbols = SymbolsTotal(true);
   //---------------------------------------------------------   
   ArrayResize(Symbols,All_symbols);
   //---------------------------------------------------------
   ArrayResize(All_bars_table,All_symbols);
   //---------------------------------------------------------
 
Реter Konow:

Je n'ai rien substitué. J'ai juste résolu ce problème différemment. En suivant votre logique, je devais inévitablement en arriver à la nécessité de la POO. Cependant, quelle que soit la façon dont vous voyez les choses, vous pouvez utiliser ma solution en toute sécurité. N'importe quelle fonction, à n'importe quel moment et depuis n'importe quel endroit du programme, accède au tableau global pour un nouvel événement de barre sur n'importe quel symbole et n'importe quelle période de temps.

Le nombre de symboles et d'horizons temporels n'a pas d'importance - dans ma solution, leur nombre n'augmente pas la charge du système. Il suffit de regarder le tableau - qu'il y ait un nouvel événement de bar ou non.

Vous pouvez réduire la liste des symboles si vous ne les prenez pas dans le rapport de marché mais les saisissez manuellement dans le tableau Symbols[]. S'il vous plaît.


Ajouté :

Au fait, remarquez - la fonction New_bar() a disparu. Il s'est avéré que c'était inutile. Tu avais raison.


Si c'est le cas, comme souligné en gras - dans la poubelle.

 
Dmitry Fedoseev:

Si c'est le cas, comme indiqué en gras, il va dans la poubelle.

Pourquoi ?
 
Реter Konow:

Aucun problème, il suffit d'écrire dans le tableau Symbols[] les noms des symboles que vous voulez et le tour est joué.

Supprime l'entrée de OnInit() :

Et initialiser le tableau dans la portée globale :

Et supprimer les délais inutiles du tableau Timeframes[] ;

Changez la variable

Et changez la variable All_Symbols :

Ainsi, vous ne recevrez que les événements relatifs aux symboles et aux périodes nécessaires.


Peter, arrête. Je n'ai pas besoin d'une autre fonction pour définir une nouvelle barre que la mienne. Il se trouve que tout votre travail est devenu inutile, désolé.