Discussion de l'article "Guide étape par étape pour rédiger un conseiller expert en MQL5 pour les débutants" - page 29

 
Le fichier contenu dans le téléchargement est erroné, veuillez le corriger.
 

Bonjour à tous,

J'ai actuellement l'EA de Samuel en cours d'exécution sur un compte de démonstration et je suis tout à fait satisfait. La programmation est bonne !

Il montre de temps en temps de bonnes séquences de trading, mais il a une faiblesse :

Les options SELL s'accumulent à des points d'inflexion dans le creux du graphique et il en va de même aux points culminants correspondants avec les options BUY, qui sont alors massivement comptabilisées comme négatives. J'aimerais reprogrammer cela, c'est-à-dire acheter en journée et vendre au sommet, mais je n'y parviens pas encore. Je ne maîtrise que rudimentairement MQL5.

Quelqu'un peut-il m'aider ?

SG et merci beaucoup !

 

Ce genre de choses ne fonctionne généralement pas, car les autres points où l'EA prend une position profitable sont alors également inversés ....

Lisez cependant ceci :

Cahier des charges EA-freelancer : https://www.mql5.com/fr/articles/4368
Indi : https://www.mql5.com/fr/articles/4304
How to Order a Trading Robot in MQL5 and MQL4 : https://www.mql5.com/fr/articles/117

Avec les indications qui s'y trouvent, tu peux préciser ton idée, que ce soit juste pour toi, pour voir si c'est possible, ou que ce soit pour demander à quelqu'un de le faire, avec ou sans rémunération.

So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
  • www.mql5.com
Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
 

Bonjour à tous (surtout à l'auteur)

J'ai codé en suivant cet article. Je l'ai beaucoup apprécié et j'ai beaucoup appris.

Merci d'avoir écrit un article aussi instructif.

Cependant, j'ai un problème. Mon EA n'a pas passé d'ordre. J'ai téléchargé le code de l'auteur mais il n'a pas passé d'ordre non plus.

Comme l'article date de 13 ans, je suppose que le code est maintenant dépassé. Quelqu'un peut-il m'aider ?

Mon code se trouve dans le fichier ci-dessous. Merci d'avance.

Dossiers :
myFirstEA.mq5  25 kb
 

Bonjour, je tiens à vous avertir que je suis un débutant, donc ne jurez pas beaucoup, voire pas du tout)

J'ai voulu créer un Expert Advisor via le générateur (et tout semble bien se passer, mais il y a un mais)

J'aimerais ouvrir une transaction non pas immédiatement après la fermeture de la précédente, mais par exemple après une bougie,

J'ai essayé d'écrire quelque chose, mais à la fin il y a une erreur.

Est-ce que quelqu'un peut m'aider ou m'indiquer quelle est l'erreur et comment la corriger ?

et voici le code actuel :


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

//| ParExpert.mq5 |

//| Copyright 2022, MetaQuotes Ltd.

/ /| http s://www.mql5.com

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

#property copyright "Copyright 2022, MetaQuotes Ltd."

#property link"https://www.mql5.com"

#property version "1.00"

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

//| Include |

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

#include <Expert\Expert.mqh>

//--- signaux disponibles

#include <Expert\Signal\SignalSAR.mqh>

//--- Trails disponibles

#include <Expert\Trailing\TrailingFixedPips.mqh>

//--- gestion de l'argent disponible

#include <Expert\Money\MoneyFixedLot.mqh>

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

//| Inputs |

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

//--- entrées pour l'expert

input string Expert_Title = "ParExpert" ; // Nom du document

ulong Expert_MagicNumber = 24195 ; //

bool Expert_EveryTick = false ; //

//--- entrées pour le signal principal

input int Signal_ThresholdOpen = 10 ; // Valeur du seuil du signal à ouvrir [0...100]

input int Signal_ThresholdClose = 0 ; // Valeur seuil du signal pour fermer [0...100]

input double Signal_PriceLevel = 0.0 ; // Niveau de prix pour exécuter une transaction

input double Signal_StopLevel = 500 ; // Niveau du Stop Loss (en points)

input double Signal_TakeLevel = 70 ; // Niveau du Take Profit (en points)

input int Signal_Expiration = 4 ; // Expiration des ordres en attente (en barres)

input double Signal_SAR_Step = 0.02 ; // Incrément de vitesse du SAR parabolique(0.02,0.2)

input double Signal_SAR_Maximum = 0.2 ; // Parabolique SAR(0.02,0.2) Taux maximum

input double Signal_SAR_Weight = 0.6 ; // Parabolique SAR(0.02,0.2) Poids [0...1.0]

//--- entrées pour le suivi

input int Trailing_FixedPips_StopLevel = 0 ; // Niveau de Stop Loss (en points)

input int Trailing_FixedPips_ProfitLevel= 10 ; // Niveau de suivi du Take Profit (en points)

//--- entrées pour l'argent

input double Money_FixLot_Percent = 10.0 ; // Pourcentage

input double Money_FixLot_Lots = 0.1 ; // Volume fixe

//--- Entrées pour le délai d'exécution de la transaction

input int Expert_TradeCooldown = 1 ; // Période de refroidissement entre les trades (en barres)

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

//| Objet expert global |

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

CExpert ExtExpert ;

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

//| Fonction d'initialisation de l'expert

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

int OnInit()

{

//--- Initialisation de l'expert

if (!ExtExpert.Init(Symbol(), Period(), Expert_EveryTick, Expert_MagicNumber))

{

//--- échec

printf(__FUNCTION__ + " : error initializing expert") ;

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}


//--- Création du signal

CExpertSignal *signal = new CExpertSignal ;

if (signal == NULL)

{

//--- échec

printf(__FUNCTION__ + " : error creating signal") ;

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}


//---

ExtExpert.InitSignal(signal) ;

signal.ThresholdOpen(Signal_ThresholdOpen) ;

signal.ThresholdClose(Signal_ThresholdClose) ;

signal.PriceLevel(Signal_PriceLevel) ;

signal.StopLevel(Signal_StopLevel) ;

signal.TakeLevel(Signal_TakeLevel) ;

signal.Expiration(Signal_Expiration) ;


//--- Création du filtre CSignalSAR

CSignalSAR *filter0 = nouveau CSignalSAR ;

if (filter0 == NULL)

{

//--- échec

printf(__FUNCTION__ + " : error creating filter0") ;

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}

signal.AddFilter(filter0) ;


//--- Définition des paramètres du filtre

filter0.Step(Signal_SAR_Step) ;

filter0.Maximum(Signal_SAR_Maximum) ;

filter0.Weight(Signal_SAR_Weight) ;


//--- Création de l'objet de suivi

CTrailingFixedPips *trailing = nouveau CTrailingFixedPips ;

if (trailing == NULL)

{

//--- échec

printf(__FUNCTION__ + " : error creating trailing") ;

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}


//--- Ajouter le suivi à l'expert (sera supprimé automatiquement))

if (!ExtExpert.InitTrailing(trailing))

{

//--- a échoué

printf(__FUNCTION__ + " : error initialising trailing") ;

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}


//--- Définition des paramètres de suivi

trailing.StopLevel(Trailing_FixedPips_StopLevel) ;

trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel) ;


//--- Création d'un objet monétaire

CMoneyFixedLot *money = new CMoneyFixedLot ;

if (money == NULL)

{

//--- échec

printf(__FUNCTION__ + " : error creating money") ;

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}


//--- Ajouter de l'argent à l'expert (sera supprimé automatiquement))

if (!ExtExpert.InitMoney(money))

{

//--- a échoué

printf(__FUNCTION__ + " : error initialising money") ;

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}


//--- Définir les paramètres de l'argent

argent.Pourcentage(Argent_FixLot_Pourcentage) ;

money.Lots(Money_FixLot_Lots) ;


//--- Vérification des paramètres de tous les objets de trading

if (!ExtExpert.ValidationSettings())

{

//--- a échoué

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}


//--- Réglage de tous les indicateurs nécessaires

if (!ExtExpert.InitIndicators())

{

//--- a échoué

printf(__FUNCTION__ + " : error initialising indicators") ;

ExtExpert.Deinit() ;

return (INIT_FAILED) ;

}


//--- Initialisation de la variable de l'heure de la dernière transaction

datetime lastTradeTime = 0 ;

ExtExpert.SetVariable("LastTradeTime", lastTradeTime) ;


//--- ok

return (INIT_SUCCEEDED) ;

}

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

//| Fonction de désinitialisation de l'expert |

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

void OnDeinit(const int reason)

{

ExtExpert.Deinit() ;

}

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

//| Fonction de gestion de l'événement "Tick".

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

void OnTick()

{

//--- Vérifier le temps écoulé depuis la dernière transaction

datetime lastTradeTime = ExtExpert.GetVariable("LastTradeTime") ;

int cooldownBars = Bars - ExtExpert.GetBarShiftByTime(Symbol(), Period(), lastTradeTime) ;


if (cooldownBars < Expert_TradeCooldown)

{

//--- La période de cooldown du trade n'est pas écoulée, ne pas ouvrir de nouveau trade

retour ;

}


ExtExpert.OnTrade() ;

}

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

//| Fonction de gestion de l'événement "Trade".

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

void OnTrade()

{

ExtExpert.OnTrade() ;

}

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

//| Fonction de gestion de l'événement "Timer".

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

void OnTimer()

{

ExtExpert.OnTimer() ;

}

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

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.05.27
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Joosy #:

Bonjour à tous😊

@Mario31415927

C'est tout simplement parce que dans le téléscripteur, à chaque fois qu'une nouvelle période- ou une nouvelle barre (quelle qu'elle soit), les variables :

sont réinitialisées, qu'il y ait déjà des positions ouvertes ou non.

C'est relativement facile à trouver dans le code.

Si c'est le cas, comment toutes les positions sont-elles refermées ?

Peut-être que je ne comprends pas non plus le type d'ordre TRADE_ACTION_DEAL dans ce contexte ?

On pourrait aussi simplement adapter le déroulement de l'ordre de trading à la classe de trading Trade. Comme par exemple :

Salutations:-)

Lis donc : https://www.mql5.com/fr/articles/232

Cela explique la différence et les liens entre les ordres, les positions et les deals. Ces derniers reflètent les opérations comptables du côté du courtier.

Handelsereignisse in MetaTrader 5
Handelsereignisse in MetaTrader 5
  • www.mql5.com
Eine Überwachung des aktuellen Status eines Handels-Account bedeutet offene Positions und Order kontrollieren zu können. Bevor ein Handelssignal zu einem Abschluss wird, sollte es vom Client-Terminal als Anfrage zum Handels-Server geschickt werden, wo es in eine Order-Warteschlange gestellt wird und auf seine Bearbeitung wartet. Eine Anfrage vom Handels-Server annehmen, sie löschen, wenn sie abläuft oder auf ihrer Grundlage einen Abschluss ausführen - alle diese Handlungen haben Handelsereignisse zur Folge, und der Handels-Server informiert das Terminal entsprechend darüber.
 
Carl Schreiber #:

Lire : https://www.mql5.com/fr/articles/232

Cela explique la différence et les liens entre les ordres, les positions et les deals. Ces derniers reflètent les opérations comptables du côté du courtier.

Bonjour Carl,

Merci pour la remarque !

Je dois toutefois rectifier mon propos.

Il est vrai que les variables sont réinitialisées à chaque nouvelle période de temps :

   bool Buy_opened = false, Sell_opened = false; // variables pour conserver le résultat de la position ouverte

Mais elles sont ensuite réinitialisées lorsqu'il y a une position correspondante.

   if(PositionSelect(_Symbol) == true) { // nous avons une position ouverte

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

         Buy_opened = true;  //Il s'agit d'un achat

      }

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) {

         Sell_opened = true; // It is a Sell

      }

   }

Cependant, il m'arrive de constater que la variable Buy (POSITION_TYPE_BUY) est correctement interrogée, mais pas la variable Sell (POSITION_TYPE_SELL). La variable n'est tout simplement plus définie ?

Je dois déboguer le code étape par étape. Cela ne peut être qu'une erreur logique😉.

Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
  • www.mql5.com
Dieser Beitrag beschäftigt sich mit dem Objekt-orientierten Ansatz, um das zu machen, was wir bereits im Artikel "Schrittweiser Leitfaden zum Schreiben eines Expert Advisors in MQL5 für Anfänger" getan haben - einen einfachen Expert Advisor erstellen. Die meisten Menschen glauben, das sei schwer, doch ich darf Ihnen versichern: wenn Sie diesen Beitrag gelesen haben, dann können Sie Ihren eigenen Objekt-orientierten Expert Advisor schreiben.
 
Joosy #:
Sell_opened = true; // It is a Sell

Oh là là, je suis complètement perdue aujourd'hui.

La question n'est posée qu'une seule fois. C'est l'erreur;-)

Ici, toutes les positions devraient être recherchées comme suit ;

   bool Buy_opened = false, Sell_opened = false; // variables pour conserver le résultat de la position ouverte
   
   for(int i=0; i < PositionsTotal(); i++) {
      ticket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == EA_Magic) {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { 
            Buy_opened = true; 
         }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { 
            Sell_opened = true; 
         }
      }   
   }
 

Il s'agissait bien d'une erreur, il semble que ce soit un fichier web.

Je l'ai réécrit moi-même en me basant sur le contenu et je l'ai téléchargé. Je ne sais pas s'il y a d'autres détails car je suis novice en la matière. J'espère que cela vous aidera.

Dossiers :
my_first_ea.mq5  12 kb
 

Tester - "Unsupported filling mode" (mode de remplissage non pris en charge)

J'ai essayé sur 3 courtiers différents. Quel est le problème ?