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

Mike 2020.12.17 01:28 73 0 0
Pièce jointe

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.


externENUM_TIMEFRAMES TF  = PERIOD_CURRENT;// Sélectionner le délaiexternint period          = 8;// Période DeMarkerexterndouble lt           = 0.01;// Lotsexternint sl              = 100;// Stop Lossexternint tp              = 100;// Take Profitexterndouble OB           = 0.7;// Surachatexterndouble OS           = 0.3;// Surventeexternbool 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 | Indicateurdouble dmrk[5];
int signal  =-1;//-- 0. achat 1. venteint hold = 0;

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



//-- Pairedatetime 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.

//+------------------------------------------------------------------+//|                                                                   |//+------------------------------------------------------------------+voidOnInit()
  {
   ArrayInitialize(dmrk,0.0);
  //---
      constdouble 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
              }
        }
     }

  



Liste
Commentaire 0