¿XAUUSD tamaño de lote incorrecto en la cuenta denominada en GBP? - página 5

 
DomGilberto:
Gracias :) - ¡Voy a comprobarlo ahora!

También, en su opinión, ¿es FXCM en el mal con la forma en que estoy viendo el valor de la garrapata? Ellos se empeñan en decir que es perfectamente normal? ¿No sabrán por qué lo están estropeando?
No sé por qué están haciendo lo que están haciendo. . . si quieres algo de peso detrás de tus argumentos instala algunos de sus competidores y mira cómo tienen el Tick Value establecido y luego diles lo que sus competidores están haciendo. . . y pregunta si todavía se sienten "normales". . .
 
¡Oh, créanme, he comprobado unos 5-6 corredores diferentes! Estoy tan molesto porque ya he comenzado a operar con ellos. De todos los corredores que no habría pensado FXCM haría una polla hasta :(

Sólo por curiosidad - He leído que el enlace anterior que adjunta, no es más fácil de hacer así? - Las impresiones también están ahí. Acabo de soltar eso en mi cuenta real con FXCM.... Me da un TickValue bastante preciso ahora basado en el valor del tick del GBPUSD y simplemente * 0.10 ?

La única cosa que no sé es cómo crear un interruptor, por lo que, como usted ha dicho, si el corredor tiene los detalles correctos, utilizarlos? (¿podría indicarme la dirección correcta?)
   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, créeme, he comprobado alrededor de 5-6 corredores diferentes! Estoy tan molesto porque ya he comenzado a operar con ellos. De todos los corredores que no habría pensado FXCM haría una polla hasta :(

Sólo por curiosidad - he leído el enlace anterior que adjuntaste; ¿no es más fácil hacerlo así?

Eso podría funcionar ( no he mirado con suficiente detalle ) cuando el Símbolo es XXXUSD y la moneda de tu cuenta es GBP, ¿no preferirías tener una función que funcione para un símbolo como XXXYYY y una moneda de la cuenta de ZZZ? entonces ya está hecho y no tienes que preocuparte de nuevo por este tema....

Lo único que no sé es cómo crear un conmutador, en el que, como has dicho, si el corredor tiene los datos correctos, los utilice? (¿podría indicarme la dirección correcta?)
Podrías simplemente hacer el cálculo y comparar el valor calculado contra el valor de MarketInfo() y si difieren en más de un 10%, 20% . . lo que creas que es un error lo suficientemente grande, utilizas el valor calculado. Sólo tiene que estar seguro de que los valores que está utilizando en su cálculo son correctos, con ese fin, si obtiene el valor del tick para un símbolo cuya moneda base (EURGBP) es la misma que la moneda de su cuenta (GBP), será 1,0 (5 dígitos del corredor) y luego trabajará de nuevo a partir de ese símbolo para el que necesita encontrar el valor del tick.
 
¡Buena idea! Si tienes un minuto, ¿te importaría echar un vistazo a esto para ver qué piensas? Entiendo que no he hecho esto muy robusto - Simplemente estoy buscando una solución temporal (que sé que la palabra temporal es una palabra peligrosa!) Que seguirá siendo robusto específicamente con FXCM en el ínterin ... ¡Esto es específicamente para XAGUSD!(lo siento, tenía que actualizarlo ya que publiqué uno equivocado!)

minLot es siempre 50,00 para la plata o 1,00 para el oro.
//+------------------------------------------------------------------+
//| 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:
¡Buen grito! Si tienes un minuto, ¿te importaría echar un vistazo a esto para ver qué piensas? Entiendo que no he hecho esto muy robusto - simplemente estoy buscando una solución temporal (¡que sé que la palabra temporal es una palabra peligrosa!) que seguirá siendo robusto específicamente con FXCM en el ínterin ... ¡Esto es específicamente para XAGUSD!(lo siento, tenía que actualizarlo ya que publiqué uno equivocado!)

minLot es siempre 50,00 para la plata o 1,00 para el oro.


Aquí hay algo más genérico...

Se puede ampliar para cubrir otros símbolos por diferentes corredores.

Las entradas clave a tener en cuenta aquí son BidUSD y AskUSD. BidUSD es el precio en dólares de la moneda del margen, así que digamos que su TradeSymbol es GBPJPY, entonces el BidUSD sería el precio de GBPUSD. Del mismo modo, el AskUSD sería el USDJPY. Si alguna de las divisas de margen o de beneficio es el USD, por ejemplo cualquiera de las principales, entonces su BidUSD==AskUSD== el precio actual del TradeSymbol.

Lo que devuelve esta función es la ganancia/pérdida por mantener un lote (1.0) del TradeSymbol a través de un PriceDelta especificado (una de las entradas).

//+------------------------------------------------------------------+
//|                                                       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);
   }
 

Gracias por tu comentario, aunque no estoy del todo seguro de lo que me está pareciendo, mañana lo miraré más de cerca...