Répondre

ERREUR DE CALCUL DANS LA GESTION DE L'ARGENT

13 réponses

loonet

Abonné, bbp_participant, communauté, client, sq-ultimate, 15 réponses.

Visiter le profil

Il y a 9 ans #113539

Bonjour Mark, je suis Riccardo de Sapienza Finanziaria.
Je vous signale qu'à mon avis EAW a un bug dans le calcul du risque de gestion monétaire avec Fixed% des fonds propres du compte.
Pour le système de trading que je prévois, j'ai fixé un risque par transaction de 1%.
Regardez par exemple ce qui se passe dans la transaction # 79 que j'ai mise en évidence dans l'image ci-jointe.

résultats du commerce.jpg

 
Avant le trade #79 sur mon compte, j'ai un solde de 21680 USD, et j'ai fixé un risque par trade de 1%.
Cela signifie que je pourrais perdre environ 217 USD si j'obtiens le SL.
La transaction # 79 est une opération d'ACHAT avec un prix d'entrée à 1.3703 et un SL à 1.3640.
L'opération est mise sur le marché avec des lots de 3:40, chaque pip est donc de 34 USD.
La transaction se termine avec une perte de 1241 pips (= 63 x 34).
En fait, pour respecter un risque par transaction de 1%, le système de trading aurait dû ouvrir cette transaction avec 0,34 lot et non 3,40 lots.

 

Je suis un programmeur MQL et j'ai donc essayé de corriger la fonction EAW sqMMFixedRisk en la remplaçant par ma propre fonction que je présente ci-dessous afin de vous aider à résoudre le problème :

    //------ sqMMFixedRisk corrigé par Riccardo
     
    double sqMMFixedRisk (int orderMagicNumber, int orderType)
    {
    double LotSize=0 ;
    double _riskInPercent = RiskPercent ;
    double _maximumLots = 5.0 ;
    double slSize = sqMMGetOrderStopLossDistance(orderMagicNumber, orderType) * gPointPow ;
     
     
    double riskPerTrade=AccountBalance() *(_riskInPercent/100) ;
    if(slSize 0 && TickValue>0)
    {
    LotSize = MarketInfo(Symbol(),MODE_TICKSIZE) * riskPerTrade / (slSize * TickValue * MarketInfo(Symbol(),MODE_POINT) ) ;
     
    int err=GetLastError() ;
    if(err==4013)
    { //ERR_ZERO_DIVIDE
    Verbose("Err : division par zéro : StopLoss :",slSize," TickValue :",TickValue," LotSize :",LotSize) ;
    return(-1) ;
    }
    }
     
    //--- Gestion des MAXLOT et MINLOT
    double Smallest_Lot = MarketInfo(Symbol(), MODE_MINLOT) ;
    double Largest_Lot = MarketInfo(Symbol(), MODE_MAXLOT) ;
     
    si (LotSize  Largest_Lot) LotSize = Largest_Lot ;
     
    if(LotSize > _maximumLots) {
    LotSize = _maximumLots ;
    }
    //--------------------------------------------
     
     
     
    //--- LotSize arrondi en fonction du courtier LOTSTEP
    if(MarketInfo(Symbol(),MODE_LOTSTEP)==1)
    {
    LotSize=NormalizeDouble(LotSize,0) ;
    }
    if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1)
    {
    LotSize=NormalizeDouble(LotSize,1) ;
    }
    if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)
    {
    LotSize=NormalizeDouble(LotSize,2) ;
    }
    if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.001)
    {
    LotSize=NormalizeDouble(LotSize,3) ;
    }
    //--------------------------------------------
     
    return (LotSize) ;
     
    }
    //--------------------------------------------------------------------

Grâce à cette fonction, il est également possible d'éviter de définir le paramètre   Lots Décimaux  et le   Monnaie de base Taux de change  MM paramètres qui deviendront ininfluents.

 

0

JS17

Client, bbp_participant, communauté, 73 réponses.

Visiter le profil

Il y a 9 ans #129896

Riccardo

 

Merci pour ce document, mais j'ai un certain nombre de questions à poser

 

1. Quelle partie du code MAE doit être supprimée ?

2. De nouvelles variables doivent-elles être déclarées pour que votre code fonctionne ?

 

Merci beaucoup 🙂 .

0

loonet

Abonné, bbp_participant, communauté, client, sq-ultimate, 15 réponses.

Visiter le profil

Il y a 9 ans #130005

1. Il suffit de remplacer la fonction sqMMFixedRisk par le code que je poste.

2. Il n'est pas nécessaire de déclarer une variable supplémentaire (il faut tenir compte du fait qu'avec ma fonction, la variable Lots Décimaux  et le  Monnaie de base Taux de change  Ea Wizard Money Management parameters become ininfluent)

0

Mark Fric

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

Il y a 9 ans #130015

Bonjour Riccardo,

 

Je suis désolé de mettre trop de temps à répondre. J'ai déjà examiné votre fonction et je l'ai testée, mais elle est très différente de notre propre fonction et je n'ai pas eu le temps de la tester complètement dans tous les environnements, y compris le trading de CFDs, etc. qui est différent du forex.

 

J'aimerais m'y atteler un jour ou l'autre, mais je suis trop occupé par des choses inattendues en permanence.

Marque
StratégieArchitecte de Quantités

0

loonet

Abonné, bbp_participant, communauté, client, sq-ultimate, 15 réponses.

Visiter le profil

Il y a 9 ans #130020

Merci Marc,

Je l'utilise essentiellement pour les opérations de change.

J'ai comparé le calcul entre la fonction originale et la fonction modifiée.

La fonction originale me donne un comportement étrange dans le calcul des lots : dans certains cas, elle semble ne pas prendre en compte le pourcentage de risque que j'ai fixé.

Si vous le souhaitez, je peux vous envoyer un exemple des résultats de backtest obtenus en utilisant les deux fonctions.

0

JS17

Client, bbp_participant, communauté, 73 réponses.

Visiter le profil

Il y a 9 ans #130049

Riccardo,

 

Merci pour votre réponse et votre explication - comme Mark a maintenant répondu, je vais attendre qu'il ait terminé ses tests - merci encore.

0

Mark Fric

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

Il y a 9 ans #130154

Je l'ai testé et tout semble fonctionner correctement, je viens donc de publier une mise à jour automatique de l'EA Wizard qui contient la correction du Money Management de Riccardo.

Marque
StratégieArchitecte de Quantités

0

JS17

Client, bbp_participant, communauté, 73 réponses.

Visiter le profil

Il y a 9 ans #130163

Puis-je demander que si, lors de l'utilisation de cette fonction, j'entre 0 dans le risque %, la fonction utilise la valeur entrée dans "lots si pas de MM" ?

0

tomas262

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

Il y a 9 ans #130205

Dans le champ %, la valeur du risque doit être supérieure à zéro, c'est-à-dire 0,1, 1, etc.

0

NirvanaFx

Client, bbp_participant, communauté, 5 réponses.

Visiter le profil

Il y a 8 ans #130401

J'ai essayé d'utiliser le risque dans % et quoi que je fasse, quel que soit le pourcentage que j'introduis dans le champ (par exemple, 1,20, .06, .3, etc.), c'est exactement le pourcentage que j'introduis dans le champ (par exemple, 1,20, .06, .3, etc.) qui est le plus élevé. fixe la taille des lots échangés. La taille des lots ne varie pas du tout. Il n'y a pas de valeur par défaut pour les lots s'il n'y a pas de MM ou quoi que ce soit d'autre et j'ai le stoploss pour que le risque soit calculé. Est-ce que c'est un bug que quelqu'un d'autre a rencontré récemment ? J'ai aussi la dernière mise à jour.

0

tortue

Abonné, bbp_participant, communauté, 6 réponses.

Visiter le profil

Il y a 8 ans #131241

Bonjour Marc et Tomas,

 

Il semble que ce fil de discussion soit le plus proche de ce que je vis.

 

MM to fixed % of equity est défini ainsi que Global Stop Loss. Toutes les transactions sont réglées pour utiliser ces paramètres.

 

Dans le TEster de MT4, toutes les tailles de lots sont par défaut de 0,01 Lots sur EURUSD.

 

Vous trouverez ci-joint le code que j'utilise. N'hésitez pas à me faire savoir si vous voyez quelque chose.

 

J'utilise MT4 Build 840

 

Merci et salutations

Tim

 

0

tomas262

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

Il y a 8 ans #131257

Ok, pourriez-vous joindre le fichier SQW ?

0

och

Abonné, bbp_participant, communauté, 2 réponses.

Visiter le profil

Il y a 8 ans #133734

Bonjour, 
Je ne suis pas sûr que ce soit le bon endroit pour poster cette remarque, mais je pense aussi qu'il y a une erreur dans le calcul du lot de StrategyQuant (v3.8.1) :

 

Ligne 14 : if(MathMod(lotMM*100, lotStep*100) > 0) {

 

devrait être

 

               if(MathMod(lotMM1*100, lotStep*100) > 0) {

double computeMMFromRiskPerTrade(double riskPerTrade, double slSize) {
   if(slSize 0) {
      lotMM = lotMM1 - MathMod(lotMM1, lotStep) ;
   } else {
      lotMM = lotMM1 ;
   }

   lotMM = NormalizeDouble( lotMM, LotsDecimals) ;

   if(MarketInfo(Symbol(), MODE_LOTSIZE)==10000.0) lotMM=lotMM*10.0 ;
   lotMM=NormalizeDouble(lotMM,LotsDecimals) ;

   //Log("Calcul des lots, risque : ", riskPerTrade, ", lotMM1 : ", lotMM1, ", lotStep : ", lotStep, ", lots : ", lotMM) ;
   double Smallest_Lot = MarketInfo(Symbol(), MODE_MINLOT) ;
   double Largest_Lot = MarketInfo(Symbol(), MODE_MAXLOT) ;

   si (lotMM Largest_Lot) lotMM = Largest_Lot ;

   if(lotMM > MaximumLots) {
      lotMM = MaximumLots ;
   }

   //Log("Taille SL : ", slSize, ", LotMM : ", lotMM) ;

   return (lotMM) ;
}

Voir aussi,

och

0

Mark Fric

Administrateur, sq-ultimate, 2 réponses.

Visiter le profil

Il y a 8 ans #133753

Bonjour Olivier,

 

Vous avez raison, il y a cette erreur. Je publierai une mise à jour demain avec un correctif.

Marque
StratégieArchitecte de Quantités

0

Affichage de 13 réponses de 1 à 13 (sur un total de 13)