XAUUSD неправильный размер лота на счете, номинированном в GBP? - страница 5

 
DomGilberto:
Спасибо :) - Я проверю это сейчас!

Также, по Вашему мнению, FXCM не прав в том, что я вижу Tick Value? Они утверждают, что это совершенно нормально? Вы же не знаете, почему они все портят?
Я не знаю, почему они делают то, что делают... Если вы хотите, чтобы ваши аргументы имели вес, установите несколько их конкурентов и посмотрите, как у них настроена стоимость тика, затем расскажите им, что делают их конкуренты... и спросите, по-прежнему ли они чувствуют себя "нормально"...
 
Поверьте, я проверил около 5-6 разных брокеров! Я так раздражен, потому что я уже начал торговать с ними. Из всех брокеров я бы не подумал, что FXCM может так облажаться :(

Просто из любопытства - я прочитал предыдущую ссылку, которую вы прикрепили; не проще ли сделать это вот так? - Распечатки там тоже есть. Я только что закинул это на свой реальный счет в FXCM... Это дает мне довольно точное значение TickValue, основанное на тиковом значении GBPUSD и просто * 0.10?

Единственное, чего я не знаю, это как создать переключатель, где, как вы сказали, если у брокера есть правильные данные, использовать их? (кто может указать мне правильное направление?)
   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:
Поверьте мне, я проверил около 5-6 разных брокеров! Я так раздражен, потому что я уже начал торговать с ними. Из всех брокеров я бы не подумал, что FXCM может так облажаться :(

Просто из любопытства - я прочитал предыдущую ссылку, которую вы прикрепили; не проще ли сделать так?

Это может/будет работать (я не смотрел достаточно подробно), если символ - XXXUSD, а валюта счета - GBP, не лучше ли вам иметь функцию, которая работает для символа XXXYYY и валюты счета ZZZ ? тогда вы закончите и не будете больше беспокоиться об этом предмете....

Единственное, чего я не знаю, это как создать переключатель, где, как вы сказали, если у брокера есть правильные данные, использовать их? (может, подскажете мне правильное направление?)
Вы могли бы просто сделать расчет и сравнить рассчитанное значение со значением MarketInfo() и если они отличаются более чем на 10%, 20%... ... что бы вы ни считали достаточно большой ошибкой, вы используете вычисленное значение. Вы просто должны быть уверены, что значения, которые вы используете в своих расчетах, верны, поэтому, если вы получите значение Tick Value для символа, базовая валюта которого (EURGBP) такая же, как и валюта вашего счета (GBP), оно будет равно 1.0 (5 цифр Broker), затем вернитесь от него к символу, для которого вам нужно найти значение Tick Value.
 
Хорошая идея! Хорошо, я тут поигрался - если у вас будет минутка, не могли бы вы взглянуть на это, чтобы увидеть, что вы думаете? Я понимаю, что я не сделал это очень надежным - я просто ищу временное решение (я знаю, что слово "временное" - опасное слово!), которое будет оставаться надежным именно с FXCM в промежуточный период... Этот нижеприведенный вариант специально для XAGUSD!(извините, мне нужно было обновить его, так как я разместил не тот!)

minLot всегда либо 50.00 для серебра, либо 1.00 для золота.
//+------------------------------------------------------------------+
//| 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:
Отлично! Итак, я тут поигрался - если у вас будет минутка, не могли бы вы взглянуть на это и посмотреть, что вы думаете? Я понимаю, что я не сделал это очень надежным - я просто ищу временное решение (я знаю, что слово "временное" - опасное слово!), которое будет оставаться надежным именно для FXCM в промежуточный период... Этот нижеприведенный вариант специально для XAGUSD!(извините, мне нужно было обновить его, так как я разместил не тот!)

minLot всегда либо 50.00 для серебра, либо 1.00 для золота.


Вот что-то более общее...

Он может быть расширен, чтобы охватить другие символы у разных брокеров.

Ключевыми параметрами, на которые следует обратить внимание, являются BidUSD и AskUSD. BidUSD - это долларовая цена валюты маржи, поэтому, допустим, ваш TradeSymbol был GBPJPY, тогда BidUSD будет ценой GBPUSD. Аналогично AskUSD будет USDJPY. Если одна из валют маржи или прибыли - USD, например, любая из основных валют, то BidUSD==AskUSD== текущая цена торгового символа.

То, что возвращается этой функцией, - это прибыль/убыток за удержание одного лота (1.0) торгового символа через указанную ценовую дельту (один из входных данных).

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

Спасибо за ваше сообщение, приятель - Не совсем уверен, что я понял из этого - завтра посмотрю внимательнее...

Причина обращения: