les aventures d'un débutant - page 3

 
niko:

Merci cloudbreaker ! Cela commence à devenir un peu plus amusant, je ne savais pas que l'on pouvait appeler une fonction à l'intérieur d'un retour (même si c'est probablement dans le livre mql, comme tout ce qui est théorique). Bel hélicoptère EC 155 ! Pourquoi "heureusement", tu ne veux pas ton propre hélicoptère ?

Question Aero HC2 :


J'ai 3 scripts pour ma stratégie jusqu'à présent. 2 sont unidirectionnels, 1 est bidirectionnel (qui est celui sur lequel nous travaillons ici).

D'après votre expérience avec MT4, dois-je m'attendre à de sérieux problèmes si j'attache différents scripts à environ 5 paires à l'écran (1 script par paire). Ce sera plus facile pour moi que de programmer ou de modifier un grand script et de faire en sorte qu'il choisisse la paire que je veux (car cela nécessiterait une modification quotidienne du code) ?

 
niko:

Question Aero HC2 :


J'ai 3 scripts pour ma stratégie jusqu'à présent. 2 sont unidirectionnels, 1 est bidirectionnel (qui est celui sur lequel nous travaillons ici).

D'après votre expérience avec MT4, dois-je m'attendre à de sérieux problèmes si j'attache différents scripts à environ 5 paires à l'écran (1 script par paire). Ce sera plus facile pour moi que de programmer ou de modifier un grand script et de faire en sorte qu'il choisisse la paire que je veux (car cela nécessiterait une modification quotidienne du code) ?

En supposant ici que nous parlons d'une stratégie de trading unique pour toutes les paires de devises :-.

Je préfère que mes EA soient agnostiques par rapport aux paires - c'est-à-dire que le même EX4 peut être attaché à n'importe quelle paire.

-De cette façon, nous n'avons qu'une seule base de code à maintenir.

-La logique reste aussi simple que possible.

 
cloudbreaker:

En supposant ici que nous parlons d'une stratégie de trading unique pour toutes les paires de devises :-.

Je préfère rendre mes EAs agnostiques aux paires - c'est-à-dire que le même EX4 peut être attaché à n'importe quelle paire.

-De cette façon, nous n'avons qu'une seule base de code à maintenir.

-La logique reste aussi simple que possible.

Oui, ce serait l'idéal, mais je définis un filtre manuel pour chaque devise chaque jour, pas basé sur un indicateur, et il s'agit de 3 stratégies bien que l'idée soit la même. Cela rendrait le code vraiment gros dans ma compréhension et lourd à ajuster sur une base quotidienne si nous devions tout mettre ensemble. Dans un futur proche, je programmerai le filtre pour réduire mon temps de travail, mais il y a toujours des choses que l'on ne peut pas programmer (90% à programmer, le reste est pour le cerveau je pense). Bien que j'ai cherché le 'saint graal' avant d'essayer de tout programmer et de trouver le modèle parfait haha, je regarde dans la mauvaise direction).


Je lance les 2 stratégies en direct ce lundi car le code de celles-ci est terminé. Elles ont été exécutées manuellement par mon beau-père et moi-même un peu, le codage devrait apporter des résultats plus élevés. Pour la stratégie combinée, je peux lancer 2 EA sur le même graphique (un pour le long et un pour le court), mais je veux encore apprendre, donc je vais reprendre le processus de codage. Alors attendez-vous à recevoir beaucoup de questions très bientôt !


Dans quel pays êtes-vous basé ? Je suis à Londres, au Royaume-Uni.

 

Hey cloudbreaker et autres gourous mt4 ici !


Question : J'ai 2 scripts (un pour l'achat, l'autre pour la vente à découvert). Je voulais utiliser les deux aujourd'hui sur 3 paires. Maintenant, parce que seulement 1 EA peut être attaché à un graphique, j'ai ouvert 6 graphiques (2 par paire), et attaché les scripts à eux. Cependant, seul 1 script a été exécuté. Je ne sais pas pourquoi. Une aide s'il vous plaît ?


Donc pour résumer : 2 EAs, l'un ne fait qu'acheter, l'autre ne fait que vendre, des règles très basiques (croix dorée sur les emas et c'est tout), prise de profit de 20 pips, pas de stop loss. Pourquoi un seul est exécuté ? J'ai vérifié que les Expert Advisors étaient activés, et tous les scripts avaient des visages souriants à côté d'eux dans les graphiques.

 
niko:

Hey cloudbreaker et autres gourous mt4 ici !


Question : J'ai 2 scripts (un pour l'achat, l'autre pour la vente à découvert). Je voulais utiliser les deux aujourd'hui sur 3 paires. Maintenant, parce que seulement 1 EA peut être attaché à un graphique, j'ai ouvert 6 graphiques (2 par paire), et attaché les scripts à eux. Cependant, seul 1 script a été exécuté. Je ne sais pas pourquoi. Une aide s'il vous plaît ?


Donc pour résumer : 2 EAs, l'un ne fait qu'acheter, l'autre ne fait que vendre, des règles très basiques (croix dorée sur les emas et c'est tout), prise de profit de 20 pips, pas de stop loss. Pourquoi un seul est exécuté ? J'ai vérifié que les Expert Advisors étaient activés, et tous les scripts avaient des visages souriants à côté d'eux dans les graphiques.



Que disent les fichiers de logs ? c'est à dire celui dans le répertoire logs et celui dans le répertoire experts ?

Recevez-vous des messages "Trade Context Busy" ? Si oui, je vous recommande d'ajouter une logique utilisant la fonction IsTradeAllowed().

Si ce n'est pas le cas, je vous recommande de multiplier les instructions Print() dans vos EA.

 
cloudbreaker wrote >>

Que disent les fichiers journaux, c'est-à-dire celui qui se trouve dans le répertoire des journaux et celui qui se trouve dans le répertoire des experts ?

Recevez-vous des messages "Trade Context Busy" ? Si oui, je vous recommande d'ajouter une logique utilisant la fonction IsTradeAllowed().

Si ce n'est pas le cas, je vous recommande de multiplier les instructions Print() dans vos EA.

hey cloudbreaker ! merci d'être venu à la rescousse !

1. Que voulez-vous dire par répertoire de log ? Comment puis-je accéder à ces deux répertoires ? (J'ai essayé de l'ouvrir via C>ProgramFiles>MT4>Experts>Logs mais le dossier est vide).

 
niko wrote >>

hey cloudbreaker ! merci d'être venu à la rescousse !

1. Qu'est-ce que vous entendez par répertoire de connexion ? Comment puis-je accéder à ces deux dossiers ? (J'ai essayé de l'ouvrir via C>ProgramFiles>MT4>Experts>Logs mais le dossier est vide).

Hé, briseur de nuages !

J'ai déjà parcouru un grand nombre de fois tes commentaires sur le codage (je les ai tous affichés sur mon mur), en essayant de les comprendre et de les assembler, mais je suis toujours complètement perdu. J'ai réussi à copier la fonction MyOrderCount d'un autre EA, mais je ne sais toujours pas comment l'intégrer dans le code. Je suis complètement dépassé, mais cela ne veut pas dire que nous ne pouvons pas progresser. Si vous pouviez m'aider à construire le code petit à petit (et m'orienter vers des choses plus spécifiques que je pourrais construire moi-même également), alors nous pourrons terminer le code et j'apprendrai beaucoup plus rapidement.

J'ai joint le code dans la mesure où j'en suis arrivé à le faire, ainsi que la carte de la conception de programmes telle que je la conçois. Ne vous inquiétez pas des petites choses comme les parenthèses dans le code, je les vérifierai avec notepad++ au fur et à mesure.

La priorité principale est que vous m'aidiez à intégrer pas à pas le code de MyOrderCount dans le reste du programme, et que vous m'expliquiez tout au fur et à mesure. Vous pouvez aussi m'envoyer vers des parties spécifiques du livre ou autre chose de ce genre si vous le jugez approprié. De cette façon, nous progresserons beaucoup plus rapidement.

Merci !

ps : faites-moi savoir si la carte du programme ne s'est pas attachée

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }
  //-------------------Declaring All Variables and Conditions

double ema1,ema2,ema3,closeup, e1over2, e2over3,e1under2,e2under3;

ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
e1under2=ema1<ema2;
e2under3=ema2<ema3;
e1over2=ema1>ema2;
e2over3=ema2>ema3;
//--------------------declaration end

//-------------order counting code
int CalculateNumberOfOrders(string Symbol)
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY)long++;
      if(OrderType()==OP_SELL)sell++;
     {
  //---return orders Volume
  if(long>0)return(long);
  if(short>0)return(short);
{
//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
if(OrderType()
     {
    static int ticket;
      // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
       {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"Short
Order ",0,0,Red);
        if(ticket>0)
              {
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SHORT order opened : ",OrderOpenPrice());
              }
              //return(0);
       }

      //  -------------------------------------------------------------------------------------------

      {
      static int ticket1;
            // deleted if(OrdersTotal()==0)
        if(e1over2 && e2over3) //buy function
        {
         ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
//What's 12345 for? I ADDED ASk-30*Point for stop loss
         if(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
           }
           //return(0);   //the problem is with this return not being
in the right place i think
        }
      }
return(0);
}
}

ps : s'il vous plaît ignorer le hasard // commentaires dans le code, il est de vieilles notes

 
niko wrote >>

Hey cloudbreaker !

J'ai déjà parcouru un grand nombre de fois tes commentaires sur le codage (je les ai tous affichés sur mon mur), en essayant de comprendre et d'assembler le tout, mais je suis toujours complètement perdu. J'ai réussi à copier la fonction MyOrderCount d'un autre EA, mais je ne sais toujours pas comment l'intégrer dans le code. Je suis complètement dépassé, mais cela ne veut pas dire que nous ne pouvons pas progresser. Si vous pouviez m'aider à construire le code petit à petit (et m'orienter vers des choses plus spécifiques que je pourrais construire moi-même également), alors nous pourrons terminer le code et j'apprendrai beaucoup plus rapidement.

J'ai joint le code dans la mesure où j'en suis arrivé à le faire, ainsi que la carte de la conception de programmes telle que je la conçois. Ne vous inquiétez pas des petites choses comme les parenthèses dans le code, je les vérifierai avec notepad++ au fur et à mesure.

La priorité principale est que vous m'aidiez à intégrer pas à pas le code de MyOrderCount dans le reste du programme, et que vous m'expliquiez tout au fur et à mesure. Vous pouvez aussi m'envoyer vers des parties spécifiques du livre ou autre chose de ce genre si vous le jugez approprié. De cette façon, nous progresserons beaucoup plus rapidement.

Merci !

ps : faites-moi savoir si la carte du programme ne s'est pas attachée

ps : s'il vous plaît ignorer les commentaires aléatoires // dans le code, il est de vieilles notes

Bonjour Niko

Je me permets d'ajouter mes deux pence à cette discussion,

En tant qu'ancien, presque antique :), programmeur avec un peu d'expérience dans l'enseignement et la formation, j'ai rencontré pas mal de mauvais code dans mon temps. Une erreur commune qui conduit à un code mal écrit est le manque de planification. C'est peut-être une évidence, mais vous devez vraiment spécifier ce que vous voulez faire avant de commencer à essayer de le coder. Cela peut sembler un travail supplémentaire, mais cela vous fera gagner beaucoup de temps à long terme et produira un code plus fiable, plus compréhensible et plus facile à maintenir.

Une technique très utile pour spécifier le code informatique est connue sous le nom de pseudo-codage. Il s'agit en fait d'un ensemble logique d'instructions informatiques écrites en anglais simple. Aucun format particulier n'est requis, mais vous pouvez utiliser le jargon typique des programmes informatiques que l'on retrouve sous une forme ou une autre dans presque tous les langages de programmation informatique.

Voici un exemple de pseudo-code pour la cuisson du fromage et des macaronis. Je l'ai pris d'un article "Intro to Programming by Patrick Nouvion" sur le site IBFX. L'article entier vaut probablement la peine d'être lu. http://www.ibfx.com/ibfxu/catalog/programming/pro1010.aspx

COMMENCEZ
Trouvez le lait et le beurre et la boîte Kraft
Si vous les trouvez, continuez
Sinon, envoyez l'enfant au magasin

Trouvez le pot dans le placard

Si vous la trouvez, continuez ou demandez à votre femme de vous aider à la trouver.

Trouver la cuisinière
Si trouvé, continuez
sinon commander une pizza

Vérifier si un brûleur est disponible
Si disponible, continuer
sinon faire disponible

Mettre la cuisinière en position haute
Trouver de l'eau
Si trouvé, continuer
sinon commander une pizza

Mettre l'eau dans le pot
Vérifier que la cuisinière est chaude
Si elle est chaude, continuez
Sinon, vérifiez qu'elle est branchée
sinon appelez le réparateur et commandez une pizza

Placez la casserole sur le brûleur
si vous avez du sel, ajoutez une pincée de sel
sinon, continuez
si vous avez du poivre, ajoutez une pincée de poivre
sinon, continuez
Pendant que l'eau ne bout pas, attendez
ouvrir la boîte Kraft
ajouter les macaronis de la boîte dans la casserole
attendez 8 minutes
En attendant, si la casserole bout trop, baisser le feu et souffler dessus.
Trouvez une passoire
Egoutter les macaronis dans la passoire
Remettre dans la casserole
ajouter le contenu du paquet de fromage
ajouter le beurre
ajouter 1 cuillère à soupe de lait
remuer pour mélanger
si le mélange est trop épais, ajouter 1 cuillère à soupe de lait ; sinon, manger.
FIN

Si j'écrivais ce pseudo-code moi-même, je l'affinerais un peu plus en le divisant en blocs fonctionnels et en utilisant un peu d'indentation pour le rendre "joli". Par exemple

BLOC DE DÉMARRAGE - Préparer l'eau bouillante

Mettre l'eau dans la casserole

Placez la casserole sur le brûleur
si vous avez du sel, ajoutez une pincée de sel
sinon, continuez
Si vous avez du poivre, ajoutez une pincée de poivre.
sinon, continuez
pendant que l'eau ne bout pas, attendez

BLOC DE FIN - Préparer l'eau bouillante

et ainsi de suite....

Niko, je te félicite de vouloir apprendre à écrire ton propre code. D'après mon expérience, le moyen le plus rapide et le plus facile d'apprendre est de faire ce que vous faites et de vous lancer. Je vous suggère cependant de prendre un peu de recul et d'écrire ce que vous voulez réaliser en pseudo-code. Cela devrait vous aider à clarifier votre pensée sur ce que vous essayez d'obtenir exactement.

Une fois que vous avez fait cela, vous pouvez le poster ici pour que moi ou quelqu'un d'autre y jette un œil. Une fois que le pseudo-code est correct, vous pouvez commencer à le convertir en code MT4. Essayer de tout faire en une seule fois est un trop grand saut, surtout quand on est un débutant.

À propos, mon pseudo-code n'est jamais gaspillé. La plupart d'entre eux finissent en tant que commentaires dans mon code fini.

Bonne chance !

Tim Wilson

 
niko:

Hey cloudbreaker !

J'ai déjà parcouru un grand nombre de fois tes commentaires sur le codage (je les ai tous affichés sur mon mur), en essayant de comprendre et d'assembler le tout, mais je suis toujours complètement perdu. J'ai réussi à copier la fonction MyOrderCount d'un autre EA, mais je ne sais toujours pas comment l'intégrer dans le code. Je suis complètement dépassé, mais cela ne veut pas dire que nous ne pouvons pas progresser. Si vous pouviez m'aider à construire le code petit à petit (et m'orienter vers des choses plus spécifiques que je pourrais construire moi-même également), alors nous pourrons terminer le code et j'apprendrai beaucoup plus rapidement.

J'ai joint le code dans la mesure où j'en suis arrivé à le faire, ainsi que la carte de la conception de programmes telle que je la conçois. Ne vous inquiétez pas des petites choses comme les parenthèses dans le code, je les vérifierai avec notepad++ au fur et à mesure.

La priorité principale est que vous m'aidiez à intégrer pas à pas le code de MyOrderCount dans le reste du programme, et que vous m'expliquiez tout au fur et à mesure. Vous pouvez également m'envoyer vers des parties spécifiques du livre ou autre chose de ce genre si vous le jugez approprié. De cette façon, nous progresserons beaucoup plus rapidement.

Merci !

ps : faites-moi savoir si la carte du programme ne s'est pas attachée

ps : s'il vous plaît ignorer le hasard // commentaires dans le code, c'est de vieilles notes

Un coup d'oeil rapide me dit que vous faites une erreur fondamentale.

Vous semblez essayer de déclarer la fonction MyOrderCount() dans le bloc de code de la fonction start().

Imaginez votre code comme une série de fonctions init(), start(), yourfunction1(), yourfunction2() ... yourfunctionN().

Les fonctions init() et start() sont des fonctions spéciales. La fonction init() est exécutée une fois lorsque vous initialisez l'EA pour la première fois. La fonction start() est exécutée chaque fois qu'un tick entrant arrive.

Ainsi, la fonction start() constitue la racine à partir de laquelle toute votre logique sera appelée une fois que l'EA sera opérationnel.

Par exemple, chaque fois qu'un tick arrive, votre fonction start() s'exécutera et fera ceci :

- vérifier certaines conditions

- si les conditions sont remplies, exécuter un ordre

L'une des conditions dont vous avez besoin est de vous assurer que vous n'avez pas déjà un ordre du type (disons d'achat) avant de passer un ordre d'achat.

Ainsi, à partir de la fonction start(), vous devrez déterminer quels sont les ordres d'achat existants en appelant votre fonction de comptage d'ordres d'achat (dont le bloc de code se trouve en dehors de la fonction start()).

Votre fonction de comptage des ordres renverra le nombre d'ordres d'achat et vous reprendrez l'exécution de la fonction start() à la ligne qui suit votre appel à la fonction de comptage des ordres d'achat.

Vous utiliserez ensuite la valeur renvoyée par la fonction de comptage des ordres d'achat pour déterminer si vous devez ou non exécuter votre ordre d'achat.

L'exécution effective de l'ordre d'achat peut être un appel à une AUTRE fonction que vous créez pour vous-même (là encore, déclarée en dehors de la fonction start()).

J'espère que cela a du sens. Il se peut que votre structure soit complètement différente, mais j'essaie simplement de vous faire comprendre le concept de fonctions et d'appels.


CB

 

Salut TSWilson et CB !

Vous êtes géniaux ! Merci beaucoup.

Vous avez tout à fait raison en ce qui concerne le pseudo-code. Je l'ai fait quand j'ai fait de la programmation très basique en langage pro**realtime, mais c'était tellement simple, pas de déclarations, pas de blocs, etc (le code entier était juste 'if...then' haha). J'ai commencé le pseudo code ce matin (je suis arrivé au travail une heure plus tôt juste pour le faire) et j'ai écrit un diagramme visuel sur comment et quels blocs avoir. Je vais le terminer plus tard dans la journée et le poster ici.

Une fois que ce sera fait, le reste des blocs et les spécificités du code pourront être déterminés avec votre aide. Donc, retour à la planche à dessin pour le moment !

Je suis heureux de travailler toute la nuit aujourd'hui et demain pour terminer le code dès que possible, car je pars en vacances la semaine prochaine et je veux que tout soit prêt avant mon départ.

Donc, surveillez ce fil de discussion aujourd'hui, je vais poster le pseudo-code et le diagramme !

Et comme toujours, merci à l'Univers pour les gens comme vous !

Raison: