Affichage des articles dont le libellé est programmation. Afficher tous les articles
Affichage des articles dont le libellé est programmation. Afficher tous les articles

samedi 26 février 2011

Un premier indicateur customisé

Dans MetaEditor, allez dans 'File', 'New', puis 'Custom Indicator'. Donnez lui le nom que vous souhaitez et cliquez sur 'Suivant', 'Suivant', 'Terminer'.


Pour entrer tout de suite dans le vif du sujet, prenons un exemple d' indicateur.


Le Code :
#property copyright "Forex Automatique 2011"      // copyright
#property link "http://forex-automatique.blogspot.com/"
#property indicator_chart_window      // s' affiche sur le graphique
#property indicator_buffers 1         // nombre de Buffers

double Buff1[];           

int init()                       
  {
   SetIndexBuffer(0, Buff1);        // assignation de l' array Buff1 au buffer
   SetIndexStyle(0, DRAW_LINE, EMPTY, 2, Red);
   return                    
  }

int start()                       
  {              
   int i = Bars;                      // nombre de périodes 
   while(i >= 0)                   
     {
      Buff1[i] = High[i]            // valeur du Buffer pour chaque période
      i--;                   
     }
   return;                        
  }

Explications :
Dans ce code, le mot "Buffer" apparaît plusieurs fois. Les buffers sont indispensables pour créer des indicateurs en MQL4. Ce sont des espaces mémoire qui contiennent toutes les valeurs que prend un indicateur.
Le buffer est un array, sa déclaration est réalisée par :
double Buff1[];            
et 
SetIndexBuffer(0, Buff1);  

La fonction SetIndexStyle définit la forme de l' indicateur.
SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color = CLR_NONE)

   - index est le numéro du buffer de l' indicateur associé ( doit être compris entre 0 et 7 ).

   - type est la forme sous laquelle doit se présenter l' indicateur. Au choix parmi :

ConstanteValeurDescription
DRAW_LINE0Ligne
DRAW_SECTION1Sections
DRAW_HISTOGRAM     2Histogramme
DRAW_ARROW3Symboles
DRAW_ZIGZAG4Zig-Zag
DRAW_NONE12              Ne rien dessiner

   - style voir en-dessous.

   - width est la grosseur des lignes ( 1, 2, 3, 4, ou 5 ).
Si width est égal à 1 et que l' indicateur est une ligne, la variable style peut prendre les valeurs suivantes :

ConstanteValeurDescription
STYLE_SOLID 0Ligne continue
STYLE_DASH 1Ligne discontinue
STYLE_DOT 2Pointillés
STYLE_DASHDOT 3
STYLE_DASHDOTDOT     4

   - color est la couleur que prendra l' indicateur.


Dans notre exemple de code, l' indicateur est une courbe attachée au graphique qui suit le plus haut de chaque période. Pour l' installer, cliquez sur 'Compile'. L' indicateur se trouve alors dans l' onglet 'Indicateurs Programmés' de la fenêtre 'Navigateur'.



Si on modifie certaines parties du code, la forme de l' indicateur change radicalement...
Avec des symboles à la place de la courbe :

Dans une fenêtre séparée :
( remplacement de #property indicator_chart_window par #property indicator_separate_window ).

En histogramme :

La directive #property

Il est possible en MQL4 d' appeler en tout début de programme certaines variables prédéfinies. On utilise pour cela la directive #property.


Exemples :
#property copyright "Forex Automatique 2011"   // copyright
#property link "http://forex-automatique.blogspot.com/" 

// lien vers un site web
#property indicator_chart_window 

// indicateur affiché sur le graphique
#property indicator_separate_window

// indicateur affiché dans une fenêtre séparée
...

---> Leçon suivante

Initialisation et Déinitialisation

Les fonctions init et deinit sont des fonctions mql4 spéciales ( comme la fonction start ).


Init() :
Init est appelée en tout premier lieu. Elle permet l' initialisation du programme, l' assignation des variables qui ne bougent pas. Elle s' exécute une seule fois à chaque compilation du code, ou redémarrage de l' Expert Advisor ou de l' indicateur, et est directement suivie par la fonction start.


Deinit() :
Deinit est rarement utilisée car rarement utile. Elle est lancée lors de l' arrêt d' un programme. Son rôle est de remettre à zéro la valeur toutes les variables assignées.

---> Leçon suivante

lundi 7 février 2011

Sleep et MessageBox

Sleep
Sleep est une fonction qui suspend l' éxécution d' un programme durant un temps prédéfini ( compté en millisecondes ).


Exemple :
Par exemple, si l' on veut que le programme stoppe pendant 15 secondes, on inclura ce qui suit dans le code.
Sleep(15000);
Sleep n' a pas de d' utilité évidente dans la programmation des Expert Advisor, mais le MQL4 comme tous les autres langages permet néanmoins l' emploi de cette fonction.


MessageBox
MessageBox est une fonction qui affiche une boîte de dialogue paramétrable.


Son utilisation est idéale pour le trading semi-automatique.


La fonction :
int MessageBox(string texte, string titre, int flags)

La chaîne text contient le message qui sera affiché sur la boîte de dialogue, la chaîne titre contient son en-tête.
Il faut aussi définir les boutons qui seront présents sur la boîte de dialogue ( variable flags ) :
0x00000000 OK
0x00000001 OK et Cancel.
0x00000002 Abandonner, Recommencer, et Ignorer.
0x00000003 Oui, Non, et Cancel.
0x00000004 Oui et Non
0x00000005 Recommencer et Cancel


Exemple d' utilisation :
int message1 = MessageBox("Voulez-vous continuer ?", "Attention !", 0x00000002);

La fenêtre de dialogue apparaît à l' écran. Selon le bouton cliqué ( ici Abandonner, Recommencer, ou Ignorer ), la variable message1 qui y est associée prendra une valeur différente ( voir ci dessous ).


BoutonValeur
OK1
Cancel
2
Abandonner
3
Recommencer
4
Ignorer
5
Oui
6
Non
7



---> Leçon suivante

vendredi 4 février 2011

Open, Close, High, Low, Volume, et Time

Il est possible en MQL4 d' accéder aux données d' un graphique. Un programme peut en effet récupérer l' historique des périodes d' une paire. La durée de la période dépend directement de l' échelle du graphique sur lequel l' Epert Advisor est installé.


Exemple d' utilisation :
int start()
  {
   int i = 0;
   double max = High[i];
   double min = Low[i];
   double ouverture = Open[i];
   double cloture = Close[i];
   double volume = Volume[i];
   double time = Time[i];
   return;
  }
High, Low, Open, et Close retournent respectivement les valeurs de la période : le cours le plus haut, le plus bas, l' ouverture, et la clôture. Volume renvoie le volume total échangé et Time le nombre de secondes écoulées depuis le premier janvier 1970 pour la période.

Ces variables prédéfinies prennent un paramètre. 0 correspond à la période la plus récente, 1 à la dernière période avant la plus récente, 10 à la 10ème période avant la plus récente...

---> Leçon suivante

mardi 1 février 2011

Connecter un EA avec un indicateur technique

Une des grandes forces du MQL4 est la possibilité de relier les actions d' un Expert Advisor avec les données fournies par un indicateur technique. Les indicateurs les plus connus disposent de leur propre fonction d' appel.


Exemple avec l' indicateur Awesome Oscillator :
La fonction de cet indicateur est iAO.
double iAO(string symbol, int timeframe, int shift)
Cet fonction d' appel comprend 3 paramètres :

    - symbol : est le symbole de la paire traitée. ( EURUSD, CADJPY, ... ). On le remplace souvent par Symbol() qui renvoie directement le nom de la paire sur laquelle est installée l' Expert Advisor.

   - timeframe : est l' échelle du graphique, ce qui influe directement sur la longueur des périodes. Son unité est la minute. Laisser 0 pour que l' Expert Advisor la détecte automatiquement.

   - shift : valeur pour la énième période.


Utilisation :
double valeur = iAO(Symbol(), 0, 0);
La variable valeur est égale au dernier bâton de l' Awesome Oscillator.
double valeur2 = iAO(Symbol(), 0, 10);
La variable valeur2 est cette fois égale au bâton de la 11ème dernière période.


Un Expert Advisor AO :
Le programme suivant va afficher des alertes lorsque l' indicateur passera d' une valeur négative à une valeur positive.
int start()
  {
   double valeur1 = iAO(Symbol(), 0, 0);
   double valeur2 = iAO(Symbol(), 0, 1);
   if (valeur1 < 0 && valeur2 > 0)
    {
     Alert("Signal d achat !");
    }
  return;
  }

Voir la liste de toutes les fonctions d' appel des indicateurs.

---> Leçon suivante

lundi 31 janvier 2011

Les couleurs en MQL4

Les couleurs sont contenues dans les variables color.


La fonction :
Il y a 3 manières d' associer une couleur à sa variable :

    - les données litérales
color couleur1 = C'128,128,128';
On les annonce avec 'C'', suivi des 3 intensités RGB.

   - les représentations entières ( désuètes )

   - les noms de couleur
color couleur2 = Red
C' est ce qui sera toujours utilisé dans ce tutoriel.
Vous avez le choix parmi toutes les couleurs ci-dessous.

Black DarkGreen DarkSlateGray Olive Green Teal Navy
Purple Maroon Indigo MidnightBlue DarkBlue DarkOliveGreen SaddleBrown
ForestGreen OliveDrab SeaGreen DarkGoldenrod DarkSlateBlue Sienna MediumBlue
Brown DarkTurquoise DimGray LightSeaGreen DarkViolet FireBrick MediumVioletRed
MediumSeaGreen Chocolate Crimson SteelBlue Goldenrod MediumSpringGreen LawnGreen
CadetBlue YellowGreen LimeGreen OrangeRed DarkOrange Orange Orchid
Gold Yellow Chartreuse Lime SpringGreen Aqua DeepSkyBlue
Blue Magenta Red Gray SlateGray Peru BlueViolet
LightSlateGray DeepPink MediumTurquoise DodgerBlue Turquoise RoyalBlue SlateBlue
IndianRed MediumOrchid GreenYellow MediumAquamarine DarkSeaGreen Tomato RosyBrown
MediumPurple PaleVioletRed Coral CornflowerBlue DarkGray SandyBrown MediumSlateBlue
BurlyWood HotPink Salmon Violet LightCoral SkyBlue LightSalmon
Plum Khaki LightGreen Aquamarine Silver LightSkyBlue LightSteelBlue
PaleGreen Thistle PowderBlue PaleGoldenrod PaleTurquoise LightGray Wheat
Moccasin LightPink Gainsboro PeachPuff Pink Bisque LightGoldenrod
LemonChiffon Beige AntiqueWhite PapayaWhip Cornsilk LightYellow LightCyan
DarkKhaki DarkOrchid Tan DarkSalmon LightBlue NavajoWhite BlanchedAlmond
Lavender MistyRose OldLace WhiteSmoke Seashell Ivory Honeydew
LavenderBlush MintCream Snow White AliceBlue Linen


---> Leçon suivante

vendredi 28 janvier 2011

Les paramètres de compte

Il est possible en MQL4 de coder très simplement des instructions qui renvoient les paramètres de votre compte...


Montant de la balance
double balance = AccountBalance()

Somme engagée
double sommeengagee = AccountCredit();

Nom du Broker
string companie = AccountCompany();

Devise du compte
string monnaie = AccountCurrency();

Equité
double equite = AccountEquity();

Marge disponible
double margedispo = AccountFreeMargin();

Effet de levier actuel
double levier = AccountLeverage();

Marge
double marge = AccountMargin();

Nom du compte

string nom = AccountName();

Numéro du compte
int numero = AccountNumber();

Nom du serveur
string serveur = AccountServer();

mardi 25 janvier 2011

Fermer un ordre

Si tout ne se passe pas comme prévu, ou bien si l' ordre n' a pas de Stoploss ni de Takeprofit, il est nécessaire de clore la position à un moment ou à un autre. Il faut donner l' ordre à Metatrader de fermer la position grâce à la fonction OrderClose().


La fonction :
bool OrderClose(int ticket, double nblots, double prix, int slippage, color arow = CLR_NONE)
Cette fonction est booléenne ( comme true et false ). C' est logique, il n' y a que 2 dénouements : soit l' ordre est stoppé, soit il ne l' est pas.   

   - ticket : est le ticket ( numéro unique ) de l' ordre passé sur lequel l' ordre de clôture porte.

   - nblots : est le nombre de lots que concernent l' ordre de fermeture.

   - prix : est le prix auquel on souhaite clôturer l' ordre.

   - slippage : est la différence maximale de pips acceptée par le trader entre le prix souhaité et le prix auquel l' ordre est finalement exécuté.

   - arrow : indique un point ou une flèche sur la courbe du graphique Metatrader à l' endroit où l' ordre a été clôturé. Pas obligatoire.


A noter : pour fermer les ordres en attente, on utilise la fonction OrderDelete() de la même façon que OrderClose().


Un exemple d' utilisation :
La fonction suivante va fermer tous les ordres, passés ou en attente, d' un seul coup s' il est 20 heures passées.

bool vrai = true;

int start()
  {
   int dath = Hour();
   if (dath > 20)
    {
     int i = OrdersTotal() - 1;
     while (i >= 0)
      {
       OrderSelect(i, SELECT_BY_POS);
       int type = OrderType();
       if (type == OP_BUY)
        {
     OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 2);
        }
       if (type == OP_SELL)
        {
     OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 2);
        }
       if (type == OP_BUYLIMIT || type == OP_BUYSTOP || type == OP_SELLLIMIT || type == OP_SELLSTOP)  
        {
         OrderDelete(OrderTicket());
        }
       i -= 1  // décrémentation i = i - 1
      }
    }
return;
}

Cette fonction contient beaucoup de nouveaux éléments que je vais expliquer un par un :

   - OrdersTotal() renvoie le nombre total d' ordre passé ou en attente.

   - OrderSelect() permet de sélectionner un ordre. Cette fonction prends en compte 2 paramètres : la place de l' ordre choisi ( ici c' est la variable i ), et la manière de trier les ordres. Ici, on classe les ordres du plus ancien au plus récent avec SELECT_BY_POS. Cela signifie que l' ordre le plus ancien est numéroté 0, le suivant 1, et ainsi de suite...

   - OrderType() désigne le type de l' ordre en question ( achat, vente, stop, limité )

   - OrderTicket() est le ticket unique de l' ordre.

   - OrderLots() est le nombre de lots engagés dans l' ordre.

   - OrderSymbol() est similaire à Symbol() et renvoie donc le nom de la paire traitée.

   - || correspond à OU dans une parenthèse. Dans le même registre && correspond à ET.

---> Leçon suivante

jeudi 20 janvier 2011

Le trading automatique

Définition :
Le trading automatique existe depuis les années 80. C' est une pratique couramment utilisée par les grandes banques et fonds d' investissement consistant à passer des ordres en bourse grâce à un robot qui analyse le marché avec des algorithmes. 
Elle est typique du Forex, encouragée par des frais de placement très bas et par la forte liquidité du marché ( permet d' acheter et de vendre rapidement ).

Peu à peu, le trading automatique se démocratise, même si les particuliers ne pourront jamais bénéficier des avances technologiques des entreprises financières.


Les atouts :
Le trading automatique apporte de grands avantages comparé au trading classique :
   - Les robots analysent plusieurs graphiques en même temps et passent des ordres à n' importe quelle heure du jour et de la nuit.
   - Les robots ne font pas d' erreur d' inattention.
   - Les robots effectuent des calculs très complexes en un temps record.
   - Les robots permettent le scalping.


Comment en apprendre plus ?
Metatrader est la plateforme de trading la plus utilisée et la plus accessible pour y installer des robots ( appelés Expert Advisor ). Metatrader est proposé par la plupart des brokers forex.

Ces robots doivent être programmés en MQL4 ( voir tutoriel ), un langage de programmation propriétaire spécialement conçu et très flexible. Ils peuvent par exemple être basés sur l' historique des cours, ou bien sur les indicateurs techniques.

---> Tutoriel FOREX

lundi 17 janvier 2011

Math, Modulo, For, et Break

Au cours de cette leçon, nous allons voir les dernières notions de base qu' il vous manque, ainsi que 2 opérateurs.


Opérations utiles avec Math :
double MathAbs(double x)     // valeur absolue
double MathSqrt(double x)    // racine carrée

double MathPow(double x, double exposant)    // exposant



Modulo :
Les personnes qui ont de bonnes notions en maths le connaissent déjà. Le modulo est tout bêtement le reste d' une division. L' opérateur s' écrit %.
Ainsi par exemple,
10 % 2 = 0 ( car 10 = 2 * 5 + 0 )
11 % 3 = 2 ( car 11 = 3 * 3 + 2 )
13 % 4 = 1 ( car 13 = 4 * 3 + 1 )


For :
For agit exactement de la même manière que while. La seule différence est la syntaxe. C' est pourquoi ce n' est pas la peine de nous attarder dessus. Si vous le rencontrez, vous n' aurez aucune peine à en comprendre le fonctionnement.


Break :
Break sert à sortir d' une boucle.
Par exemple, si on souhaite trouver le premier nombre supérieur à 1000 et divisible par 27, on utilisera ce type de code :
bool vrai = true;
int y = 1000;

double start()         
   {         
    if (vrai == true)
     {
      vrai = false;
      while (1 == 1)     // toujours vrai !
       {
        if (y % 27 == 0)
         {
          Alert(y);
          break;
         }
        y ++           
       }
     }
   return;
   }

Cet exemple est certes assez tordu, mais il illustre bien le potentiel d' exploitation de l' opérateur break.

---> Accéder au Tutoriel MQL4 avancé

Jouer un son

Les programmes MQL4 peuvent jouer un son grâce à la fonction PlaySound.
Pour ce, allez tout d' abord dans le dossier où a été installé Metatrader. Puis rendez-vous dans le dossier 'sounds'.

Vous voyez une liste de fichiers sons .wav. Il est possible de rajouter de nouveaux sons ou musiques dans ce dossier.


Le code :
bool vrai = true;

double start()
  {
   if (vrai == true)
    {
     vrai = false;
     PlaySound("alert2.wav");
    }
  return;
  }
  
Remplacez alert2.wav par le nom du fichier son de votre choix.

vendredi 14 janvier 2011

MarketInfo()

MarketInfo est une fonction extrêmement utile. Elle permet entre autres d' affecter à une variable la valeur de la demande ou de l' offre à un moment donné. Elle agit différemment des fonctions Ask et Bid, comme nous allons le voir.


MarketInfo VS Ask et Bid :
La fonction calcul permet de définir les variables offre et demande, toutes deux associées respectivement à Bid et Ask.
double calcul()
  {
   double offre = Bid;
   double demande = Ask;
   return;
  

Que se passe-t-il si la valeur de l' offre ( Bid ) ou de la demande ( Ask ) évolue ? Les variables offre et demande varieront exactement de la même manière.

Maintenant, voici une fonction calcul qui utilise MarketInfo.
double calcul()
  {
   double offre = MarketInfo(Symbol(), MODE_BID);
   double demande = MarketInfo(Symbol(), MODE_ASK);
   return;
  

Cette fois, les variables offre et demande gardent la valeur de l' offre et de la demande au moment où la fonction est exécutée. Quelque soit soit l' évolution du cours, elles resteront constantes.


MarketInfo pour les ordres stop et à court limités :

bool vrai = true;

int
start()

  {
   if (vrai == true)
    {
     vrai = false;

     double demande = calcul();
     OrderSend
(Symbol(), OP_BUYLIMIT, 0.1, demande-5*Point, 3, demande-15*Point, demande+15*Point, "Premier ordre !", 1);

    }
   return
;

  }

double calcul()
  {
   double ask =
MarketInfo(Symbol(), MODE_BID);
   return(ask);   // ne pas oublier de retourner la valeur ask
  

En clair, que fait cette fonction ?
Elle ouvre un ordre 'en attente'. Dès que la valeur de la demande aura baissé de 5 pips, l' ordre s' exécutera.
C' est un ordre à court limité.

 ---> Leçon suivante

lundi 10 janvier 2011

True or False

True ( vrai ) et False ( faux ) sont 2 variables complémentaires d' un autre type : ce sont des variables booléennes. Deux choix possible : soit l' une soit l' autre.
Elles ont beaucoup d' applications dans les Expert Advisor.


Exemple :
Vous le savez, les Expert Advisor font tourner la fonction start en boucle. True et False vont être très utiles pour faire en sorte de ne plus voir s' afficher des alertes toutes les 2 secondes...
Exemple avec la fonction de la leçon précédente :
double midi = 12.00;
bool vrai = true;


double start()              
  {                
   int dats = Seconds();
   int datm = Minute();
   int dath = Hour();
   if (vrai = true)
    {
    vrai = false;

    Alert("Il est ", dath, ":", datm, ":", dats);
    if (midi > dath)
     {
      double h = midi - dath;
     Alert("Plus que ", h, " heures avant midi !");
     }
    else
     {
      double h24 = midi + 24 - dath; 
      Alert("Plus que ", h24, " heures avant midi !");
     }
    }

   return;
  }

---> Leçon suivante  

vendredi 7 janvier 2011

Sleep

Sleep
Sleep est une fonction qui suspend l' éxécution d' un programme durant un temps prédéfini ( compté en millisecondes ).


Exemple :
Par exemple, si l' on veut que le programme stoppe pendant 15 secondes, on inclura ce qui suit dans le code.
Sleep(15000);
Sleep n' a pas de d' utilité évidente dans la programmation des Expert Advisor, mais le MQL4 comme tous les autres langages permet néanmoins l' emploi de cette fonction.

Les conditions If et Else

Les conditions sont inévitables en MQL4. Comme leurs noms l' indiquent, If ( si ) et Else ( sinon ) vont déclencher des instructions selon les circonstances.


If et Else:
Disons que le cours EUR/USD est actuellement de 1,28. Je veux écrire un programme qui m' alerte automatiquement lorsque le change EUR/USD dépasse les 1,29. Si le change baisse sous la barre des 1,25, je veux aussi être averti.

double start()                 // fonction start
  {                       
   double cours = Ask;         // taux de change actuel
   if (cours > 1.29)           // Condition
     {   
      Alert(" Le taux de change EUR/USD a dépassé les 1,29 !");
     }
   if (cours < 1.25)
    {    
     Alert(" Le taux de change EUR/USD est passé sous la barre des 1,25 !");
    }
   return;                      
  }

Attention à bien respecter la syntaxe. Une pratique courante consiste à indexer ( espacer ) les instructions les unes par rapport aux autres pour rendre le code plus clair.

Else s' utilise toujours avec au moins un If et seulement dans le cas où une condition n' est pas atteinte. Nous le reverrons plus loin dans des exemples.

---> Leçon suivante