Accueil Trading Systématique Publication

Créer un Expert Advisor Simple avec l'Indicateur DeMarker sur MetaTrader 4

Pièce jointe
32418.zip (1.46 KB, Télécharger 0 fois)

Salut les traders ! Aujourd'hui, je vais vous parler de la création d'un Expert Advisor (EA) simple utilisant l'indicateur DeMarker. J'ai toujours pensé que l'utilisation d'un EA pouvait simplifier ma stratégie de trading, et je suis ravi de partager avec vous mon expérience avec cet outil. Après avoir lu cet article, n'hésitez pas à me donner votre avis !

Cet EA fonctionne sur une seule paire de devises. Les paramètres tels que le délai, les lots, le stop loss et le take profit peuvent être facilement modifiés dans le menu des propriétés.


extern ENUM_TIMEFRAMES TF  = PERIOD_CURRENT;// Sélectionner le délai
extern int period          = 8;// Période DeMarker
extern double lt           = 0.01;// Lots
extern int sl              = 100;// Stop Loss
extern int tp              = 100;// Take Profit
extern double OB           = 0.7;// Surachat
extern double OS           = 0.3;// Survente
extern bool OPENBAR        = false;// Trading au prix d'ouverture du nouveau chandelier

Voici le secret : je divise le code en trois parties principales :
1. Données | Délai
2. Ordre
3. Paire

//+------------------------------------------------------------------+

//-- Délai | Indicateur
double dmrk[5];
int signal  =-1;//-- 0. achat 1. vente
int hold = 0;

//-- Ordre
int ticket  =0;
double lot  =0.0;
int typ     =-1;



//-- Paire
datetime t1=0;
bool newbar=false;
bool entry =false;

//+------------------------------------------------------------------+

Dans la fonction OnInit(), j'initialise un tableau d'indicateurs DeMarker et vérifie également la taille minimale des lots pour répondre aux exigences spécifiques de certains courtiers.

//+------------------------------------------------------------------+
//|                                                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayInitialize(dmrk,0.0);
  //---
      const double test_lot   = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
      if(lt<test_lot)   lt    = test_lot;
  }

Dans la fonction OnTick(), je calcule l'indicateur et détermine les signaux d'achat et de vente.

//---------------------------------------------------------------------------
   signal = -1;
//---------------------------------------------------------------------------

//---calc
   for(int i=0; i<ArraySize(dmrk); i++)
     {
      dmrk[i]  =  iDeMarker(Symbol(),TF,period,i);
     }
//---

   if(dmrk[1] > OB)
     {
      hold = 1;//set
     }
   else
      if(dmrk[1] < OS)
        {
         hold = -1;//set
        }
      else
        {
         hold = 0;//reset
        }

   if(hold ==  1)
     {
      if(dmrk[0]<OB && dmrk[1]>OB)
        {
         signal = OP_SELL;
        }
     }
   if(hold == -1)
     {
      if(dmrk[0]>OS && dmrk[1]<OS)
        {
         signal = OP_BUY;
        }
     }

Pour ouvrir un signal d'achat ou de vente...

//---------------------------------------------------------------------------
   if(signal != -1)
      if(newbar==true)
         if(entry==false)//porte ouverte
           {
            //---
            entry =true;//set
            //---

            if(signal == OP_BUY)
              {
               ticket = OrderSend(Symbol(),OP_BUY,lt,Ask,(int)((Ask-Bid)/Point),
                                  sl>0?Bid-sl*Point:0.0,
                                  tp>0?Bid+tp*Point:0.0,
                                  EAName+":signal= "+IntegerToString(signal)+":hold= "+IntegerToString(hold),
                                  EANumber,
                                  0,
                                  clrBlue);
               signal=-1;
               //hold =0;
              }//reset
              }//reset signal

           }

Et pour la fermeture des ordres...

   if(entry == true) // fermeture
     {

      if(OrderSelect(ticket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime() == 0)//-- ordre actif
           {
            /*  todo condition de fermeture  */
            //entry = false;
           }
         //else
            if(OrderCloseTime() != 0)//--  fermeture par 1. manuel 2. sl/tp 3. ea
              {
               entry = false;//reset entry
              }
        }
     }

  



Articles connexes

Commentaire (0)