XAUUSD : mauvais dimensionnement de lot sur un compte libellé en GBP ? - page 5

 
DomGilberto:
Merci :) - Je vais le vérifier maintenant !

De plus, à votre avis, est-ce que FXCM est dans l'erreur avec la façon dont je vois la Tick Value ? Ils sont catégoriques, ils disent que c'est parfaitement normal ? Vous ne sauriez pas pourquoi ils se trompent, n'est-ce pas ?
Je ne sais pas pourquoi ils font ce qu'ils font... Si vous voulez avoir du poids derrière vos arguments, installez quelques-uns de leurs concurrents et voyez comment ils ont réglé la valeur du tick, puis dites-leur ce que font leurs concurrents... et demandez-leur si cela leur semble toujours "normal"...
 
Oh croyez-moi, j'ai vérifié 5 ou 6 courtiers différents ! Je suis tellement ennuyé car j'ai déjà commencé à trader avec eux. De tous les courtiers, je n'aurais pas pensé que FXCM ferait une telle connerie :(

Juste par curiosité - j'ai lu le lien précédent que vous avez joint ; n'est-il pas plus facile de faire comme ça ? - Les empreintes sont là aussi. Je viens de déposer cela sur mon compte réel avec FXCM... Cela me donne une TickValue assez précise maintenant basée sur la valeur du tick de GBPUSD et simplement * 0.10 ?

La seule chose que je ne sais pas, c'est comment créer un commutateur, où, comme vous l'avez dit, si le courtier a les bons détails, il faut les utiliser ? (en mesure de m'indiquer la bonne direction ?)
   double risk_amount = AccountBalance( )* 2.00 / 100;
   double Lot_Step = MarketInfo(Symbol(), MODE_LOTSTEP);
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   double minlot = MarketInfo(Symbol(), MODE_MINLOT);
   
   double GBPUSD = MarketInfo( "GBPUSD", MODE_TICKVALUE);
   
      double CustomTickValue = 0.10 * GBPUSD;
         Print(" Custom Tick Value is: ", 0.10, " * ", GBPUSD, " = ", CustomTickValue);

2013.11.12 11:32:33     Tick Value test XAUUSD,H1:  Custom Tick Value is: 0.1 * 0.6296 = 0.063

            
      double loss_for_1_lot = 25.25 / ( 0.10 * GBPUSD ) * ts ;
         Print(" loss_for_1_lot formula: ", 25.25, " / ", ts, " * (", CustomTickValue,") = ", loss_for_1_lot );

2013.11.12 11:32:33     Tick Value test XAUUSD,H1:  loss_for_1_lot formula: 25.25 / 0.01 * (0.063) = 4.0106

      
      double LotSize_Buy = MathFloor( risk_amount / loss_for_1_lot/ Lot_Step) * Lot_Step ;
         Print(" LotSize_Buy: ( ", risk_amount, " / ", loss_for_1_lot, " / ", Lot_Step, " ) * ", Lot_Step, " = ", LotSize_Buy); 

2013.11.12 11:32:33     Tick Value test XAUUSD,H1:  LotSize_Buy: ( 76.0598 / 4.0106 / 1 ) * 1 = 18
 
DomGilberto:
Oh croyez-moi, j'ai vérifié environ 5-6 courtiers différents ! Je suis tellement ennuyé parce que j'ai déjà commencé à trader avec eux. De tous les courtiers, je n'aurais pas pensé que FXCM ferait une telle connerie :(

Juste par curiosité - j'ai lu le lien précédent que vous avez joint ; n'est-il pas plus facile de faire comme ça ?

Cela pourrait/va fonctionner (je n'ai pas regardé assez en détail) lorsque le symbole est XXXUSD et que la devise de votre compte est GBP, ne préféreriez-vous pas avoir une fonction qui fonctionne pour un symbole comme XXXYYY et une devise de compte de ZZZ ? alors vous avez terminé et vous n'avez plus à vous préoccuper de ce sujet....

La seule chose que je ne sais pas, c'est comment créer un commutateur, par lequel, comme vous l'avez dit, si le courtier a les bons détails, il les utilise ??? (pouvez-vous m'indiquer la bonne direction ?)
Vous pourriez simplement faire le calcul et comparer la valeur calculée à la valeur de MarketInfo() et si la différence est de plus de 10%, 20%.... Si la différence est supérieure à 10 %, 20 % ou plus, et que l'erreur est suffisamment importante, vous utilisez la valeur calculée. Vous devez juste être certain que les valeurs que vous utilisez dans votre calcul sont correctes, à cette fin, si vous obtenez la valeur de Tick pour un symbole dont la devise de base (EURGBP) est la même que la devise de votre compte (GBP), elle sera de 1,0 (Broker à 5 chiffres), puis remonter à partir de là jusqu'au symbole dont vous avez besoin pour trouver la valeur de Tick.
 
Bien vu ! Ok, donc j'ai fait des essais - si vous avez une minute, pourriez-vous jeter un coup d'oeil à ceci pour voir ce que vous en pensez ? Je suis conscient que je n'ai pas fait cela très robuste - je suis simplement à la recherche d'une solution temporaire (je sais que le mot temporaire est un mot dangereux !) qui restera robuste spécifiquement avec FXCM dans l'intervalle... Celui ci-dessous est spécifiquement pour XAGUSD !(désolé, j'ai dû le mettre à jour car j'ai posté le mauvais !)

minLot est toujours soit 50.00 pour l'argent ou 1.00 pour l'or.
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
 

  
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   
   double GBPUSD_BID = MarketInfo( "GBPUSD", MODE_BID);
   double CustomTickValue;
   
   double EqualityTickValue = (( 0.10 / GBPUSD_BID * minLot ) - tv ) * 1000;
      Print(" EqualityTickValue formula is: ( ", 10, " / ", GBPUSD_BID, " * ", 50, " ) - ", tv, ") * ", 1000, " = ", EqualityTickValue);

2013.11.12 14:40:08     Tick Value test XAUUSD,H1:  EqualityTickValue formula is: ( 10 / 1.5911 * 50 ) - 0.01) * 1000 = 3132.401


      
   
   if( EqualityTickValue > 20.00 ) 
     {
      CustomTickValue = (0.10 / GBPUSD_BID  * minLot );
      Print(" CustomTickValue is custom: ", 10, " / ", GBPUSD_BID, " * ", 50.00, " = ", CustomTickValue); 

2013.11.12 14:40:08     Tick Value test XAUUSD,H1:  CustomTickValue is custom: 10 / 1.5911 * 50 = 3.1424

     }
   if( EqualityTickValue < 20.00)
     { 
      CustomTickValue = tv;
      Print(" CustomTickValue is MarketInfo: ", tv);



     } 
     
//----
   return(0);
  }
 
DomGilberto:
Bien vu ! Ok, donc j'ai joué un peu - si vous avez une minute, pourriez-vous jeter un coup d'oeil à ceci pour voir ce que vous en pensez ? Je reconnais que je n'ai pas fait cela très robuste - je suis simplement à la recherche d'une solution temporaire (je sais que le mot temporaire est un mot dangereux !) qui restera robuste spécifiquement avec FXCM dans l'intervalle... Celui ci-dessous est spécifiquement pour XAGUSD !(désolé, j'ai dû le mettre à jour car j'ai posté le mauvais !)

minLot est toujours soit 50.00 pour l'argent ou 1.00 pour l'or.


Voici quelque chose de plus générique...

Il peut être étendu à d'autres symboles par différents courtiers.

Les entrées clés à noter ici sont BidUSD et AskUSD. BidUSD est le prix en dollars de la devise de la marge, donc si votre TradeSymbol était GBPJPY, alors le BidUSD serait le prix du GBPUSD. De même, le AskUSD sera USDJPY. Si l'une des devises de marge ou de profit est l'USD, par exemple l'une des majors, alors votre BidUSD==AskUSD==le prix actuel du TradeSymbol.

Cette fonction renvoie le gain/la perte d'un lot (1,0) du symbole commercial pour un delta de prix spécifié (une des entrées).

//+------------------------------------------------------------------+
//|                                                       Profit.mqh |
//|                                                              ssn |
//+------------------------------------------------------------------+
#property copyright "ssn"

//#property version   "3.31"

double Profit(string TradeSymbol,double PriceDelta,double BidUSD,double AskUSD)
   {
      double _profit=0.0;
      
      if(StringFind(TradeSymbol,"TNOTE",2)>=0||
         StringFind(TradeSymbol,"aTND",0)>=2){
         _profit+=MarketInfo(TradeSymbol,MODE_LOTSIZE)*BidUSD;
         _profit*=PriceDelta;}
      
      else if(StringFind(TradeSymbol,"US500",0)>=0||
               StringFind(TradeSymbol,"a500",0)>=0||
               StringFind(TradeSymbol,"SPY",0)>=0){
         _profit+=MarketInfo(TradeSymbol,MODE_LOTSIZE)*BidUSD;
         _profit*=PriceDelta;}
      
      else if(StringFind(TradeSymbol,"XAG",0)>=0||StringFind(TradeSymbol,"XAU",0)>=0){
         _profit+=MarketInfo(TradeSymbol,MODE_LOTSIZE)*BidUSD;
         _profit*=PriceDelta; }
      
      else if(StringFind(TradeSymbol,"EUR",0)>=0||
         StringFind(TradeSymbol,"GBP",0)>=0||
         StringFind(TradeSymbol,"AUD",0)>=0||
         StringFind(TradeSymbol,"NZD",0)>=0){
         _profit+=MarketInfo(TradeSymbol,MODE_LOTSIZE)*BidUSD;
         if(StringFind(TradeSymbol,"USD",0)>=0){ 
            _profit*=PriceDelta; }
         else if(StringFind(TradeSymbol,"USD",0)<0){
            if(StringFind(TradeSymbol,"GBP",0)>=0||
               StringFind(TradeSymbol,"AUD",0)>=0||
               StringFind(TradeSymbol,"NZD",0)>=0){
               _profit*=PriceDelta*AskUSD; }
            else if(StringFind(TradeSymbol,"CAD",0)>=0||
                  StringFind(TradeSymbol,"CHF",0)>=0||
                  StringFind(TradeSymbol,"JPY",0)>=0){
               _profit*=PriceDelta;
               if(AskUSD!=0.0) { _profit/=AskUSD; }
               else if(AskUSD==0.0) {
                  Print(" Ask's USD price is zero! ensure it's provided. ");
                  return(0.0); }}}}
      
      else if(StringFind(TradeSymbol,"USD",0)>=0){
         _profit = MarketInfo(TradeSymbol,MODE_LOTSIZE);
         if(StringFind(TradeSymbol,"CAD",0)>=0||
            StringFind(TradeSymbol,"CHF",0)>=0||
            StringFind(TradeSymbol,"JPY",0)>=0){
            _profit*=PriceDelta;
            if(AskUSD!=0.0) { _profit/=AskUSD; }
            else if(AskUSD==0.0) {
               Print(" Ask's USD price is zero! ensure it's provided. ");
               return(0.0); }}}
               
      else if( StringFind(TradeSymbol,"CAD",0)>=0||
               StringFind(TradeSymbol,"CHF",0)>=0){
         if(BidUSD!=0.0) { _profit = MarketInfo(TradeSymbol,MODE_LOTSIZE)/BidUSD; }
         else if(BidUSD==0.0) {
            Print(" Bid's USD price is zero! ensure it's provided. ");
            return(0.0); }
         _profit*=PriceDelta;
         if(AskUSD!=0.0) { _profit/=AskUSD; }
         else if(AskUSD==0.0) {
            Print(" Ask's USD price is zero! ensure it's provided. ");
            return(0.0);  }}
             
      return(_profit);
   }
 

Merci pour ton message, mon pote - Je ne suis pas tout à fait sûr de ce que j'en retire - je regarderai de plus près demain...

Raison: