les aventures d'un débutant

 

Hey les gars, merci de m'aider avec mon code, il est 2h11 du matin à Londres, et j'essaie de décrypter cette énigme mql depuis un moment maintenant. Au fait, CodesGuru, merci pour les tutoriels, ils sont plus clairs que les trucs standards proposés, bel effort !


Je suis sur une quête de débutant pour coder une stratégie et comme toujours j'ai besoin de l'aide des pros pour cela.


Je suis en train de coder une stratégie pour les débutants et j'ai toujours besoin de l'aide des professionnels.


Je suis coincé sans savoir pourquoi. De plus, j'ai aussi besoin d'y ajouter ceci : 1. Le code doit exécuter des transactions longues et courtes sans tenir compte du fait qu'il y a déjà une transaction ouverte dans la direction opposée (par exemple : s'il y a une transaction longue ouverte, le code doit quand même entrer une position courte si les conditions sont remplies). Je suppose que je dois jouer avec la fonction'OrdersTotal()==0 ; mais je ne sais pas quoi faire.


Merci de m'aider. Le code est joint. (J'ai essayé de le joindre mais pour une raison quelconque, il ne le fait pas, une idée de ce qui se passe ?)


Je promets une bonne bouteille de champagne à la personne qui m'aidera le plus à faire vivre ce code :-)


ps : Je teste ceci dans le simulateur mt4/strategy tester.


J'attends votre aide avec impatience !

nick

 
//+------------------------------------------------------------------+
//|                                     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); 
      }
   //Declaration
   
  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;

 
 

   if(OrdersTotal()==0)   // one order at the time
      {
      // Short  Entry
      static int ticket;
      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());
            }
            if(OrdersTotal()==0)   // one order at the time
            if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
         
         {
         if( e1over2 && e2over3) //buy function                                                                    
         ticket=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( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            }
            else Print("Error opening BUY order : ",GetLastError());
            return(0);     
         }
 
            
            

            
            
            
            return(0);     
         }
         
         
  
   return(0);
   }
   }
C'est le code, les gars !
 

Wow ! Très bon travail de codage pour un "débutant". Vous pouvez écrire votre code de façon beaucoup plus concise que je ne le fais.


Je remarque que vous avez deux lignes conditionnelles-if identiques pour la section BUY, alors que la section SELL n'en a qu'une.


La deuxième condition-if identique pour la fonction BUY est probablement inoffensive, mais est-elle nécessaire ?


            if(OrdersTotal()==0)   // un ordre à la fois
if(e1over2 && e2over3) //cela peut être désordonné car l'ancienne version avait ==1 pour toutes les variables <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< voici la première

{
if(e1over2 && e2over3) //acheter la fonction <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< voici la seconde
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,0,Green) ; //À quoi sert 12345 ? J'ai ajouté ASk-30*Point pour le stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture d'un ordre BUY : ",GetLastError()) ;
return(0) ;
}


De plus, il semble que les fonctions Vendre et Acheter soient contenues dans le même Conditionnel-if :



if(OrdersTotal()==0) // un ordre à la fois
{
// Entrée courte
static int ticket ;
if(e1under2 && e2under3) // fonction courte
{ // La parenthèse correspondante est bien en dessous de la fonction SELL et BUY<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<voir ci-dessous
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("Ordre SHORT ouvert : ",OrderOpenPrice()) ;
}


if(OrdersTotal()==0) // un ordre à la fois
if(e1over2 && e2over3) //cela peut être désordonné car l'ancienne version avait ==1 pour toutes les variables

{
if(e1over2 && e2over3) //fonction d'achat
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green) ; //À quoi sert 12345 ? J'ai ajouté ASk-30*Point pour le stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture d'un ordre BUY : ",GetLastError()) ;
return(0) ;
}







return(0) ;
} // il s'agit de la parenthèse correspondante à celle présentée ci-dessus <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< voir ci-dessus


return(0) ;
}
}





L'ordre d'achat est soumis aux critères de vente de la manière dont vous avez organisé la conditionnalité.









 
niko:
c'est le code les gars !

La raison pour laquelle il ne passe jamais d'ordre long est que vous n'avez pas fermé le bloc de code qui exécute l'ordre court avec une accolade de fermeture. Cela signifie essentiellement que vous n'exécutez un ordre long que si (e1under2 && e2under3) AND (e1over2 && e2over3) ce qui, j'imagine, ne se produira pas.


Vous dites que vous souhaitez ouvrir un ordre même s'il y a déjà un ordre ouvert dans l'autre sens. J'en déduis que vous voulez limiter le nombre d'ordres à un maximum d'un dans chaque direction. En incluant la vérification que OrdersTotal() est égal à zéro, cela vous limite effectivement à un ordre au total, et non à un dans chaque direction. Ce que vous devez faire est de vérifier le nombre et le type d'ordres existants en utilisant une boucle et des compteurs (beaucoup d'exemples sur ce site), puis d'utiliser le résultat pour déterminer si un ordre doit être passé.


J'ai remarqué que dans votre autre message, vous avez mentionné que vous vouliez apprendre à écrire MQL, donc je ne vais pas écrire ceci pour vous. Cet exemple est exactement le type de code simple et logique qui est essentiel dans le processus d'apprentissage.


Faites-le pour vous et dites-moi comment vous vous en sortez.

 

Hé les gars, vous êtes des légendes ! !!

Merci pour vos commentaires FXTrader2008 et cloudbreaker. Je n'avais pas remarqué qu'il y avait une condition répétée pour l'achat, je l'ai supprimée, et cela a du sens concernant le crochet qui n'est pas fermé. Bonne idée de ne pas me donner la réponse codée, car je veux apprendre le code moi-même. Je vais regarder en ligne pour les boucles et les compteurs.

Oh, la raison pour laquelle le code est si joli et compact est qu'un de mes amis m'a aidé à le mettre en place (il est programmeur).

Je vais continuer avec mon côté des choses et si je suis coincé, je vous le ferai savoir !

Est-ce que vous traitez les marchés en direct de manière indépendante ou travaillez-vous pour metaquotes ?

 

Je n'ai pas regardé profondément dans votre code, mais un premier conseil :


Essayez de structurer votre code plus clairement - nous ne faisons pas cela pour le plaisir mais pour une meilleure lecture et compréhension ! Cela n'a aucune influence sur le "sens" ou la signification du code...


Voyons, comment votre code DEVRAIT se présenter (seulement la partie essentielle) :

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   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());
        }
      if(OrdersTotal()==0)   // one order at the time
      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
            ticket=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( ticket>0)
           {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError());
         return(0);    
        }
      return(0);    
     }
   return(0);
  }
 

Comme vous pouvez le voir maintenant : Vous ne testez que votre condition "courte".

   // Short  Entry
   static int ticket;
   if( e1under2 && e2under3)     // short function

et à l'intérieur de celle-ci vous testez la condition "longue", deux fois - par sécurité ; ) - ça ne peut pas marcher.

      if( e1over2 && e2over3)     //this may be messy cos old version had ==1 for all variables
        {
         if( e1over2 && e2over3) //buy function                                                                    
 

Mieux : (mais loin d'être parfait)

if(OrdersTotal()==0)   // one order at the time
  {
   // Short  Entry
   static int ticket;
   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());
        } }
   if( e1over2 && e2over3) //buy function {
      ticket=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 ( ticket>0)
        {
         if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
        }
      else Print("Error opening BUY order : ",GetLastError());
     }
  return(0);
  }

Maintenant, cela devrait fonctionner pour les transactions courtes et longues.

Je recommande vivement de lire ce livre ici sur MQL4 - en particulier la section Création d'un programme normal - il est très bien écrit et vous pouvez facilement mettre en œuvre votre stratégie. J'ai aussi commencé ainsi...

Si vous téléchargez les fichiers ici et que vous avez des problèmes avec les commentaires (puisqu'ils sont en cyrillique) ouvrez "word", copiez/collez la source de chaque fichier depuis la page internet (puisque les commentaires sont en anglais) vers word et enfin copiez/collez de word vers Metaeditor. A partir de maintenant, vous pouvez étudier les programmes en anglais.


J'espère avoir pu vous aider...


(Au fait : Je suis aussi très nouveau dans MQL4 mais je travaille comme programmeur et donc la syntaxe et la structure ne sont pas un problème pour moi...)


Salutations TuRRiCAN

 
Oups, dans le temps qu'il m'a fallu pour répondre, les autres ont été plus rapides...
 
TuRRiCAN wrote >>
Ooops, dans le temps dont j'ai eu besoin pour répondre, les autres ont été plus rapides ...

Hey Tourrican, c'est très utile, merci ! Cyrillique pas de problème, je suis russe, de Sibérie en fait.

Oui, j'ai étudié le livre mql, mais il est encore en dehors de l'apprentissage pratique, c'est une toute autre chose de l'étudier et puis d'essayer d'écrire un programme vous-même (parce qu'ils n'expliquent pas clairement avec des exemples réels dans chaque partie du livre, pourquoi et comment ces choses sont utilisées vous savez.

Mais je vais y arriver, le désir brûlant en moi de faire ce travail est plus grand que tout obstacle.

 
niko:

Traitez-vous les marchés en direct de manière indépendante ou travaillez-vous pour metaquotes ?

Pour répondre à votre question, je travaille normalement comme pilote d'hélicoptère. Cependant, étant donné la situation économique, la société pour laquelle je travaille ne veut pas voler en ce moment. Donc, dans l'intervalle, j'ai développé des EA pour une société qui appartient à mon meilleur ami. Nous faisons du trading en direct pour le compte de fonds assez connus.

Je suis heureux que vous essayiez d'apprendre à coder et je vous aiderai quand je le pourrai. C'est rafraîchissant de voir quelqu'un rejoindre le forum et vouloir apprendre à être autonome.