XAUUSD dimensionamento del lotto sbagliato su un conto denominato in GBP? - pagina 5

 
DomGilberto:
Grazie :) - Lo controllerò subito!

Inoltre, secondo te, FXCM è nel torto per come sto vedendo il Tick Value? Sono irremovibili sul fatto che sia perfettamente normale? Non è che sai perché stanno sbagliando, vero?
Non so perché stanno facendo quello che stanno facendo. . . se vuoi avere un po' di peso dietro le tue argomentazioni installa alcuni dei loro concorrenti e vedi come hanno impostato il Tick Value poi digli cosa stanno facendo i loro concorrenti. . . e chiedi se si sentono ancora "normali" . . .
 
Oh credetemi, ho controllato circa 5-6 broker diversi! Sono così infastidito perché ho già iniziato a fare trading con loro. Tra tutti i broker non avrei mai pensato che FXCM potesse fare un tale casino :(

Solo per curiosità - ho letto il link precedente che hai allegato; non è più facile fare così? - Ci sono anche le stampe. L'ho appena messo sul mio conto live con FXCM... Mi dà un TickValue abbastanza accurato ora basato sul valore del tick GBPUSD e semplicemente * 0.10 ?

L'unica cosa che non so è come creare uno switch, dove, come hai detto tu, se il broker ha i dettagli corretti, li usa? (in grado di indicarmi la direzione giusta?)
   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 credetemi, ho controllato circa 5-6 broker diversi! Sono così seccato perché ho già iniziato a fare trading con loro. Tra tutti i broker non avrei mai pensato che FXCM potesse fare un tale casino :(

Solo per curiosità - ho letto il link precedente che hai allegato; non è più facile fare così?

Questo potrebbe/potrebbe funzionare ( non ho guardato abbastanza in dettaglio ) dove il simbolo è XXXUSD e la vostra valuta di conto è GBP, non preferireste avere una funzione che funziona per un simbolo come XXXYYY e una valuta di conto di ZZZ ? allora avete finito e non dovete preoccuparvi ancora di questo argomento . . .

L'unica cosa che non so è come creare uno switch, dove, come hai detto tu, se il broker ha i dati corretti, li usa? (mi può indicare la direzione giusta?)
Potresti semplicemente fare il calcolo e confrontare il valore calcolato con il valore di MarketInfo() e se differiscono di più del 10%, 20% . ... qualunque cosa pensiate sia un errore abbastanza grande, usate il valore calcolato. Devi solo essere sicuro che i valori che stai usando nel tuo calcolo siano corretti, a tal fine se ottieni il valore di Tick per un simbolo la cui valuta di base (EURGBP) è la stessa della valuta del tuo conto (GBP) sarà 1.0 (Broker a 5 cifre) quindi lavora a ritroso da quello al simbolo per cui devi trovare il valore di Tick.
 
Bel grido! Ok, ho giocato un po' - se hai un minuto, ti dispiacerebbe dare un'occhiata a questo per vedere cosa ne pensi? Mi rendo conto che non l'ho reso molto robusto - sto semplicemente cercando una soluzione temporanea (che so che la parola temporaneo è una parola pericolosa!) che rimarrà robusto in particolare con FXCM nel frattempo... Questo qui sotto è specificamente per XAGUSD!(scusate, dovevo aggiornarla perché ne ho postata una sbagliata!)

Il minLot è sempre o 50.00 per l'argento o 1.00 per l'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:
Bel colpo! Ok, quindi ho giocato un po' - se hai un minuto, ti dispiacerebbe dare un'occhiata a questo per vedere cosa ne pensi? Mi rendo conto che non l'ho reso molto robusto - sto semplicemente cercando una soluzione temporanea (che so che la parola temporanea è una parola pericolosa!) che rimarrà robusta in particolare con FXCM nel frattempo... Questo qui sotto è specificamente per XAGUSD!(scusate, dovevo aggiornarla perché ne ho postata una sbagliata!)

Il minLot è sempre o 50.00 per l'argento o 1.00 per l'oro.


Qui c'è qualcosa di più generico...

Può essere espanso per coprire altri simboli da diversi broker.

Gli input chiave da notare qui sono BidUSD e AskUSD. BidUSD è il prezzo in dollari della valuta di margine, quindi diciamo che il tuo TradeSymbol era GBPJPY, allora il BidUSD sarebbe il prezzo di GBPUSD. Allo stesso modo l'AskUSD sarebbe USDJPY. Se una qualsiasi delle valute di margine o di profitto è USD, per esempio una qualsiasi delle maggiori, allora il tuo BidUSD==AskUSD==il prezzo corrente del TradeSymbol.

Ciò che viene restituito da questa funzione è il guadagno/perdita per tenere un lotto (1,0) del TradeSymbol attraverso un PriceDelta specificato (uno degli input).

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

Grazie per il tuo post amico - Non sono del tutto sicuro di quello che sto prendendo via da questo però - avrò uno sguardo più attento domani...

Motivazione: