Besoin de l'aide d'un programmeur

Présentation, Développement, Améliorations et Ressources pour les Stratégies de Trading Automatique.

Modérateur : Administrateurs

Répondre
Message
Auteur
Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Besoin de l'aide d'un programmeur

#1 Message par Fabien LABROUSSE »

Besoin de l'aide d'un programmeur

Bonjour,

Je voudrais créer un ea à partir de l'indicateur BreakOut ci joint (qui indique des plus hauts et plus bas selon la tranche horraire définie par le trader).

Le but de l'ea: rentré une fois que le plus haut ou plus bas de la zone définit est franchit, avec un TP et un SL paramètrable. un ea de breakout tout simple donc. (peut etre que cela existe déja, si vous en connaissez, merci de m'indiquer l'adresse :wink: )

Merci par avance.

:D
Pièces jointes
breakout.mq4
Indicateur Breakout
(6.83 Kio) Téléchargé 445 fois
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
madjes
Administrateur
Messages : 1194
Inscription : 28 oct. 2008, 16:00

Re: Besoin de l'aide d'un programmeur

#2 Message par madjes »

ça serait cool que quelqu'un sache faire ça :D
"The market is like a beautiful woman-endlessly fascinating, endlessly complex, always changing, always mystifying." The Money Game - Adam Smith

L'art d'être tantôt très audacieux et tantôt très prudent est l'art de réussir-Napoléon Bonaparte

Avatar de l’utilisateur
ollytrader
Membre actif
Messages : 17
Inscription : 09 févr. 2009, 18:11

Re: Besoin de l'aide d'un programmeur

#3 Message par ollytrader »

Salut Fab,

Je voudrais bien te coder tout ce que tu veux...
des que j'ai un bout de temps...

Stephane (OllyTrader)
Parce que la valeur n'attend point le nombre des annees...

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#4 Message par Fabien LABROUSSE »

Merci Ollytrader pour ce très bon esprit!

En effet, je vais me répéter, mais l'union fait la force, et je pense que l'on peut vraiment avancer en s'entraidant.

De mon coté je travail sur la programmation depuis quelques mois maintenant mais je progresse doucement car j'y consacre peu de temps. Je pense que la programmation est indispensable à un trader meme manuel pour tester ses idées de stratégies sur le passé par exemple.

Tu travail dans la programmation?
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#5 Message par Fabien LABROUSSE »

Bonjour,

Avec le site http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/

J'ai tenté de créer un Expert Advisor reprenant la stratégie des croisements de moyennes mobiles dont je parle dans mes webinaires.

Cependant, quand je le lance, il ne prend pas d'ordre, et en relisant le code je ne voit pas où je me suis trompé, si quelqu'un a une idée...

(Voir l'expert en question ci-joint)

Merci par avance et bon weekend.

:wink:
Pièces jointes
reve.mq4
Reve, mon ptit expert advisor...
(9.82 Kio) Téléchargé 415 fois
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
madjes
Administrateur
Messages : 1194
Inscription : 28 oct. 2008, 16:00

Re: Besoin de l'aide d'un programmeur

#6 Message par madjes »

HéHé j'aime bien le nom :mrgreen:
Je vais regarder au cas où si j'ai une idée^^ bien joué en tout cas fab :wink:

ps : tu sais à quoi sert le magic number ?
"The market is like a beautiful woman-endlessly fascinating, endlessly complex, always changing, always mystifying." The Money Game - Adam Smith

L'art d'être tantôt très audacieux et tantôt très prudent est l'art de réussir-Napoléon Bonaparte

GrayEminence
Membre actif
Messages : 37
Inscription : 17 mars 2009, 10:01

Re: Besoin de l'aide d'un programmeur

#7 Message par GrayEminence »

Le "magic number" est une sorte d'identifiant pour MT4. Si jamais on fait tourner simultanement plusieurs EAs sur une même plateforme, MT4 saura qu'un code spécific s'adresse à un ordre spécific en se basant sur le magic number.

Il arrive parfois que deux EAs ont le même magic number, donc conflit, il suffit de changer l'un (si c'est possible) et le problème est résolu

Cheers,
GE

Avatar de l’utilisateur
madjes
Administrateur
Messages : 1194
Inscription : 28 oct. 2008, 16:00

Re: Besoin de l'aide d'un programmeur

#8 Message par madjes »

Super merci GrayEminence, je me suis toujours demandé à quoi il servait ce nombre :mrgreen:
"The market is like a beautiful woman-endlessly fascinating, endlessly complex, always changing, always mystifying." The Money Game - Adam Smith

L'art d'être tantôt très audacieux et tantôt très prudent est l'art de réussir-Napoléon Bonaparte

Avatar de l’utilisateur
damtoul
Membre actif
Messages : 35
Inscription : 28 mai 2009, 22:26
Localisation : Toulouse

Re: Besoin de l'aide d'un programmeur

#9 Message par damtoul »

Le magic number est la signature d'un EA. C'est préférable de toujours lui en assigner un. Perso je mets la date de création de l'EA en MM (les poules voleront quand je créerai deux EAs en un jour). Ex : 300509 pour l'EA d'aujourd'hui.

L'utilité c'est de pouvoir utiliser deux ou plus EAs différents sur une même paire :
1er chart EURUSD EA1 mm 10
2e chart EURUSD EA2 mm 11
3e chart EURUSD EA3 mm 10
4e chart GBPUSD EA4 mm 10
Dans ce cas l'EA2 s'occupera que de ses positions et que de ses positions. Par contre l'EA1 et l'EA3 pourraient bien se marcher sur les pieds et fermer les ordres l'une de l'autre....
Par contre vu que l'EA4 est sur une paire différente, le mm de 10 n'est pas important. Si on veut l'EA4 sur EURUSD il vaut mieux mettre un mm différent de 10 & 11. :)

Zou.

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#10 Message par Fabien LABROUSSE »

Avec Expert Advisor Builder, j'ai créé un expert très simple basé sur les bandes de bollinger.

J'ai voulu ajouter un système de martingale mais il y a une erreur que je n'arrive pas à corriger:

'(' - function definition unexpected \\192.168.0.1\Partage\bb-ea-martingale.mq4 (233, 25)

Pour ajouter ce système de martingale, je me suis aidé du code proposé sur ce forum:

http://www.tradingsystemforex.com/mql-p ... ngale.html

et voici ce qu'ils préconisent de faire:

After extern parameters, add :

Code:

extern double Lots=0.01;//|----------------------lots
extern bool Martingale=false;//|-----------------martingale
extern double Multiplier=2.0;//|-----------------multiplier martingale
extern double MinProfit=50;//--------------------minimum profit to apply the martingale

After start(){, add :

Code:

if(Martingale)CalculateMartingale();Balance=AccountBalance();

At the end of the code, add :

Code:

void CalculateMartingale()
{
double InitalLots=0.01;
double MinLots=MarketInfo(Symbol(),MODE_MINLOT);
double MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
if(Balance!=0.0)
{
if(Balance>AccountBalance())Lots=Multiplier*Lots;
else if((Balance+MinProfit)<AccountBalance())Lots=InitalLots;
else if((Balance+MinProfit)>=AccountBalance())Lots=Lots;
if(Lots<MinLots)Lots=MinLots;
if(Lots>MaxLots)Lots=MaxLots;
}
return(0);
}



Ci joint mon ea. Si quelqu'un peu m'aider ce serrait cool.
Pièces jointes
bb-ea-martingale.mq4
(10.25 Kio) Téléchargé 410 fois
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#11 Message par Fabien LABROUSSE »

Donc y'a vraiment personne qui pourrait me filer un coup de main sur ce coup?

Perso j'ai recherché des exemples de systèmes de martingales à droite à gauche mais aucun n'est semblable et j'ai du mal à me repérer et à comprendre la logique.

Enfin bon après ça viendra
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

curunir
Membre assidu
Messages : 226
Inscription : 15 nov. 2008, 17:15
Localisation : Agen

Re: Besoin de l'aide d'un programmeur

#12 Message par curunir »

J arrive pas a trouver l erreur , mais si tu veux je pense etre capable de faire une martingale enfin j arrive a faire exaxtement le contraire donc pourquoi pas , si tu veux je t en ferai une tres basique ac des commentaire pour que tu comprennent bien le fonctionnement mais en ce moment j ai vraiment trop de boulot a la fac

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#13 Message par Fabien LABROUSSE »

franchement c'est sympa de ta part mais si t'as du boulot te prend pas la tête, en ce moment j'apprend beaucoup et je bidouille pas mal de truc en mq4, donc j'arriverai bien à m'en sortir un de ces 4.
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
nvitale
Professionnel certifié
Messages : 260
Inscription : 21 mai 2009, 20:58
Localisation : London

Re: Besoin de l'aide d'un programmeur

#14 Message par nvitale »

Voilà le code qui compile. je te laisse le soin de mettre les paramètres qui te conviennent au début du code pour les variables MinLots, MaxLots, etc.

N'hésites pas à passer sur mon forum si tu as une question sur MQL4 car j'avoue manquer de temps pour suivre tous les forums.

Code : Tout sélectionner

#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 = False;
extern double Lots = 0.01;
extern int Slippage = 3;
extern bool UseStopLoss = True;
extern int StopLoss = 20;
extern bool UseTakeProfit = True;
extern int TakeProfit = 20;
extern bool UseTrailingStop = False;
extern int TrailingStop = 300;
extern bool Martingale=true;//|-----------------martingale
extern double Multiplier=2.0;//|-----------------multiplier martingale
extern double MinProfit=1;//--------------------minimum profit to apply the martingale

double Balance;
double InitalLots=0.1;
double MinLots=0.1;
double MaxLots=5;
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() {
   if (Martingale)CalculateMartingale();
   int Balance=AccountBalance();
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;
   double InitalLots=0.01;
   double MinLots=MarketInfo(Symbol(),MODE_MINLOT);
   double MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
   

   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;

   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+


double Buy1_1 = iClose(NULL, 0, Current + 0);
double Buy1_2 = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, Current + 0);
double Buy2_1 = iClose(NULL, 0, Current + 1);
double Buy2_2 = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, Current + 1);

double Sell1_1 = iClose(NULL, 0, Current + 0);
double Sell1_2 = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, Current + 0);
double Sell2_1 = iClose(NULL, 0, Current + 1);
double Sell2_2 = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, 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 && Buy2_1 < Buy2_2) Order = SIGNAL_BUY;

   if (Sell1_1 < Sell1_2 && Sell2_1 > Sell2_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;
   
   }
   
void CalculateMartingale()

{
   if(Balance!=0.0)
   {
      if(Balance>AccountBalance())Lots=Multiplier*Lots;
      else if((Balance+MinProfit)<AccountBalance())Lots=InitalLots;
      else if((Balance+MinProfit)>=AccountBalance())Lots=Lots;
      if(Lots<MinLots)Lots=MinLots;
      if(Lots>MaxLots)Lots=MaxLots;
   }

   return(0);
}

//+------------------------------------------------------------------+
Trading Automatique, le portail francophone du trading systématique et automatique.
Directeur d'Alpha Novae

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#15 Message par Fabien LABROUSSE »

C'est vraiment sympa de ta part nvitale! Merci beaucoup, je vais tester ça et je te tiens au courant des résultats obtenus.
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#16 Message par Fabien LABROUSSE »

Bonjour,

J'ai un problème avec l'EA ci joint.

Normalement, si il ouvre un position, il ne peut plus en ouvrir une nouvelle tant que la première n'est pas clôturée.

Quand je le lance et qu'il n'y a aucune position ouverte au préalable, tout se passe bien et il prend position normalement.

En revanche, si je le lance et qu'il y a déjà une position ouverte sur la même paire que celle sur laquelle il est appliqué, mais que cette position a été prise manuellement ou par un autre robot, alors il ne prend plus de position.

Pourtant normalement, le MagicNumber est justement fait pour que le robot différencie les trades qu'il passe des autres trades.

Peut être y a t'il une erreur dans le code à ce niveau, mais je ne trouve pas.

Si quelqu'un pourrait m'aider ce serait sympa.

Merci par avance :D
Pièces jointes
bb-ea.mq4
BB-ea
(9.97 Kio) Téléchargé 357 fois
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#17 Message par Fabien LABROUSSE »

Personne n'a d'idée vraiment?
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Avatar de l’utilisateur
nvitale
Professionnel certifié
Messages : 260
Inscription : 21 mai 2009, 20:58
Localisation : London

Re: Besoin de l'aide d'un programmeur

#18 Message par nvitale »

Voici le code qui devrait désormais marcher.

Code : Tout sélectionner

//+------------------------------------------------------------------+
//| 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 = 500;
extern bool SignalMail = False;
extern bool EachTickMode = False;
extern double Lots = 0.05;
extern int Slippage = 30;
extern bool UseStopLoss = True;
extern int StopLoss = 200;
extern bool UseTakeProfit = True;
extern int TakeProfit = 200;
extern bool UseTrailingStop = False;
extern int TrailingStop = 30;
extern int StartTime = 22;
extern int EndTime = 6;

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 + 0);
double Buy1_2 = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, Current + 0);
double Buy2_1 = iClose(NULL, 0, Current + 1);
double Buy2_2 = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, Current + 1);

double Sell1_1 = iClose(NULL, 0, Current + 0);
double Sell1_2 = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, Current + 0);
double Sell2_1 = iClose(NULL, 0, Current + 1);
double Sell2_2 = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, Current + 1);



   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+

   //Check position
   bool IsTrade = False;

   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
      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 && Buy2_1 < Buy2_2 && TradeSession() == 1) Order = SIGNAL_BUY;

   if (Sell1_1 < Sell1_2 && Sell2_1 > Sell2_2 && TradeSession() == 1) 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);
}

int TradeSession() {
   if (StartTime < EndTime && TimeHour(TimeCurrent()) < StartTime || TimeHour(TimeCurrent()) >= EndTime) return (0);
   if (StartTime > EndTime && (TimeHour(TimeCurrent()) < StartTime && TimeHour(TimeCurrent()) >= EndTime)) return (0);
   if (EndTime == 0) EndTime = 24;
   if (Hour() == EndTime - 1 && Minute() >= 55) return (0);
   return (1);
}
//+------------------------------------------------------------------+
Trading Automatique, le portail francophone du trading systématique et automatique.
Directeur d'Alpha Novae

Avatar de l’utilisateur
Fabien LABROUSSE
Administrateur
Messages : 16964
Inscription : 17 mars 2008, 19:41
Localisation : Paris, France

Re: Besoin de l'aide d'un programmeur

#19 Message par Fabien LABROUSSE »

Excellent Nvitale, merci pour ton aide, que dis-je, pour ton travail prêt à trader! j'en demandé pas tant! :D

Enfait j'avais surtout besoin de cette fonction pour mon compte réel court terme, donc je vais l'utiliser la nuit avec ce compte si tu veux voir ce que ça peut donner:

http://www.videobourse.fr/compte-de-dreamfab.php
Image

La Structure (par VideoBourse) : Formation sur mesure et évolutive pour optimiser compréhension et résultats en trading

📈 Informations et inscriptions : https://forms.gle/A2vnZduSwv2wPFSS7

🤝 Contact et échanges avec la communauté : Discord, mail, téléphone, LinkedIn...

Répondre