les aventures d'un débutant - page 4

 

Bonjour légendes de mql. J'ai préparé le pseudo code pour vous pendant mon heure de déjeuner au travail. Le voici. Dites-moi ce qui manque et je le rajouterai.

Pseudo-code N&P
Avec cette stratégie, nous voulons avoir un seul code, être capable de l'attacher à n'importe quel graphique, et il fonctionnerait sur 5 devises, en entrant à la fois des positions courtes et longues sur chacune d'elles si les règles sont respectées.
---EURUSD---
Si ema7>ema14>sma50 et PriceNow est < TopFilterLevel (eg:1.3080 pour eurusd. Ceci sera ajusté sur une base quotidienne) alors :
Acheter des lots d'EURUSD (les lots seront une variable externe, par exemple 0,01). Sinon : (c'est-à-dire que les conditions ne sont pas remplies) ne pas acheter.

Si ema7<ema14<sma50 et PriceNow est > BottomFilterLevel (ex : 1.1508 pour eurusd) alors :
Short EURUSD Lots (agian, variable externe). Sinon (c'est-à-dire si les conditions ne sont pas remplies, ne pas vendre à découvert).

Si la position BUY atteint 20 pips à partir du point d'entrée alors : TAKEPROFIT sur EURUSD.
Si la position SHORT atteint 20 pips à partir du point d'entrée alors : TAKEPROFIT sur EURUSD.
Si les 20 pips ne sont pas atteints (que ce soit à l'achat ou à la vente), continuez à être sur le marché jusqu'à ce que la position soit fermée.

manuellement. (l'idéal serait de mettre cela dans la fonction OrderSend pour garder un code plus court).

----GBPUSD---
exactement le même code que ci-dessus.

----USDJPY---
MÊME CODE QUE CI-DESSUS

---USDCHF---
MÊME CHOSE QUE CI-DESSUS

---AUDUSD---
COMME CI-DESSUS

**Code spécifique
les transactions d'achat et de vente peuvent être exécutées simultanément pour une devise donnée si les critères énoncés ci-dessus sont respectés.
***Aucun stoploss n'est nécessaire pour ce code.

**pas de code de gestion de l'argent pour celui-ci

Alors, à quoi cela ressemble-t-il ?

 
niko:

Bonjour légendes de mql. J'ai préparé le pseudo code pour vous pendant mon heure de déjeuner au travail. Le voici. Dites-moi ce qui manque et je le rajouterai.

Pseudo-code N&P
Avec cette stratégie, nous voulons avoir un seul code, être capable de l'attacher à n'importe quel graphique, et il fonctionnerait sur 5 devises, en entrant des positions courtes et longues sur chacune d'elles si les règles sont respectées.
---EURUSD---
Si ema7>ema14>sma50 et PriceNow est < TopFilterLevel (eg:1.3080 pour eurusd. Ceci je l'ajusterai sur une base quotidienne) alors :
Acheter des lots EURUSD (les lots seront une variable externe, par exemple 0,01). Sinon : (c'est-à-dire que les conditions ne sont pas remplies) ne pas acheter.

Si ema7<ema14<sma50 et PriceNow est > BottomFilterLevel (ex : 1.1508 pour eurusd) alors :
Short EURUSD Lots (agian, variable externe). Sinon (c'est-à-dire si les conditions ne sont pas remplies, ne pas vendre à découvert).

Si la position BUY atteint 20 pips à partir du point d'entrée alors : TAKEPROFIT sur EURUSD.
Si la position SHORT atteint 20 pips à partir du point d'entrée alors : TAKEPROFIT sur EURUSD.
Si les 20 pips ne sont pas atteints (que ce soit à l'achat ou à la vente), continuez à être sur le marché jusqu'à ce que la position soit fermée.

manuellement. (l'idéal serait de mettre cela dans la fonction OrderSend pour garder un code plus court).

----GBPUSD---
exactement le même code que ci-dessus.

----USDJPY---
MÊME CODE QUE CI-DESSUS

---USDCHF---
MÊME CHOSE QUE CI-DESSUS

---AUDUSD---
COMME CI-DESSUS

**Code spécifique
les opérations d'achat et de vente peuvent être exécutées simultanément pour une devise donnée si les critères énoncés ci-dessus sont respectés.
***Aucun stoploss n'est nécessaire pour ce code.

**pas de code de gestion de l'argent pour celui-ci

Alors, comment ça se présente ?

Hé les gars, le tutoriel de base sur le codage m'a vraiment aidé à m'y retrouver (bien que la partie détaillée du codage fasse défaut). Pour vous montrer que j'ai été occupé, j'ai joint le code ci-dessous. Je pense que l'idée est là, mais il retourne encore beaucoup d'erreurs. Vous verrez que tout est sous une grande parenthèse dans Start() la raison pour laquelle j'ai fait cela est que mql a continué à revenir avec l'erreur que la variable ne peut pas être déclarée globalement, et quand j'ai fait tout dans une parenthèse il a semblé avoir arrêté cette erreur (bien que beaucoup d'autres erreurs ont persisté). J'ai utilisé notepad++ pour vérifier l'alignement des parenthèses. Alors est-ce que je suis au moins dans la bonne direction avec ceci ?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
      int CalcOpenOrders()
         {
         int long=0,short=0;
      for(int i=0; i<OrdersTotal(); i++)   
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;
         //this function selects an order for further processing
         if(OrderType()==OP_BUY)long++;
         if(OrderType()==OP_SELL)short++;
         }
      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.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
   {
   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;

   if(Bars<75)
      {
      Print("Bars less than 100");
      return(0);
      }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders();
  
   // Check output of function
   if ( ReturnVal >0)  // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok=1;
      else
      {
      eurusdbuyok=0;
      return(0);
      }

   if ( ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
      eurusdshortok=1;
      else
      {
      eurusdshortok=0;
      return(0);
      }


   //--------------condition ends

   if( eurusdshortok==1)
      {
      static int ticket;
      // deleted if(OrdersTotal()==0)
      if( e1under2 && e2under3)     // short function
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
            Print("SHORT order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok==1)
      {
      static int ticket1;
      // deleted if(OrdersTotal()==0)
      if( e1over2 && e2over3 && eurusdbuyok==1) //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);
      }

   return(0);
   } 
Je suis en train de me familiariser avec la structure du programme, du côté de la structure du programme et du côté de la stratégie. Je suis en train de devenir assez familier avec le code maintenant, bien la structure du côté du programme de celui-ci.
 
niko wrote >>

Bonjour légendes de mql. J'ai préparé le pseudo code pour vous pendant mon heure de déjeuner au travail. Le voici. Dites-moi ce qui manque et je le rajouterai.

Pseudo code N&P
Avec cette stratégie, nous voulons avoir 1 code, pouvoir l'attacher à n'importe quel graphique, et il fonctionnerait sur 5 devises, en entrant des positions courtes et longues sur chacune d'elles si les règles sont respectées.
---EURUSD---
Si ema7>ema14>sma50 et PriceNow est < TopFilterLevel (eg:1.3080 pour eurusd. Ceci sera ajusté sur une base quotidienne) alors :
Acheter des lots d'EURUSD (les lots seront une variable externe, par exemple 0,01). Sinon : (c'est-à-dire que les conditions ne sont pas remplies) ne pas acheter.

Si ema7<ema14<sma50 et PriceNow est > BottomFilterLevel (ex : 1.1508 pour eurusd) alors :
Short EURUSD Lots (agian, variable externe). Sinon (c'est-à-dire si les conditions ne sont pas remplies, ne pas vendre à découvert).

Si la position BUY atteint 20 pips à partir du point d'entrée alors : TAKEPROFIT sur EURUSD.
Si la position SHORT atteint 20 pips à partir du point d'entrée alors : TAKEPROFIT sur EURUSD.
Si les 20 pips ne sont pas atteints (que ce soit à l'achat ou à la vente), continuez à être sur le marché jusqu'à ce que la position soit fermée.

manuellement. (l'idéal serait de mettre cela dans la fonction OrderSend pour garder un code plus court).

----GBPUSD---
exactement le même code que ci-dessus.

----USDJPY---
MÊME CODE QUE CI-DESSUS

---USDCHF---
MÊME CHOSE QUE CI-DESSUS

---AUDUSD---
COMME CI-DESSUS

**Code spécifique
les transactions d'achat et de vente peuvent être exécutées simultanément pour une devise donnée si les critères énoncés ci-dessus sont respectés.
***Aucun stoploss n'est nécessaire pour ce code.

**pas de code de gestion de l'argent pour celui-ci

Alors, comment cela se présente-t-il ?

Bonjour Niko

Votre pseudo code semble assez bon pour une première tentative.

J'aimerais cependant le voir un peu plus structuré et il y a quelques questions qu'il soulève pour moi.

J'ai pu facilement et rapidement le mettre dans le format que j'utiliserais habituellement moi-même. Il est joint ici sous forme de fichier texte pour que vous puissiez y jeter un œil. Vous devrez enregistrer ce fichier et l'ouvrir dans le bloc-notes ou un éditeur similaire pour voir le formatage.

Notez qu'à ce stade, nous n'écrivons pas dans un langage informatique spécifique. Nous essayons simplement de spécifier clairement et sans ambiguïté ce que nous essayons de faire.

Vous remarquerez peut-être que le pseudo-code est assez spécifique et "légaliste". C'est ainsi que nous devons parler aux ordinateurs. Nous devons énoncer très clairement ce que nous voulons qu'ils fassent. Sinon, ils ont tendance à générer des déchets.

Vous remarquerez également l'utilisation de "blocs" pour organiser les choses en groupes logiques. Ceux-ci peuvent être utiles plus tard pour nous aider à structurer le code correctement. Comme quelqu'un l'a souligné plus tôt dans cette discussion, nous ne faisons pas cela juste pour le plaisir. Nous le faisons pour rendre le code plus lisible, plus compréhensible, plus facile à maintenir et finalement plus fiable et sans bogue. Ce dernier point est extrêmement important dans un logiciel qui sera utilisé pour le trading en direct, à moins bien sûr que vous n'ayez des seaux d'argent que vous êtes prêt à jeter :) . Sérieusement, le trading est déjà assez difficile sans avoir à traiter avec des logiciels buggés.

Jetez un coup d'œil à ce que je vous ai envoyé et n'hésitez pas à apporter les modifications que vous jugez nécessaires. Il manque quelques points importants dans mon pseudo-code. Pouvez-vous les repérer ?

Vous voudrez peut-être aussi répondre aux deux questions que j'ai soulevées dans le pseudo-code. Un certain nombre d'autres questions me viennent à l'esprit, mais il est préférable de les laisser jusqu'à la phase de codage proprement dite.

Si vous ne l'avez pas encore fait, vous pouvez essayer l'éditeur Notepad++ que FXtrader2008 a mentionné plus tôt dans cette discussion. Utilisez tous les outils que vous pouvez trouver et qui vous facilitent un peu la vie. Veuillez me renvoyer votre pseudo-code révisé sous forme de fichier texte en pièce jointe. Je trouve qu'essayer d'écrire du code structuré, pseudo ou autre, dans cet éditeur HTML est un peu fastidieux et désordonné.

Salutations

Tim

Dossiers :
 
TSWilson:

Bonjour Niko

Votre pseudo code semble assez bon pour une première tentative.

J'aimerais cependant le voir un peu plus structuré et il y a quelques questions qu'il soulève pour moi.

J'ai pu facilement et rapidement le mettre dans le format que j'utiliserais habituellement moi-même. Il est joint ici sous forme de fichier texte pour que vous puissiez y jeter un œil. Vous devrez enregistrer ce fichier et l'ouvrir dans le bloc-notes ou un éditeur similaire pour voir le formatage.

Notez qu'à ce stade, nous n'écrivons pas dans un langage informatique spécifique. Nous essayons simplement de spécifier clairement et sans ambiguïté ce que nous essayons de faire.

Vous remarquerez peut-être que le pseudo-code est assez spécifique et "légaliste". C'est ainsi que nous devons parler aux ordinateurs. Nous devons énoncer très clairement ce que nous voulons qu'ils fassent. Sinon, ils ont tendance à générer des déchets.

Vous remarquerez également l'utilisation de "blocs" pour organiser les choses en groupes logiques. Ceux-ci peuvent être utiles plus tard pour nous aider à structurer le code correctement. Comme quelqu'un l'a souligné plus tôt dans cette discussion, nous ne faisons pas cela juste pour le plaisir. Nous le faisons pour rendre le code plus lisible, plus compréhensible, plus facile à maintenir et finalement plus fiable et sans bogue. Ce dernier point est extrêmement important dans un logiciel qui sera utilisé pour le trading en direct, à moins bien sûr que vous n'ayez des seaux d'argent que vous êtes prêt à jeter :) . Sérieusement, le trading est déjà assez difficile sans avoir à faire face à des logiciels buggés.

Jetez un coup d'œil à ce que je vous ai envoyé et n'hésitez pas à apporter les modifications que vous jugez nécessaires. Il manque quelques points importants dans mon pseudo-code. Pouvez-vous les repérer ?

Vous voudrez peut-être aussi répondre aux deux questions que j'ai soulevées dans le pseudo-code. Un certain nombre d'autres questions me viennent à l'esprit, mais il est préférable de les laisser jusqu'à la phase de codage proprement dite.

Si vous ne l'avez pas encore fait, vous pouvez essayer l'éditeur Notepad++ que FXtrader2008 a mentionné plus tôt dans cette discussion. Utilisez tous les outils que vous pouvez trouver et qui vous facilitent un peu la vie. Veuillez me renvoyer votre pseudo-code révisé sous forme de fichier texte en pièce jointe. Je trouve qu'essayer d'écrire du code structuré, pseudo ou autre, dans cet éditeur HTML est un peu fastidieux et désordonné.

Salutations

Tim

Hé TSW. Merci pour ce travail. Je peux voir que vous avez mis beaucoup de temps dans ce projet, donc j'apprécie vraiment. J'ai joint le pseudo code mis à jour, mais au cas où il ne se serait pas attaché, le voici ci-dessous. J'ai essayé de voir ce que tu as oublié, mais je n'ai pas réussi à le comprendre, j'ai ajouté quelques choses mais c'était juste des clarifications.


Où allons-nous maintenant ? Pendant que nous créons ce code "correct", j'essaie toujours de résoudre l'énigme du code ci-dessus. Il ne suit pas notre pseudo-code car il s'agit d'un vieux code rafistolé, mais je suis encore assez perplexe car il devrait fonctionner, au moins pour une devise. Ce qui est important, c'est que la construction de ce code de façon désordonnée me permet d'apprendre les éléments de codage réels (comme la façon dont les parenthèses affectent le script, où déclarer les variables, etc.) Une idée sur la raison pour laquelle ce code ne fonctionne pas comme il est maintenant ?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote >>

Hé les gars, le tutoriel de base sur le codage m'a vraiment aidé à m'y retrouver (bien que la partie détaillée du codage fasse défaut). Pour vous montrer que j'ai été occupé, j'ai joint le code ci-dessous. Je pense que l'idée est là, mais il retourne encore beaucoup d'erreurs. Vous verrez que tout est sous une grande parenthèse dans Start() la raison pour laquelle j'ai fait cela est que mql a continué à revenir avec l'erreur que la variable ne peut pas être déclarée globalement, et quand j'ai fait tout dans une parenthèse il a semblé avoir arrêté cette erreur (bien que beaucoup d'autres erreurs ont persisté). J'ai utilisé notepad++ pour vérifier l'alignement des parenthèses. Alors est-ce que je suis au moins sur la bonne voie avec ça ?

C'est la dernière version du code. D'un point de vue syntaxique, tout semble correct, mais lorsque je l'exécute avec le testeur de stratégie, il ne renvoie aucune transaction. Quelque chose ne va pas avec la logique. J'ai besoin d'aide. Je suis en train de devenir assez familier avec le code maintenant, bien la structure du côté du programme de celui-ci.

Hé les gars, si vous avez besoin d'aide pour le bout de code ci-dessus (pas le pseudo-code mais le code) pendant que j'apprends comment le faire correctement.

J'ai eu un brainstorming aujourd'hui, je pense que peut-être l'erreur est qu'il y a une fonction qui compte les ordres, et à la place peut-être que j'ai besoin de 2 fonctions séparément, l'une compte les achats et l'autre les ventes. J'ai programmé le code ci-dessous (en changeant quelques choses pour tenir compte de cela), vous pouvez voir ci-dessous. Mais tout est encore confus car je suis encore un débutant complet. Des idées sur ce sujet ?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     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.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  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;

  if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //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);
     }

  return(0);
  }

 
niko wrote >>

Les gars, les filles, vous pouvez m'aider avec le bout de code ci-dessus (pas le pseudo code mais le code) pendant que j'apprends comment le faire correctement.

J'ai eu un brainstorming aujourd'hui, je pense que peut-être l'erreur est qu'il y a une fonction qui compte les ordres, et à la place peut-être que j'ai besoin de 2 fonctions séparées, une compte les achats et une autre les ventes. J'ai programmé le code ci-dessous (en changeant quelques choses pour tenir compte de cela), vous pouvez voir ci-dessous. Mais tout est encore confus car je suis encore un débutant complet. Des idées sur ce sujet ?

Bonjour Niko

En ce qui concerne le pseudo code

Du code :
*** Question ***
Quelles périodes de temps voulez-vous utiliser pour vos moyennes mobiles ? S'agit-il de minutes, d'heures, de jours, de semaines ou de mois, ou doivent-ils être variables ?
***Réponse *** Excellente question. Il s'agira de périodes de 5 minutes pour toutes les moyennes mobiles, elles n'ont pas besoin d'être variables.

Dans ce cas, je vous suggère d'ajouter au pseudo-code de la zone des paramètres de configuration une déclaration du type suivant

"Utiliser l'échelle de temps 5 minutes pour les indicateurs".


Vous avez dit :
***Je n'ai pas été clair sur ce point auparavant, je m'en excuse. Il ne devrait pas y avoir de bloc comme celui-ci dans le code.

Je vais sortir des positions manuellement lorsque cela est nécessaire à travers la fenêtre du trade/terminal.

(je suppose que c'est possible et que cela ne perturbera pas l'exécution de l'EA, n'est-ce pas).

Donc, en fait, je ne sais pas si nous devons coder cette flexibilité ou non ? Qu'en pensez-vous ?


Je vous suggère alors de supprimer ce bloc du pseudo-code.

Il ne devrait pas y avoir de problème pour coder l'EA afin que vous puissiez utiliser le terminal pour fermer une position manuellement sans rien gâcher.

Vous avez ajouté ces lignes :

ELSE S'il y a déjà une position d'achat ouverte pour cette paire de devises, NE PAS OUVRIR de position d'achat pour cette paire de devises.

ELSE S'il y a déjà 1 position de vente ouverte pour cette paire de devises Ne pas ouvrir de position de VENTE pour cette paire de devises.


*** Question *** Pourquoi avez-vous besoin d'indiquer spécifiquement ce que vous NE voulez PAS que le programme fasse après que les lignes précédentes se soient juste

indiquez ce que vous VOULEZ que le programme fasse. À mon avis, le pseudo-code est l'endroit où vous devez réfléchir soigneusement à votre logique. Sinon, vous risquez de

vous vous retrouvez dans le désordre lorsque vous commencez le codage réel.


Vous avez dit :
PS : Je vais souvent utiliser une seule direction sur une paire de devises (par exemple : juste court, pour eurusd pendant 2 jours par exemple). Comment pouvons-nous intégrer cela dans le code ? Je suppose que je pourrais simplement mettre '//' devant les parties du code que je ne veux pas utiliser (par exemple, devant les ordres d'achat ou de vente dans chaque paire de devises), puis les supprimer lorsque j'ai besoin d'utiliser cette partie du code la prochaine fois. Cela fonctionnera-t-il avec un code structuré de cette manière ?


Commenter le code comme vous le suggérez n'est pas une façon très élégante de procéder. De plus, si vous commentez la section "LONG" du code, vous commentez la fonction d'ouverture de positions longues pour toutes les paires de devises, à moins que vous ne produisiez du code avec beaucoup de duplications. Ce n'est pas non plus une façon très élégante de procéder et cela conduit facilement à des erreurs.

Sur une période donnée, vous pouvez vouloir être long EURUSD, short GBPUSD et ne pas trader du tout USDCHF. Ceci est assez facile à réaliser mais j'aimerais que vous essayiez de trouver comment le décrire vous-même dans le pseudo code.


Voici quelques conseils sur une façon possible de procéder.

1. Regardez comment vos niveaux sont mis en place et employés.

2. Les niveaux sont représentés par des nombres décimaux. Pour les situations de type "go/no go", il est courant d'utiliser un autre type de représentation, appelé booléen ou drapeau. Serait-il possible d'utiliser des drapeaux pour accomplir ce que vous voulez faire ?


Vous avez dit :

**Je ne peux pas vraiment penser à quelque chose que vous avez omis volontairement, pour être honnête. Sauf si c'est pour vérifier si les fonds sont suffisants pour la transaction, mais ce n'est pas encore nécessaire.

Peut-être dans les futures versions de la stratégie.


Non, il ne s'agit pas de vérifier si les fonds sont suffisants. Vous avez spécifiquement dit : pas de gestion de l'argent, sauf bien sûr pour spécifier la taille du lot. Il s'agit de quelque chose de beaucoup plus fondamental.

De quels éléments d'information avez-vous besoin pour passer un ordre ? Où et comment chacun de ces éléments est-il décrit et traité dans le psuedo code ?


Vous avez dit :

Où allons-nous maintenant ? Pendant que nous créons ce "vrai" code, j'essaie toujours de résoudre l'énigme du code ci-dessus. Il ne suit pas notre pseudo-code car il s'agit d'un vieux code rafistolé, mais il me laisse encore un peu perplexe car il devrait fonctionner, au moins pour une monnaie. Ce qui est important, c'est que la construction de ce code de manière désordonnée me permet d'apprendre les éléments de codage réels (comme la façon dont les parenthèses affectent le script, où déclarer les variables, etc). Une idée sur la raison pour laquelle ce code ne fonctionne pas tel qu'il est maintenant ?


Je comprends votre frustration. J'ai jeté un coup d'œil rapide à l'ancien code, mais franchement, ce que vous essayez de faire n'a pas beaucoup de sens d'un point de vue logique. Je pourrais réécrire ce morceau de code en 15 minutes environ et il ferait ce que vous voulez, mais ce n'est pas le but, n'est-ce pas ? Vous avez dit que vous vouliez apprendre à écrire du code. Je m'efforce de vous apprendre à le faire vous-même.


Nico, je ne pense pas que vous soyez trop loin de commencer à écrire un (nouveau) code correct, mais il est important d'obtenir autant de "ce que vous voulez faire" précisément dans le pseudo-code d'abord.

Cela rendra le codage "tellement plus facile" comme vous le verrez bientôt.


Continuez à faire du bon travail

Au revoir

Tim

 

Hé Tim,


Comme toujours, j'apprécie vraiment le temps que tu me consacres. Je vais aller de l'avant et modifier le pseudo code afin qu'il reflète vos commentaires. En ce qui concerne le vrai code, pas d'inquiétude, faisons-le correctement (je suis juste un peu impatient parfois :), car l'apprentissage est plus puissant que tout.

 

Hé Tim,


J'ai parcouru le pseudo-code à nouveau et j'ai fait tout ce que mon cerveau de débutant pouvait comprendre à ce stade. Veuillez le trouver ci-joint, j'attends vos commentaires avec impatience !

Dossiers :
 
niko wrote >>

Hé Tim,

J'ai parcouru le pseudo-code à nouveau et j'ai fait tout ce que mon cerveau de débutant pouvait comprendre à ce stade. Veuillez le trouver ci-joint, j'attends vos commentaires avec impatience !

Bonjour Nick

Tout se passe bien.

J'ai parcouru votre dernier pseudo-code et répondu à quelques questions, etc.

Je pense que nous sommes prêts à commencer à coder.


En règle générale, on dit que 1/3 du temps de programmation doit être consacré à la spécification, 1/3 au codage et 1/3 au débogage et aux tests.


Nous pouvons donc dire que nous sommes maintenant à peu près à 1/3 de l'avancement de ce petit projet !

Maintenant, parlons du langage MT4.


Tous les langages informatiques ont des méthodes spécifiques (un format) dans lesquelles le langage doit être écrit pour que l'ordinateur puisse comprendre ce que vous essayez de lui faire faire. Vous trouverez ces informations et d'autres informations spécifiques au langage dans la documentation. La documentation de MT4 est disponible en ligne sur ce forum. Si vous ne l'avez pas encore fait, je vous suggère de passer un peu de temps à regarder le type d'informations disponibles dans la documentation. Ainsi, lorsque vous aurez besoin d'informations sur un sujet ou une fonction spécifique, vous saurez où les chercher.


Pour vous faciliter la vie, de nombreux langages de compte modernes, dont MT4, utilisent des modèles qui définissent pour vous la structure de base d'un programme. Ces programmes modèles sont souvent appelés "assistants". Vous trouverez l'assistant EA sous l'élément de menu "Nouveau" dans le MetatEditor avec la croix verte.


Si vous l'ouvrez, vous trouverez un modèle pour "Expert Advisor". Sélectionnez-le et vous serez invité à saisir un nom d'EA, des détails sur l'auteur, etc. et des paramètres. Les paramètres peuvent être ajoutés ou modifiés ultérieurement, mais à ce stade, il est préférable d'entrer les paramètres à partir du bloc de configuration.

Vous devrez donner à chaque paramètre un nom, un type et une valeur initiale.


Les noms des paramètres doivent toujours être descriptif de ce qu'ils sont


par exemple, EURUSD_TopFilterLevel est un nom significatif ex1 IS NOT. L'utilisation de noms de données significatifs rend le programme beaucoup plus facile à comprendre, à déboguer ou à modifier par la suite. Notez que dans MT4, les noms de données sont sensibles à la casse. LOTSize n'est pas la même chose que LotSize. Vous devez être prudent et cohérent avec les noms de données.


Vous devrez également spécifier un type de données (type) pour chaque paramètre. MT4 utilise seulement 4 types de données : Integer Number (int), Decimal Number (double), Text (string) et True / False ou Flag (bool).


Une fois de plus, nous devons faire attention aux types de données et ne pas les mélanger à notre insu, sous peine d'introduire de subtils bogues.


Une fois que vous avez créé votre modèle avec l'assistant, je vous suggère de commencer à "structurer" votre programme. L'unité de base de la structure dans MT4 est la FONCTION.


La fonction de base la plus simple, qui, telle qu'elle est écrite ici, ne fait rien en réalité, est la suivante .



void MaFonctionBasique()

{

}


Le modèle généré par l'assistant metatrader contient déjà trois fonctions vides.



int init()

{

return(0)

}



init deinit()

{

return(0)

}



int start()

{

return(0)

}


La fonction init est appelée à chaque fois que l'EA démarre lorsque vous le faites glisser sur un graphique et que vous cliquez sur le bouton Conseiller expert ON.

La fonction deinit est appelée chaque fois que l'EA s'arrête lorsque vous le faites glisser hors d'un graphique ou que vous cliquez sur le bouton OFF du conseiller expert


La fonction démarrer est appelée à CHAQUE NOUVEAU TICK reçu par le graphique auquel elle est attachée. Cela signifie qu'elle peut être appelée plusieurs fois ou plus par minute en fonction de l'activité du marché. C'est à partir de là que nous ferons la plupart de notre travail.


Pour l'instant, je vous suggère de mettre tout le pseudo-code du bloc principal dans la fonction start, puis de commenter le pseudo-code avec // sur chaque ligne.


Créez ensuite une nouvelle fonction pour le bloc des règles d'entrée et commentez le pseudo-code de la même manière.


Laissez les fonctions init et deint vides et telles quelles pour l'instant.


Vous devriez être en mesure de compiler ce code sans erreur, mais bien sûr, à ce stade, il ne fera rien.


Continuez à faire du bon travail !


Salutations

Tim

(PS nous pouvons parler sur skype si nécessaire mais voyons comment nous allons avec le forum pour le moment)

Dossiers :
 

Hé Tim,

Comme toujours, ton aide et ton temps sont très précieux ! En guise de remerciement, j'aimerais t'envoyer une très belle bouteille de champagne une fois que nous aurons terminé le processus de codage.

Oui, j'ai parcouru le livre mql plusieurs fois, la difficulté était de mettre la théorie en pratique. J'ai également imprimé une dizaine d'EA publiées sur ce site, pour voir comment les choses sont codées et assemblées, pour essayer de les comprendre. Et je passe beaucoup de temps dans le simulateur trader sur MT4 (c'est-à-dire backtesting et apprentissage des EA déjà existants).

Je vais commencer le processus de codage, et faire des blocs très clairs et séparés pour nous aider tous les deux à voir ce qui se passe. Et je vous les enverrai via le forum.

1 Question : Vous avez dit que les courtiers ont mis en place des choses pour arrêter le pipping agressif. 1. Quelle est votre définition du pipping agressif ? 2. Quelles sont les mesures qu'ils mettent en place ?

J'avais l'habitude de scalper manuellement l'eurusd sur les timeframes 1min (avec une méthode de spreadbetting), cela se passait très bien jusqu'à ce que le brokerage intervienne et commence à mettre des délais pour l'exécution (entrée et sortie). Donc maintenant, il n'y a plus aucun intérêt à faire cela avec ce courtier, même si c'est illégal, les retards se produiront toujours et gâcheront toute la journée (comme si vous scalpiez typiquement juste pour 1 heure, 2 retards et vous avez perdu le temps précieux). J'ai récupéré tout l'argent pour les transactions retardées après des menaces agressives d'action en justice.

2 Question : Utilisez-vous différents courtiers ? Quels courtiers recommanderiez-vous ? (si vous êtes autorisé à mentionner des noms ici)

Merci,

nick

Raison: