Aidez-moi à apprendre à programmer. - page 4

 

Dmitry Fedoseev:
Recalcule à chaque fois, ou ne recalcule pas

Vous n'avez rien compris. Le monde ne s'est pas écroulé avec PositionTotal(). Je fais juste remarquer que c'est mal de le faire.

Dmitry Fedoseev:
Mais au lieu d'apporter une expérience meurtrière

Qu'est-ce qui ne vous plaît pas dans mon expérience ? Le compilateur a-t-il sur-optimisé le résultat du premier appel ?

C'est exactement ce qu'il optimise : for (int i = 0 ; i < 1+2 ; i++) {}

ou ceci : const int X = 1 ;for (int i = 0 ; i < X+2 ; i++) {}

mais ce n'est certainement pas : int X = 1 ; for (int i = 0 ; i < X+1 ; i++) {} parce que je ne suis pas télépathe et que je ne sais pas ce qui peut arriver à ce X - il peut être modifié à l'intérieur de la boucle ou indirectement, par exemple, par un lien/pointeur ? Il fera l'addition 'X+1' pour chaque itération. Même si vous supprimez '+1', le programme utilisera toujours la valeur actuelle de 'X', sauf si ce 'X' est déclaré comme une constante.

Et il ne met certainement pas en cache le résultat renvoyé par la fonction, Karl ! (anticipant ton "what if for (int index=f() ;)") - il n'y a qu'un seul appel ici, à l'initialisation de l'index).

Dmitry Fedoseev:
Et le compilateur - je voulais dire qu'il optimise le code et appelle la variable directement, pas à travers une fonction.

Oui, bien sûr, le compilateur connaît exactement la situation sur le marché et est sûr qu'un appel de fonction renvoie toujours la même valeur, alors pourquoi appeler cette fonction plus d'une fois du tout, il suffit de se souvenir du résultat dans OnInit() une fois et OK !

Et il ne se soucie pas du fait que même dans l'exécution du cycle lui-même, dans votre cas avec PositionsTotal(), certains ordres peuvent être déjà partis - arrêtés, fermés par les mains ou un autre EA - et le reste ne sera pas traité parce qu'ils ont tous soudainement ! obtenu moins ?

Dmitry Fedoseev:
Cela est clairement visible avec la fonction ArraySize() ; vous ne pouvez pas faire la différence entre l'appel de la fonction et l'utilisation d'une variable. Mais ce n'est pas le cas avec PositionsTotsl(), hélas.

Quel est le rapport entre la taille d'un tableau et le nombre de postes actuellement ouverts ? Vous accédez aux éléments du tableau par un index, et bien, par exemple, accédez au tableau [999] avec une taille de 3 éléments. Si ce tableau est en fait un type "intelligent", une classe par exemple avec l'opérateur '[]' où le contrôle de validité est effectué, alors tout va bien. Mais si ce n'est pas le cas ? Quoi qu'il en soit, c'est un exemple classique de shithcode. Pourquoi devrions-nous gazer la flaque d'eau, juste l'admettre et ne pas s'en soucier.

 
Tio Nisla:

Dmitry Fedoseev:
Recalcule à chaque fois, ou ne recalcule pas

Vous n'avez rien compris. Le monde ne s'est pas écroulé avec PositionTotal(). Je fais juste remarquer que c'est mal de le faire.

Dmitry Fedoseev:
Mais au lieu d'apporter une expérience meurtrière

Qu'est-ce qui ne vous plaît pas dans mon expérience ? Le compilateur a-t-il sur-optimisé le résultat du premier appel ?

C'est exactement ce qu'il optimise : for (int i = 0 ; i = 1+2 ; i++) {}

ou ceci : const int X = 1 ;for (int i = 0 ; i = X+2 ; i++) {}

c'est exactement non : int X = 1 ; for (int i = 0 ; i = X+1 ; i++) {} car je ne suis pas télépathe et je ne sais pas ce qui peut arriver à ce X - il peut être modifié à l'intérieur de la boucle ou indirectement par une référence/pointeur, par exemple ? Il fera l'addition 'X+1' pour chaque itération. Même si vous supprimez '+1', le programme utilisera toujours la valeur actuelle de 'X', sauf si ce 'X' est déclaré comme une constante.

Et il ne met certainement pas en cache le résultat retourné par la fonction, Karl ! (anticipant ton "mais si pour (int index=f() ;)") - il n'y a qu'un seul appel ici, à l'initialisation de l'index).

Dmitry Fedoseev:
Et le compilateur - je voulais dire qu'il optimise le code et appelle la variable directement, pas à travers une fonction.

Oui, bien sûr, le compilateur connaît exactement la situation sur le marché et est sûr qu'un appel de fonction renvoie toujours la même valeur, alors pourquoi appeler cette fonction plus d'une fois du tout, il suffit de se souvenir du résultat dans OnInit() une fois et OK !

Et il ne se soucie pas du fait que même dans l'exécution du cycle lui-même, dans votre cas avec PositionsTotal(), certains ordres peuvent être déjà partis - arrêtés, fermés par les mains ou un autre EA - et le reste ne sera pas traité parce qu'ils ont tous soudainement ! obtenu moins ?

Dmitry Fedoseev:
Cela est clairement visible avec la fonction ArraySize(), vous ne pouvez pas faire la différence entre l'appel de la fonction et l'utilisation d'une variable. Mais ce n'est pas le cas avec PositionsTotsl(), hélas.

Quel est le rapport entre la taille d'un tableau et le nombre de postes actuellement ouverts ? Vous accédez aux éléments du tableau par un index, et bien, par exemple, accédez au tableau [999] avec une taille de 3 éléments. Si ce tableau est en fait un type "intelligent", une classe par exemple avec l'opérateur '[]' où le contrôle de validité est effectué, alors tout va bien. Mais que faire si ce n'est pas le cas ? Quoi qu'il en soit, c'est un exemple classique de shithcode. Vous feriez mieux de ne pas essayer de gazer la situation.

S'il n'y a pas de fin en vue à PositionTotal(), vous n'avez pas du tout atteint la cible. Parce que la fonction ArraySize() peut être appelée à chaque répétition de la boucle, et la vitesse ne change pas.

Je ne suis pas satisfait de votre expérience en raison de son absence.

Tous vos autres fantasmes ne sont pas intéressants parce que ce sont des fantasmes (et de plus, ils sont sauvages et très éloignés de la réalité et même faux).

Tu devrais être à la maternelle.

 
Dmitry Fedoseev:

Avec la connaissance de quoi ? S'il s'agit d'un algorithme qui n'existe pas dans la nature, vous devez l'inventer vous-même, et il définit tout.

En sachant comment écrire de manière compétente le bon code dans le langage qui vous intéresse.

Je ne comprends pas, il n'existe pas d'algorithme capable de faire cela ?

Comment recueillir des informations sur les transactions et les utiliser ? J'ai besoin de collecter des informations sur toutes les positions de l'EA, leur volume, leur profit, leur type, leur prix d'ouverture. Et ensuite se référer aux informations sur la position la plus récente, ou la plus importante.

En fait, l'auteur a créé le sujet avec cette question.

Et les cycles et les performances des fonctions ont été discutés par d'autres. Mais il y a aussi ceux qui veulent connaître la meilleure façon ou la bonne façon de faire.

 
Nikolay Mitrofanov:

En sachant comment écrire le bon code de manière compétente dans la langue qui vous intéresse.

Je ne comprends pas, il n'y a pas d'algorithme qui peut faire ça ?

L'auteur a donc créé ce sujet en pensant à cette question.

Et à propos des boucles et de l'exécution des fonctions, d'autres personnes s'y intéressaient. Pour ainsi dire, plus sophistiqués dans la réalisation de tels algorithmes). Mais eux aussi sont ceux qui veulent savoir comment faire mieux ou comment faire bien.

Et donc vous êtes toujours sur la façon de calculer les positions ? Eh bien, je suis désolé.

Intéressant ces sophistiqués, qui veulent toujours savoir... et ne savent toujours pas. Et il s'agit aussi de calculer les positions ?

Désolé encore une fois, si je ne me trompe pas, par l'expression "mise en œuvre d'un algorithme", vous voulez dire une fonction de comptage des positions ? Autrement dit, que vous écriviez PositionsTots() dans une boucle ou que vous utilisiez une variable, vous appelez cela un algorithme ?
 
Dmitry Fedoseev:

Et donc vous êtes toujours en train de parler de la façon de compter les positions ? Eh bien, je suis désolé alors.

Intéressant ces sophistiqués qui veulent toujours savoir... et ne savent toujours pas. Et il s'agit aussi de compter les positions ?

Alors, de quoi discutez-vous si la question est épuisée) ? LOL.

Il y a une tâche pour obtenir les données de position.

Il existe une fonction linguistique permettant d'obtenir le nombre de postes ouverts, qui est utilisée dans la boucle.

La question est de savoir comment l'utiliser correctement dans la boucle : dans le premier paramètre de la boucle for ou par le second - où la condition est vérifiée.

C'est étrange que vous ne compreniez pas ce que vous voulez)))

Vous écrivez que c'est coûteux car le nombre n'est pas constant. Mais pourquoi, vous ne pouvez pas l'expliquer.

Pouvez-vous expliquer pourquoi il est coûteux ?

Je pense personnellement que les développeurs ont fait en sorte que cette fonction ne recalcule pas les positions ouvertes à chaque tick, et ne le fasse que lors de l'ouverture et de la fermeture d'une position.

Pensez-vous que les développeurs n'ont pas pensé à cela ?

Comment pouvez-vous être sûr que la fonction est coûteuse et recalcule, et ne se contente pas de prendre la valeur dans la mémoire du terminal ?

Jusqu'à présent, au lieu d'une réponse substantielle, j'ai lu des bavardages inutiles.

 
Nikolay Mitrofanov:

Alors pourquoi vous disputez-vous si la question est réglée) ? LOL.

C'est l'humour de la situation - pour la deuxième vingt-quatre heures en page quatre un symposium sur la façon de compter les positions. Très intéressant.

 
Dmitry Fedoseev:

Si PositionTotal() n'est pas la seule chose qui compte, alors vous n'avez rien compris. Parce que la fonction ArraySize() peut être appelée à chaque répétition de la boucle, et la vitesse ne change pas.

Je ne suis pas satisfait de votre expérience en raison de son absence.

Tous vos autres fantasmes ne sont pas intéressants, car ce sont des fantasmes (et de plus, ils sont sauvages et très éloignés de la réalité, voire faux).

ArraySize(), si un tableau n'est pas dynamique ou d'un type de classe, c'est déjà une constante lors de la déclaration du tableau lui-même. Mais cela ne veut encore rien dire, car ArraySize(array) et sizeof(array) sont deux grandes différences. Le premier est appelé mais vous ne le voyez pas ; le second est calculé au stade de la compilation.

int arr[5];

PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
ArrayResize(arr, 7);
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));
ArrayResize(arr, 3);
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));

2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: initialized
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: ArraySize(): 3
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: ArraySize(): 7
2021.05.03 22:01:37.252 show_the_shitz EURJPY,H4: ArraySize(): 5
2021.05.03 22:01:37.252 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5

Alors exprimez votre point de vue alternatif ailleurs.

-----------------

Pourquoi est-ce que j'essaie de m'expliquer ? Une personne ne veut pas voir et penser. Très bien, laissez-le générer un code dont l'opération dépend de la phase de la lune, de l'heure moyenne du méridien de Mars et de la démangeaison du talon arrière gauche. Ce qui est dommage, c'est que beaucoup de gens, surtout les novices, copient du code *nouveau* dans leurs projets sans y réfléchir à deux fois et se demandent ensuite ce qui ne va pas.

 
Tio Nisla:

ArraySize(), si le tableau n'est pas dynamique et n'est pas de type classe, c'est déjà une constante lors de la déclaration du tableau lui-même. Mais cela ne veut rien dire non plus, car ArraySize(array) et sizeof(array) sont deux grandes différences. Le premier est appelé mais vous ne le voyez pas ; le second est calculé au stade de la compilation.

Alors exprimez votre point de vue alternatif ailleurs.

-----------------

Pourquoi est-ce que j'essaie de m'expliquer ? Une personne ne veut pas voir et penser. Très bien, laissez-le générer un code dont l'opération dépend de la phase de la lune, de l'heure moyenne du méridien de Mars et de la démangeaison du talon arrière gauche. Ce qui est dommage, c'est que de nombreuses personnes, en particulier les novices, ne réfléchissent même pas à deux fois avant de copier du code *nouveau* dans leurs projets et se demandent ensuite ce qui ne va pas.

C'est un argument qui tue ! Pas de mots... Pourquoi appliquer ArraySize() à un tableau non dynamique ? Je ne peux pas imaginer comment on pourrait y penser. Et qu'est-ce que sizeof() a à voir avec ça ? Tout va bien là-bas ?

Et ce n'est pas mon point de vue, mais un point de vue qui a été vérifié depuis longtemps par les participants au forum. Mais je ne chercherai pas ce fil.

Mais je peux vous dire que cela n'a rien à voir avec la mise en cache.

 
Nikolay Mitrofanov:

Pour moi, je pense que c'est bien qu'une personne essaie de comprendre et creuse plus profondément...

En ne prêtant pas attention aux petites choses, le codeur prend alors l'habitude d'écrire le code de la mauvaise manière. Et puis peigner le code signifie un double travail et souvent non seulement pour l'auteur mais aussi pour ceux qui ont encore la chance de travailler avec le code.

Pourquoi s'embêter à écrire du code quand on peut le faire correctement, l'écrire bien et en comprendre les détails) ?

Votre conseil est... eh bien... IMHO


Votre conseil est bon pour un programmeur expérimenté (très confiant) qui peut alors le passer au peigne fin, car il sait où et ce qui doit être passé au peigne fin.

Fedoseyev a raison. Vous n'êtes pas obligé de le faire, et il vous faudra un certain temps pour peigner le code comme vous le souhaitez. Mais on comprend avec le temps qu'il vaut mieux écrire quelque chose de nouveau. Ainsi, chaque nouveau code sera d'abord passé au peigne fin.

 

Réalités intéressantes du forum. Quand quelqu'un demande quelque chose, personne n'écrit une ligne de code. Mais dès qu'ils le font, ils viennent, s'alignent et commencent à taper - ah, ah, ah, quel mauvais code. Et ce qui est intéressant, c'est que cela concerne généralement un code aussi simple que trois kopecks. Chaque espace est examiné de près. Quant à quelque chose de plus compliqué, il y a le silence, aussi sourd qu'un tank.