ASAR

 

J'en ai fini de payer des gens pour construire mes EAs. Il est enfin temps que je le fasse moi-même.

J'aimerais créer un modèle sur lequel je pourrais m'appuyer et qui s'appellerait ASAR (ATR Stop And Reverse), mais je ne sais pas trop par où commencer car ce sera mon premier EA. Comme le modèle non modifié ne serait qu'un ATR trailing stop (et reverse) avec une taille de lot ATR, il fonctionnerait sans interruption toute la semaine de l'ouverture à la fermeture du marché. Ainsi, le signal d'ouverture à l'ouverture du marché consisterait simplement à ouvrir dans la direction de la barre précédente (qui se trouve être la dernière barre de la clôture du marché précédent). Comme cela ne se produirait qu'une fois en début de semaine, cela nécessiterait-il un script ?

Comment dois-je m'y prendre pour coder cette opération ?

J'ai vu des exemples qui montrent le processus de codage, mais le problème de ces exemples est qu'ils ne montrent pas vraiment comment comprendre les choses qui ne sont pas présentées. Par exemple, le livre MQL4 de MetaQuotes est bon pour expliquer les bases accompagnées d'exemples spécifiques, mais dans tout ce que j'ai lu, je ne me rappelle pas avoir trouvé les informations qui me permettraient de comprendre le codage du signal de transaction initial que j'ai choisi pour le modèle.

 
ASAR:

Comment dois-je faire pour trouver comment coder ceci ?

Il semble que vous ayez compris que le codage est la partie facile... On peut vous apprendre à coder, à connaître les types de variables, la syntaxe du code... mais ce que vous demandez ici, c'est de résoudre des problèmes. C'est beaucoup plus difficile à enseigner...

Le meilleur conseil que je puisse te donner est d'écrire ce que tu veux faire... puis d'écrire comment tu le ferais si tu faisais du trading manuel... puis de développer cela étape par étape comme si tu montrais à un novice complet MT4... alors tu auras quelque chose que tu pourras coder.

 
RaptorUK:

On dirait que vous avez compris que le codage est la partie facile... On peut vous apprendre à coder, à connaître les types de variables, la syntaxe du code... mais ce que vous demandez ici, c'est la résolution de problèmes. C'est beaucoup plus difficile à enseigner...

Le meilleur conseil que je puisse te donner est d'écrire ce que tu veux faire... puis d'écrire comment tu le ferais si tu faisais du trading manuel... puis de développer cela étape par étape comme si tu montrais à un novice complet MT4... alors tu auras quelque chose que tu pourras coder.


Ok, je vais faire ça.

Merci pour vos conseils. Ce sera certainement une aventure.

 

Ok, j'ai résolu le problème de l'ouverture dans la direction de la barre précédente avec

(Bar 1 Close > Bar 1 Open ; OP_BUY)

(Bar 1 Close < Bar 1 Open ; OP_SELL)

Maintenant je me demande s'il existe un code pour l'ouverture d'un ordre à la clôture d'un ordre précédent ?

 
ASAR:

Ok, j'ai résolu le problème de l'ouverture dans la direction de la barre précédente avec

(Bar 1 Close > Bar 1 Open ; OP_BUY)

(Bar 1 Close < Bar 1 Open ; OP_SELL)

Maintenant je me demande s'il existe un code pour l'ouverture d'un ordre à la clôture d'un ordre précédent ?


Ça ne peut pas être la façon dont vous l'écrivez dans le MQ4.

Vous n'avez pas besoin de vous demander s'il existe un code pour l'ouverture d'un ordre à la clôture d'un ordre précédent.

vous devez seulement savoir comment le faire...

vous devez trouver dans votre historique d'ordres la dernière transaction fermée de votre EA et ensuite regarder son prix d'ouverture d'ordre, son prix de fermeture d'ordre et son type d'ordre.

 

Je vous remercie.

J'avais juste besoin d'un indice pour me mettre dans la bonne direction et les informations que vous avez fournies vont probablement le faire pour moi.

 

Ok, voici le code que j'ai généré sur le site Expert Advisor Builder pour ouvrir la première transaction.

//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder                  |
//|                http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ |
//|                                                                  |
//|  In no event will author be liable for any damages whatsoever.   |
//|                      Use at your own risk.                       |
//|                                                                  |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+
#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
#property copyright "Expert Advisor Builder"
#property link      "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"
extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 0.01;
extern int Slippage = 3;
extern bool UseStopLoss = False;
extern int StopLoss = 30;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = True;
extern int TrailingStop = 30;
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   BarCount = Bars;
   if (EachTickMode) Current = 0; else Current = 1;
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;
 
   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;
   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+
double Buy1_1 = iClose(NULL, 0, Current + 1);
double Buy1_2 = iOpen(NULL, 0, Current + 1);
double Sell1_1 = iClose(NULL, 0, Current + 1);
double Sell1_2 = iOpen(NULL, 0, Current + 1);
 
   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+
   //Check position
   bool IsTrade = False;
   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUY) {
            //Close
            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Buy)                                           |
            //+------------------------------------------------------------------+
            
            //+------------------------------------------------------------------+
            //| Signal End(Exit Buy)                                             |
            //+------------------------------------------------------------------+
            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            //Close
            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)                                          |
            //+------------------------------------------------------------------+
            
            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)                                            |
            //+------------------------------------------------------------------+
            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }
   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+
   if (Buy1_1 > Buy1_2) Order = SIGNAL_BUY;
   if (Sell1_1 < Sell1_2) Order = SIGNAL_SELL;
   //+------------------------------------------------------------------+
   //| Signal End                                                       |
   //+------------------------------------------------------------------+
   //Buy
   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }
         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;
         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
    Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
   } else {
    Print("Error opening BUY order : ", GetLastError());
   }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }
   //Sell
   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }
         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;
         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
    Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
   } else {
    Print("Error opening SELL order : ", GetLastError());
   }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }
   if (!EachTickMode) BarCount = Bars;
   return(0);
}
//+------------------------------------------------------------------+


And this is a loop that's been suggested to me that I'd like to add but am unsure of where to apply it.
 

for(int i=0;i < OrdersHistoryTotal() ;i++)
  {
   OrderSelect(i, 
SELECT_BY_POS)
   
   if (OrderMagicNumber() == InstanceID)
  
lastClosedDirection = OrderType() ;
  }

Can anyone tell me where this should be applied? 
 
ASAR:

Ok, voici le code que j'ai généré sur le site Expert Advisor Builder pour ouvrir la première transaction.

Oh là là... lisez ce message et le reste du fil de discussion: https://www.mql5.com/en/forum/139608
 
ASAR:

Il s'agit d'une boucle qui m'a été suggérée et que j'aimerais ajouter, mais je ne sais pas trop où l'appliquer.

Que fait ce code ? qu'est-ce que InstanceID ? que vas-tu faire avec lastClosedDirection ?
 
Si vous voulez utiliser le code Expert Advisor Builder, je vous suggère d'aller sur leur Forum pour obtenir de l'aide : http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/forum/viewforum.php?f=4
 
ASAR:

Ok, voici le code que j'ai généré sur le site Expert Advisor Builder pour ouvrir la première transaction.

Lorsque j'étais à l'université, le premier cours sur l'informatique consistait pour le professeur à dire bonjour. Si vous avez des problèmes, il y aura des séances de laboratoire et vous pourrez demander aux étudiants de troisième cycle - qui sont tenus d'aider pendant ces séances de laboratoire. On n'a pas tendance à enseigner l'informatique, on permet à la personne d'apprendre. L'un des premiers programmes du livre définissant le langage de programmation C consiste à écrire "HELLO WORLD" à l'écran. Ce n'est pas pour rien que l'on ne vous donne pas un programme de 1000 lignes et que l'on vous demande d'y apporter des modifications !

Ce soi-disant Expert Adviser Builder est un handicap pour quiconque souhaite sérieusement créer des EA et les négocier pour de l'argent. Vous devez être capable de regarder n'importe quelle ligne de code dans votre EA et savoir ce qu'elle fait et pourquoi. Je n'utiliserais pas le code de quelqu'un d'autre. Regardez et voyez ce qu'ils font et faites quelque chose de similaire, mais écrivez chaque ligne vous-même, si vous êtes sérieux.

Et le code du constructeur d'EA n'est pas un bon code, à mon avis.