les aventures d'un débutant - page 7

 
niko:

A CB :


Hey high flyer ! J'ai fait tout ce que je pouvais avec les tâches de Tim et j'ai donc décidé de commencer à regarder ton code plus en détail.


J'ai parcouru ton code, en essayant de comprendre et de corriger les erreurs qu'il contient. J'ai réussi à réduire les erreurs à "parenthèses non équilibrées" pour la chaîne fnGenerateSignal(). Je ne sais pas pourquoi il est question de déséquilibre dans ce cas.


Comme toujours, j'apprécierais vos commentaires sur mes progrès avec votre code ! Gardez à l'esprit qu'il y a encore beaucoup de choses que je ne comprends pas, même les choses les plus basiques.

Voir les annotations.

J'ai remarqué ce qui suit :

- vous déclariez les fonctions pour qu'elles attendent des variables qui leur soient passées comme paramètres, mais vous ne les passiez pas réellement à l'appel de la fonction - donc je vous ai demandé de déplacer les variables vers le bloc supérieur pour qu'elles soient disponibles à toutes vos fonctions pour l'instant - gardons les choses aussi simples que possible pour l'instant

- vous sembliez penser que vous deviez déclarer le nom de votre fonction comme une variable aussi. Voici comment utiliser les fonctions, passer des variables à l'intérieur et à l'extérieur de celles-ci :


Pour déclarer :

int abcdef(int x, string s) //signifie que la fonction avec le nom abcdef accepte en entrée un entier et une chaîne de caractères et retourne un entier en sortie (dans ce cas soit 0 soit 9)

{

la fonction fait des choses avec x et s

if (une condition)

retour(9) ;

sinon

retour(0) ;

}


Et pour appeler :

...

maRéponse = abcdef(monInteger, maChaîne) ;

si (maRéponse == 9)

{

blah

 

Hey CB,

Merci. C'est la partie que je n'arrivais pas à comprendre, tu l'as rendue très claire pour moi. Je pense que je suis sur la bonne voie maintenant.

CB, question1 :

bool fnOrderDuplicate()

{

iDuplicateOrders=0 // CB, iDuplicateOrders ne devrait-il pas être déclaré comme int ou double ?

iOrders = OrdersTotal()-1 // Je comprends maintenant avec votre aide que cela appelle la fonction OrdersTotal. Mais encore une fois, iOrders ne devrait-il pas être déclaré comme une variable ?

CB,question2 :

int fnTrade() //Pourquoi ce n'est pas "int fnTrade(string sSignal)", puisque nous utilisons sSignal dans la fonction. ?

{ if(sSignal=="OP_BUY")

...

CB, question 3 :

Vous m'avez demandé d'enlever return(0) et } à la fin du code. Mais cela signifierait que la Start() ne se ferme pas avec un typique 'return(0) et les crochets ne sont pas fermés, car tous les crochets précédents (d'après ce que j'ai vérifié) sont particuliers à l'ouverture et à la fermeture des fonctions spécifiques que nous avons conçues. ?

 
niko:

Hey CB,

Merci. C'est la partie que je n'arrivais pas à comprendre, tu l'as rendue très claire pour moi. Je pense que je suis sur la bonne voie maintenant.

CB, question1 :

bool fnOrderDuplicate()

{

iDuplicateOrders=0 // CB, iDuplicateOrders ne devrait-il pas être déclaré comme int ou double ?

iOrders = OrdersTotal()-1 // Je comprends maintenant avec votre aide que cela appelle la fonction OrdersTotal. Mais encore une fois, iOrders ne devrait-il pas être déclaré comme une variable ?

CB,question2 :

int fnTrade() //Pourquoi ce n'est pas "int fnTrade(string sSignal)", puisque nous utilisons sSignal dans la fonction. ?

{ if(sSignal=="OP_BUY")

...

CB, question 3 :

Vous m'avez demandé d'enlever return(0) et } à la fin du code. Mais cela signifierait que la Start() ne se ferme pas avec un typique 'return(0) et les crochets ne sont pas fermés, car tous les crochets précédents (d'après ce que j'ai vérifié) sont particuliers à l'ouverture et à la fermeture des fonctions spécifiques que nous avons conçues. ?

Q1 : Ces deux variables SONT définies. Regardez les variables que je vous ai suggéré de déplacer dans la section où vous avez défini vos externs. Cela les rendra automatiquement disponibles pour toutes les fonctions.

Q2 : La variable sSignal, si elle est déclarée en dehors de toutes les fonctions, est disponible pour toutes les fonctions sans avoir besoin de la passer explicitement dans l'appel de fonction.

Q3 : Ah - maintenant je vois votre malentendu. Je me demandais pourquoi vous aviez mis cette instruction de retour et ce crochet à cet endroit. C'est couvert par mon commentaire sur l'instruction fnTrade(). Vous remarquerez que je vous avais demandé d'ajouter un appel de retour et une parenthèse fermante à cet endroit. La raison en est que vous déclariez (à tort) toutes vos fonctions dans le bloc de code de la fonction start().


CB

 
niko wrote >>

Hey Tim,

J'ai fait les choses que tu m'as demandé de faire pour le code. Merci d'avoir fourni des réponses détaillées à mes questions et d'avoir écrit de nombreux commentaires tout au long du code pour m'aider à y voir plus clair. Je commence à voir comment les choses s'assemblent, comment utiliser correctement les tableaux et appeler des fonctions spécifiques (et le rôle des variables globales et locales).

J'ai joint la dernière version de notre code.

Une question, y a-t-il une raison pour laquelle nous n'avons pas fait en sorte que la fonction EntryRules contienne tout (y compris les drapeaux) pour nous donner une condition d'achat/court, mais au lieu de cela, nous l'appelons avec les drapeaux plus tard pour prendre la décision d'entrée ?

Bonjour Nick


J'ai fait un peu de ménage dans le code et j'espère avoir répondu à vos questions. La fonction EntryFunction est maintenant complète. Vous devez juste l'appeler depuis la fonction de départ (main) comme je l'ai indiqué dans le code et lui passer les paramètres requis comme indiqué. Juste quelques minutes de travail, j'espère, et ensuite vous pourrez compiler et tester. Je m'attends à ce que vous ayez à faire face à quelques petits bogues, mais j'espère que rien de majeur.


Une fois compilé, essayez d'exécuter l'EA dans le testeur et jetez un coup d'œil dans le fichier journal pour voir s'il semble faire ce que vous attendez de lui à ce stade. Vous devriez être en mesure de voir les signaux d'achat et de vente pour chacune des paires de devises.


Je dirais qu'à ce stade, votre code est terminé à environ 75 %.


L'étape suivante consiste à écrire une autre fonction pour vérifier les ordres ouverts pour une paire de devises et une direction de transaction données.


Je vous suggère de consulter la documentation de MT4 sous Fonctions de trading. OrdersTotal(), OrderSelect(), Order Symbol() & OrderType() sont des candidats probables pour cette tâche.


En ce qui concerne votre question sur le fait de faire en sorte que la fonction EntryRules contienne tout, y compris les drapeaux, je ne vois aucune raison de ne pas le faire. Pourquoi ne pas essayer de modifier la fonction EntryRules ?

Je vous suggère de le faire après avoir compilé, exécuté et testé ce que vous avez déjà fait.


Salutations

Tim

Dossiers :
 

CB : Merci mec, cela aide à clarifier les choses pour moi. Pour une raison quelconque, je pensais que tout devait être dans la fonction de démarrage.

Question : Ne devrions-nous pas déclarer les ema dans la fonction de départ puisque nous voulons qu'ils soient calculés/mises à jour à chaque tick?

 

Hey Tim : Merci encore une fois pour votre aide. En travaillant avec toi et CB, j'ai maintenant plus d'idées sur la façon d'organiser les choses, et je commence à penser de façon plus flexible à tout cela.

 
niko:

CB : Merci mec, cela aide à clarifier les choses pour moi. Pour une raison quelconque, je pensais que tout devait être dans la fonction de démarrage.

Question : Ne devrions-nous pas déclarer les ema dans la fonction de départ car nous voulons qu'ils soient calculés/mises à jour à chaque tick ?

Non. Si vous déclarez une variable dans une fonction, elle n'est disponible que dans cette fonction. Si vous la déclarez en dehors de toutes les fonctions, elle est disponible pour toutes les fonctions. Par conséquent, vous pouvez déclarer les variables ema au début et ensuite faire des calculs sur elles dans la fonction de départ.


CB

 
cloudbreaker wrote >>

Non. Si vous déclarez une variable dans une fonction, elle n'est disponible que dans cette fonction. Si vous la déclarez en dehors de toutes les fonctions, elle est disponible pour toutes les fonctions. Par conséquent, vous pouvez déclarer les variables ema au début et ensuite faire des calculs sur elles dans la fonction de départ.

CB

Merci CB, je comprends maintenant !

 

Hé Tim,


Je suis de retour de Turquie. J'ai passé un moment incroyable à Kusadasi, et je ne voulais vraiment pas partir. Les Turcs sont tellement plus sympathiques que les Britanniques. Je me suis senti chez moi là-bas, même si je n'y étais jamais allé auparavant.


J'ai passé les 5 dernières heures à mettre à jour le code que nous concevons. Il est joint.

Les principales modifications sont les suivantes :

1. J'ai créé une fonction de comptage des commandes, et je l'ai appelée dans la fonction de démarrage. Je m'attends à ce qu'elle soit pleine d'erreurs car il y a des parties que je ne comprends toujours pas (par exemple, comment s'assurer qu'elle suit la boucle [c] pour qu'elle ne fonctionne que par paire de devises).

2. J'ai essayé de corriger le code en ce qui concerne le nom currencySymbol vs. currencySym, car nous avons changé le nom à mi-chemin. Mais cela a pu être confus.

3. J'ai appelé la fonction EntryRules dans la fonction de démarrage.


J'apprécierais vraiment que vous corrigiez les petites et grandes erreurs si vous continuez à introduire //pourquoi l'ancien code est faux, des commentaires, cela m'aide à corriger ma pensée logique.


Comme toujours, j'attends avec impatience vos modifications !

Dossiers :
 

Hey CB,


Je pense que Tim est en vacances maintenant car je n'ai pas eu de nouvelles de lui depuis quelques jours. Je continue donc avec votre code, car il va m'aider à trader (car je trafique manuellement la stratégie maintenant, et cela signifie se lever tôt, etc). J'ai modifié tout le code comme vous l'avez demandé, mais pour une raison quelconque, il renvoie toujours une erreur (à propos de "==" cette fois, très étrange).


Une autre chose est que j'ai remarqué que la fonction de démarrage n'était pas fermée. J'ai donc ajouté "}" après la première fonction dans le début (), si nous ne faisons pas cela, le code génère une erreur avec la chaîne de fonction suivante fnGenerateSignal() (disant que la définition de la fonction pour cela est inattendue).


Merci, comme toujours. J'attends avec impatience vos commentaires/amendements !

Nick

Dossiers :