Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 207

 

Bonjour à tous. J'ai besoin d'aide.

Dans mon EA, il ouvre des séries d'ordres en nombre donné par le paramètre MaxOrders, ci-dessous j'ai donné un exemple de ce à quoi cela ressemble, ne jugez pas par lots.

1-lot d'ordre=128

2-lot-ordre-lot=256

Ordre de 3 lots=512

Lot de 4 ordres = 1024

5-lot d'ordre=2048

c'est ce dont vous avez besoin pour votre testeur.

MaxOrders=5, et 5 ordres sont ouverts. Le problème est que dans le testeur du courtier, le lot limité à 1000 est 4 et 5 ordres ne s'ouvrent pas comme requis.

J'ai parcouru l'Internet à la recherche d'un moyen de modifier ce paramètre dans le testeur de stratégie, mais je n'ai pas réussi à trouver comment le faire.

J'ai donc décidé de résoudre ce problème en utilisant la programmation. J'ai décidé d'ouvrir plusieurs commandes pour 4 commandes et obtenir deux

4 lots d'ordre = 1000

Lot de 4 ordres = 24

pour 5 commandes 3 :

5-lots d'ordre=1000

5-lots d'ordre=1000

lot de 5 ordres = 48

mais il y a deux problèmes,

- comment diviser correctement le MM pour qu'il soit divisé en lots selon le lot maximal

- Comment ouvrir des ordres supplémentaires sans perturber l'ordre, c'est-à-dire qu'il y aura plus d'ordres que dans maxOrders mais ne pas considérer les ordres supplémentaires qui sont ouverts pour garder le volume.

 
solnce600:

Alexei ! Bonjour !

Notre communication ne sort pas de ma tête...... et voici pourquoi.....

J'ai entendu plus d'une fois des commentaires sur l'absence de logique dans mon codage.

Hier, vous m'avez expliqué que cela signifiait l'algèbre de Boole. Ce sujet est très vaste et très profond.

Le fait est que je ne suis pas un mathématicien et certainement pas un algébriste.

Je comprends certaines choses mathématiques pas si compliquées.... , mais pas tout de suite et des choses complexes que mon cerveau ne perçoit pas du tout.

Il y a plus de six mois, avant de commencer à étudier le manuel de programmation MCL, je me suis demandé

si je pouvais le comprendre sans compétences mathématiques.

Mais M. Kozlov, dans la préface de son manuel, affirme que c'est en fait beaucoup plus simple qu'il n'y paraît à première vue.

à première vue.

Et en effet, 60-70% de son tutoriel, je pense que je suis maintenant capable de comprendre (probablement pas la première fois) et par conséquent je peux déjà coder quelque chose.

Jusqu'à hier, il me semblait que tous les calculs mathématiques complexes (que je ne peux pas comprendre) font le programme, et que je n'ai besoin que de connaître les règles qui permettent de les réaliser.

le programme fonctionne et fait les calculs.

Mais notre conversation d'hier m'a amené à l'idée que si je n'apprends pas l'algèbre de Boole, mes codes seront dépourvus de logique.

Si mes codes manquent de logique booléenne, mes programmes ne fonctionneront pas correctement, ou ne fonctionneront pas du tout.

Mais j'ai jeté un coup d'œil à Wikipédia hier et je me suis rendu compte que l'algèbre booléenne et probablement la logique - ne sont pas faites pour mon esprit !

Hier, vous avez rapidement déduit d'un coup d'œil rapide sur un fragment de mon code qu'il manque de logique booléenne.

Si vous le voulez bien, pourriez-vous expliquer le cheminement de votre raisonnement, qui a précédé votre conclusion sur l'absence de logique dans ce fragment.

Si je le comprends, je passerai à autre chose. Si je ne le comprends pas..... j'en conclurai probablement que la programmation est quelque chose qui dépasse largement mes capacités.

Merci.

si (ot==0)
si (Bid==Prix)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))
if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

Andrei, ce n'est pas si tragique que ça ! Utilisez ce que vous comprenez ! Tout le reste viendra en temps voulu !

Par exemple, après avoir vérifié la fermeture par stop en utilisant la fonction de Kim, vous devez introduire une variable supplémentaire Lots et avant d'ouvrir une nouvelle position avec un lot doublé, vous devez écrire la ligne suivante : Lots = Lot*2.0 et c'est tout ! Et vous mettez un Lot normal, où vous n'avez pas besoin de doubler !

Pourquoi faut-il des codes complexes pour des choses simples ? Au nom de la science, pour que personne ne puisse les comprendre ? Une sorte de protection contre le "plagiat" !

 
borilunad:

Andrei, ce n'est pas si tragique que ça ! Utilisez ce que vous comprenez ! Tout le reste viendra en temps voulu !

Par exemple, après avoir vérifié la fermeture par stop, vous devez introduire une variable supplémentaire Lots, et avant d'ouvrir une nouvelle position avec un lot doublé, vous devez écrire la ligne suivante : Lots = Lot*2.0 et c'est tout ! Et vous mettez un Lot normal, où vous n'avez pas besoin de doubler !

Pourquoi faut-il des codes complexes pour des choses simples ? Au nom de la science, pour que personne ne puisse les comprendre ? Une sorte de protection contre le "plagiat" !

Boris ! Merci pour tes encouragements. Tu m'as un peu calmé. ....

Mais je souffre toujours de remarques répétées sur le manque de logique de mes codes.

Et ce qui m'énerve le plus, c'est que je n'arrive pas à comprendre de quoi il s'agit exactement.

Il me semble que l'absence de logique booléenne dans le code est importante.

Mais comment savoir si elle existe ou non ?

Alexey m'a dit que je pourrais avoir des problèmes à cause de ce fragment (bien que le testeur soit OK).

si (ot==0)

si (Bid==Prix)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

En cas d'erreur de codage, tout est clair - soit MetaEditor me le dira, soit Terminal Log.

Et si je manque de logique ......., comment puis-je le savoir ? Seulement grâce aux conseils de collègues plus expérimentés.

Mais même après qu'ils m'aient incité à le faire, je ne comprends pas de quoi il s'agit exactement.

Étudier l'algèbre de Boole est irréel pour moi.

 

Oubliez cette algèbre booléenne et ne la remettez plus sur le tapis.

Une anecdote :

Un professeur psychiatre a visité un hôpital pour malades mentaux et a demandé au médecin-chef comment ils déterminent si un patient a guéri ou est toujours malade.

- On remplit la baignoire d'eau, on pose une tasse à thé avec une cuillère sur le bord et on propose au patient de retirer l'eau.

- Nous devons supposer que si le patient va bien, il prend la tasse et non la cuillère ?

- Si le patient est en bonne santé, il débranche la baignoire.

* * *

Vous devriez être en mesure de répondre à votre propre question, à savoir si les actions que vous essayez de faire en code sont raisonnables, et ce n'est pas une question si difficile.

Open[1]-Close[1] peut être négatif. Ainsi, pour le cas de Close>Open, il existe une option, pour le cas de Close<Open, il existe une autre option. Ou bien vous devez calculer la taille du corps de manière à ce qu'elle ne dépende pas de la direction de la bougie.

 
solnce600:

Boris ! Merci pour ton soutien. Tu m'as un peu calmé. ....

Mais on m'a toujours dit qu'il n'y avait pas de logique dans mes codes.

Et ce qui m'énerve le plus, c'est que je n'arrive pas à comprendre de quoi il s'agit exactement.

Il me semble que l'absence de logique booléenne dans le code est importante.

Mais comment puis-je savoir s'il y en a une ou non ?

Alexey a dit qu'il est absent de ce fragment et que je pourrais avoir des problèmes à cause de ce fragment (bien que le testeur soit OK).

si (ot==0)

si (Bid==Prix)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

En cas d'erreur de codage, tout est clair - soit MetaEditor me le dira, soit Terminal Log.

Mais si je manque de logique ......., comment puis-je le savoir ? Seulement grâce aux conseils de collègues plus expérimentés.

Mais même après leurs conseils, je ne comprends pas ce dont je parle.

Apprendre l'algèbre de Boole est irréel pour moi.

"D'abord, je vais rendre votre code lisible, supprimer les parenthèses et les conditions inutiles, et ensuite vous pourrez me dire pourquoi vous avez besoin de ces conditions !".

if (ot==0)                    //если Buy, значит эти условия для закрытия или модификации?!

if (Bid==Price)               //это не будет работать на Реале! 
                              //Надо так: (Bid>=Price) или (Bid<=Price) в зависимости от направления
if(Open[1]-Close[1]>100*Point && Open[1]-Close[1]<120*Point)
if(High[1]-Open[1]>40*Point && High[1]-Open[1]<60*Point)  

if(Close[1]-Low[1]>40*Point && Close[1]-Low[1])<60*Point) 

 
borilunad:

" D'abord, je vais rendre votre code lisible, supprimer les parenthèses inutiles et les conditions superflues, puis vous me direz pourquoi vous avez besoin de ces conditions ! ".

Je vous dis pourquoi j'ai besoin de ces conditions inutiles.

J'ai besoin des conditions que vous avez envoyées au four, pour que le programme calcule les paramètres spécifiques de la bougie avec un écart de 1 point.

C'est-à-dire un chandelier baissier avec une taille spécifique de son corps, avec une taille spécifique entre les prix d'ouverture et de fermeture, avec la taille spécifique de la distance entre les prix d'ouverture et de fermeture.

Si je ne me trompe pas, vous pouvez également utiliser NormalizeDouble (MathAbs ()) à cette fin, mais je n'ai pas remarqué de différence entre cette version et celle que j'ai utilisée.

 
solnce600:

Je te dis pourquoi j'ai besoin de ces conditions supplémentaires.

Les conditions que vous m'avez envoyé au four, j'ai besoin du programme pour calculer les paramètres spécifiques de la bougie +, - 1 point.

C'est-à-dire un chandelier baissier avec une taille spécifique de son corps, avec une taille spécifique entre les prix d'ouverture et de fermeture, avec la taille spécifique de la distance entre les prix d'ouverture et de fermeture.

Si je ne me trompe pas, vous pouvez également utiliser NormalizeDouble (MathAbs ()) à cette fin, mais je n'ai pas remarqué de différence entre cette version et celle que j'ai utilisée.

Alors voir ci-dessus, corrigé !
 
Integer:

Oubliez cette algèbre booléenne et ne la remettez plus sur le tapis.

Une anecdote :

Un psychiatre a visité un hôpital pour malades mentaux et a demandé au médecin-chef comment ils déterminent si un patient s'est rétabli ou est toujours malade.

- On remplit la baignoire d'eau, on pose une tasse à thé avec une cuillère sur le bord et on propose au patient de retirer l'eau.

- Nous devons supposer que si le patient va bien, il prend la tasse et non la cuillère ?

- Si le patient est en bonne santé, il tire le bouchon de la baignoire.

* * *

Vous devriez être en mesure de répondre à votre propre question, à savoir si les actions que vous essayez de faire en code sont raisonnables, et ce n'est pas une question si difficile.

Open[1]-Close[1] peut être négatif. Ainsi, pour le cas de Close>Open, il existe une option, pour le cas de Close<Open, il existe une autre option. Ou bien vous devriez calculer la taille du corps de manière à ce qu'elle ne dépende pas de la direction de la bougie.

Merci pour l'anecdote.....à partir de maintenant, je vais essayer de ne penser qu'à la prise.

Mais tout de même ... lorsque des personnes réputées de cette branche disent à plusieurs reprises et simultanément l'absence de logique dans mon code.... comme il s'avère plus tard l'algèbre de Boole - il signifie cracher sur l'autorité des professionnels sérieux de cette branche..... je ne vais pas immédiatement se lever à elle.... et mai ne pas se lever du tout..... je n'ai pas encore essayé.

 
borilunad:
Alors voir ci-dessus, corrigé !

J'ai donc eu beaucoup de parenthèses supplémentaires ? Sont-ils dangereux ?

Eh bien, si le compilateur ne me donnait pas d'erreur lorsque je saisissais ces parenthèses ...., je pensais que tout était OK.

Jusqu'à récemment, je pensais que si le compilateur ne se plaignait pas et que l'EA fonctionnait dans le Strategy Tester conformément à son code, alors c'était définitivement OK.

On dirait que ce n'est pas tout à fait le cas......

 
solnce600:

Boris ! Merci pour votre soutien. Vous m'avez un peu calmé. ....

Mais on m'a quand même fait remarquer à plusieurs reprises le manque de logique de mes codes.

Et ce qui m'énerve le plus, c'est que je n'arrive pas à comprendre de quoi il s'agit exactement.

Il me semble que l'absence de logique booléenne dans le code est importante.

Mais comment puis-je savoir s'il y en a une ou non ?

Alexey a dit qu'il est absent de ce fragment et que je pourrais avoir des problèmes à cause de ce fragment (bien que le testeur soit OK).

si (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

En cas d'erreur de codage, tout est clair - soit MetaEditor me le dira, soit Terminal Log.

Mais si je manque de logique ......., comment puis-je le savoir ? Seulement grâce aux conseils de collègues plus expérimentés.

Mais même après leurs conseils, je ne comprends pas ce dont je parle.

Étudier l'algèbre de Boole est irréel pour moi.


Il n'est pas nécessaire d'être un expert en algèbre booléenne pour énoncer clairement les termes...

Laissez-moi vous rendre les choses un peu plus faciles... Remplacez if par l'habituel if, else par otherwise, && par and, || par or , etc.... Vous pourrez alors lire dans vos propres mots normaux ce qui est écrit ou décider de ce que vous voulez écrire.

Ce que vous avez écrit (passons pour l'instant sur la description incorrecte des conditions) :

1. if (ot==0) S'il n'y a pas d'ordres de marché (ni ordres de marché du tout, ni en attente, ni ouverts par cet EA, un autre EA ou manuellement)... Si oui, alors la ligne 2 est exécutée, si non, alors nous passons à la ligne 3.

2. if (Bid==Price) Si le prix est égal au prix d'ouverture de la bougie actuelle... Si c'est le cas, la ligne 3 est exécutée, sinon, nous passons à la ligne 4.

3. if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point)) Si le prix d'ouverture de la première bougie est supérieur au prix de clôture de la première bougie de plus de 100 points et de moins de 120 points... Si c'est le cas, passez à la ligne 4, sinon, passez à la ligne 5.

4. if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point)) Si le haut de la première bougie est supérieur au cours d'ouverture de la première bougie de plus de 40 points et de moins de 60 points... Si c'est le cas, nous exécutons la ligne 5, sinon, nous passons à la ligne 6.

5. if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point)) Si la clôture de la première bougie est supérieure au bas de la première bougie de plus de 40 points et de moins de 60 points. Si c'est le cas, la ligne 6 est exécutée, sinon, passez à la ligne 7.

6.

7.

Comme vous pouvez le voir dans cette décomposition, soit vous faites exécuter toutes les lignes de code l'une après l'autre (dans le cas où chaque ligne renvoie vrai), soit vous sautez la ligne qui vient après la ligne qui renvoie faux.

Pour éviter toute confusion dans vos termes, et pour composer correctement votre logique, enfermez toutes les déclarations entre accolades, qu'il s'agisse d'une seule ligne à exécuter après la valeur de vérité, ou d'un bloc entier.

Par exemple :

if (ot==0) {
   if (Bid==Price) {
      // сюда можно вписать целый блок, который будет исполняться лишь при одном условии, что bid==Price
      // только вот вряд ли он когда-либо исполнится в реале
      }
   }
Essayez donc de décomposer votre code en composants, en supprimant les parenthèses supplémentaires, qui sont inutiles dans ce cas...
Raison: