Questions des débutants MQL5 MT5 MetaTrader 5 - page 1415
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
Cherche (l'anglais apporte plus) "calculate lotsize" : https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
Où l'on peut bien sûr modifier le 0.9 en (1 - maxRisk) et implémenter une propriété "Risque maximal en %" paramétrable par l'utilisateur.
P.S. Vouvons-nous utiliser le vouvoiement ou le tutoiement sur le forum ?Merci pour ces informations. Dans The checks a trading robot must pass, on cite une méthode "CheckMoneyForTrade" qui vérifie si la marge à dépenser pour le trade est supérieure à la marge libre (ACCOUNT_FREE_MARGIN). Si je t'ai bien compris, il faut en plus vérifier si les fonds dépensés dépassent un certain pourcentage du solde du compte, c'est-à-dire quelque chose comme :
Où l'on peut bien sûr modifier le 0.9 en (1 - maxRisk) et implémenter une propriété "Risque maximal en %" paramétrable par l'utilisateur.
P.S. Vouvons-nous utiliser le vouvoiement ou le tutoiement sur ce forum ?Tout le monde tombe sur la taille des lots et il y a beaucoup de codes et de commentaires ici !
J'ai rassemblé pour MT5 ce que William Roeder a écrit, ce serait la fonction non testée ( !!):
(https://www.mql5.com/en/forum/133792/page3#comment_3405179 & https://www.mql5.com/en/forum/390088#comment_28092477).
Dis-nous si tu trouves une erreur !
Comme la plupart des gens ici sont en quelque sorte anonymes avec leurs surnoms ou leurs prénoms, et que c'était encore plus le cas auparavant, le tutoiement est devenu une habitude.
Merci pour le code. Il ne manquait que l'adaptation à une taille intermédiaire de lot valide :
J'ai encore une question à ce sujet : si je calcule la perte d'une transaction fermée avec TICK_VALUE ou justement avec deltaValue comme ci-dessus, le résultat est toujours légèrement différent de celui du calcul interne de MQL5 :
Est-ce parce que la perte/le gain par tick est différent pour un compte en EUR et pour le cours de bourse 1,0 et le cours de bourse 1,2 ? En effet, si je saisis par exemple "prix + 0,1" au lieu de "price" et "sl + 0,1" au lieu de "sl" dans le code inférieur, l'écart entre les ticks (diff) est le même, mais les résultats donnés par OrderCalcProfit sont différents. Et si je regarde les gains/pertes que j'obtiens sur les trades manuels, il me semble que ce dernier point est confirmé.
Si j'ai raison, le code suivant serait plus précis :
P.S. Merci encore pour l'idée de base : lier le facteur de risque non pas à la balance, mais à la marge libre, est clairement judicieux.Le code suivant a été créé selon le sar parabolique expert de mql 5. Il est possible d'inverser le fonctionnement du signal d'achat et du signal de vente ici, c'est à dire que lorsque le signal d'achat arrive, je veux qu'il ouvre les ventes au lieu d'acheter.
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Inclure |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- signaux disponibles
#include <Expert\Signal\SignalSAR.mqh>
//--- Trails disponibles
#include <Expert\Trailing\TrailingNone.mqh>
//--- gestion de l'argent disponible
#include <Expert\Money\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs |
//+------------------------------------------------------------------+
//--- entrées pour l'expert
input string Expert_Title = "sar" ; // Nom du document
ulong Expert_MagicNumber =13831 ; //
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=10 ; // Valeur seuil du signal pour fermer [0...100]
input double Signal_PriceLevel =0.0 ; // Niveau de prix pour exécuter une transaction
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 =1.0 ; // Parabolique SAR(0.02,0.2) Poids [0....1.0]
//--- entrées pour l'argent
input double Money_FixLot_Percent =10.0 ; // Pourcentage
input double Money_FixLot_Lots =0.1 ; // Volume fixe
//+------------------------------------------------------------------+
//| 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)))
{
//----- a échoué
printf(__FUNCTION__+" : error initialising expert") ;
ExtExpert.Deinit() ;
return(INIT_FAILED) ;
}
//--- Création du signal
CExpertSignal *signal=new CExpertSignal ;
if(signal==NULL)
{
//----- a échoué
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.Expiration(Signal_Expiration) ;
//--- Création du filtre CSignalSAR
CSignalSAR *filter0=nouveau CSignalSAR ;
if(filter0==NULL)
{
//----- a échoué
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
CTrailingNone *trailing=new CTrailingNone ;
if(trailing==NULL)
{
//----- a échoué
printf(__FUNCTION__+" : error creating trailing") ;
ExtExpert.Deinit() ;
return(INIT_FAILED) ;
}
//--- Ajouter un 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
//--- Création d'un objet monétaire
CMoneyFixedLot *money=nouveau CMoneyFixedLot ;
if(money==NULL)
{
//----- a échoué
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érifier les 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) ;
}
//--- 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()
{
ExtExpert.OnTick() ;
}
//+------------------------------------------------------------------+
//| Fonction de gestion de l'événement "Trade".
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade() ;
}
//+------------------------------------------------------------------+
//| Fonction de gestion de l'événement "Timer".
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer() ;
}
//+------------------------------------------------------------------+
J'ai eu le temps d'étudier ta solution. Elle est plus précise (alors que l'autre est plus prudente, car elle tient compte de la commission ?) et elle est apparemment moins sujette aux erreurs, comme on peut le voir avec l'or et l'argent du compte de démonstration chez MQ - avec Roboforex, comme on pouvait s'y attendre, c'est un peu plus prudent que ta solution :
Sur le compte MQ, les tailles de lots seraient beaucoup trop élevées.
Voici mon script pour comparer les deux méthodes :
J'ai déduit la direction de in > sl (buy) ou in < sl (sell). Il n'y aurait alors aucun problème avec les ordres en attente (pending orders).
Merci pour tes tests. Oui, si on compare les résultats, on voit d'une part la constance de OrderCalcProfit et d'autre part, au moins pour l'EURUSD et RoboForex, que les résultats diffèrent à peu près de "taille du lot * CommissionPerLot". Cela pourrait encore être intégré :
Si j'ai bien utilisé la recherche sur le forum, il n'y a pas de possibilité d'obtenir la valeur "CommissionPerLot" directement à l'aide de MQL5, n'est-ce pas ?
Si j'ai bien utilisé la recherche sur le forum, il n'y a pas de possibilité de demander la valeur "CommissionPerLot" directement à l'aide de MQL5, n'est-ce pas ?Oui, pas directement dans le terminal, mais demander au broker ou dans l'historique des transactions : DEAL_COMMISSION.