Discussion de l'article "Guide étape par étape pour rédiger un conseiller expert en MQL5 pour les débutants" - page 29
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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.
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.
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() ;
}
//+------------------------------------------------------------------+
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.
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 :
Mais elles sont ensuite réinitialisées lorsqu'il y a une position correspondante.
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😉.
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 ;
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.
Tester - "Unsupported filling mode" (mode de remplissage non pris en charge)
J'ai essayé sur 3 courtiers différents. Quel est le problème ?