MODE_TICKVALUE -- ВРЕТ!!!! :) - страница 3

 
SProgrammer писал(а) >>

Я же типа вумный, ты же знаешь :) - я же в тестере скрип-то запускал. Там ничего не детерминорованного быть не может.

Я там приводил пример - можешь ручками расчитать? И ответ из маркетинфо я тоже приводил.

На сайтах многих ДЦ есть калькулятор, сделан на JavaScript, можно выдрать и посмотреть как правильно считать.

 

Для валютных пар где валюта котировки совпадает с валютой депо

MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_TICKSIZE) 

в расширенном варианте нужно будет анализировать валюту котировки...

 

Валюта депо USD, кидаем код на график USDJPY, показания подследственых совпадают

MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_TICKSIZE) )/MarketInfo(Symbol(),MODE_BID)
значица мона доверять тикволюму...
 
SProgrammer >>:

Вы ручками считать проверяли?

Умею только автоматом:

#property show_inputs

extern string BaseCurrency = "USD";

bool RealSymbol( string Str )
{
  return(MarketInfo(Str, MODE_BID) != 0);
}

double GetTickValue( string Symb, bool Average )
{
  string Str, ProfitCurrency, SymbolPrefix;
  double Res, PriceExchage;
  
  ProfitCurrency = StringSubstr(Symb, 3, 3);
  SymbolPrefix = StringSubstr(Symb, 6);
  
  if (ProfitCurrency == BaseCurrency)
    Res = MarketInfo(Symb, MODE_LOTSIZE) * MarketInfo(Symb, MODE_TICKSIZE);
  else
  {
    Str = BaseCurrency + ProfitCurrency + SymbolPrefix;
    
    if (RealSymbol(Str))
    {
      if (Average)
        PriceExchage = (MarketInfo(Str, MODE_BID) + MarketInfo(Str, MODE_ASK)) / 2;
      else
//        PriceExchage = MarketInfo(Str, MODE_BID); // Так считает MetaTrader4 - неправильно
        PriceExchage = MarketInfo(Str, MODE_ASK); // Правильный вариант
        
      Res = MarketInfo(Symb, MODE_LOTSIZE) * MarketInfo(Symb, MODE_TICKSIZE) / PriceExchage;
    }
    else
    {
      Str = ProfitCurrency + BaseCurrency + SymbolPrefix;

      if (Average)
        PriceExchage = (MarketInfo(Str, MODE_BID) + MarketInfo(Str, MODE_ASK)) / 2;
      else
        PriceExchage = MarketInfo(Str, MODE_BID);
        
      Res = MarketInfo(Symb, MODE_LOTSIZE) * MarketInfo(Symb, MODE_TICKSIZE) * PriceExchage;
    }
  }
  
  return(Res);
}

void start()
{  
  double TickValue, TickValue1, TickValue2;
  
  TickValue = MarketInfo(Symbol(), MODE_TICKVALUE);
  TickValue1 = GetTickValue(Symbol(), TRUE);
  TickValue2 = GetTickValue(Symbol(), FALSE);
  
  Print("MT4 TickValue = " + DoubleToStr(TickValue, 5));
  Print("Average TickValue = " + DoubleToStr(TickValue1, 5));
  Print("Real TickValue = " + DoubleToStr(TickValue2, 5));
  
  return;
}

Вы оказались правы,  MODE_TICKVALUE считается в некоторых случаях некорректно: все считается только через BID-цену, даже когда надо считать через ASK-цену.

 
getch >>:

Умею только автоматом:

Вы оказались правы, MODE_TICKVALUE считается в некоторых случаях некорректно: все считается только через BID-цену, даже когда надо считать через ASK-цену.

А насколь % эта погрешность?

 
kombat >>:

А насколь % эта погрешность?

Достаточная, чтобы у аудиторов возникли вопросы.

 
getch >>:

Достаточная, чтобы у аудиторов возникли вопросы.

По тик волуму???

Мне казалось что их интересует лишь цена окрытия цена закрытия...

 
kombat >>:

Нуно не одна из, а та что валюта котировки, JPY в данном случае.

Смотрите -


USDJPY


тестер на периоде


2008/10/01 -> 2009/01/01


Пропустить до 2008/10/01


====


2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_FREEZELEVEL=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_MARGINREQUIRED=1000.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_MARGINHEDGED=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_MARGINMAINTENANCE=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_MARGININIT=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_MARGINCALCMODE=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_PROFITCALCMODE=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_SWAPTYPE=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_MAXLOT=1000.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_LOTSTEP=0.10000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_MINLOT=0.10000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_TRADEALLOWED=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_EXPIRATION=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_STARTING=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_SWAPSHORT=-0.50000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_SWAPLONG=-0.50000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_TICKSIZE=0.00100000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_TICKVALUE=1.09488252

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_LOTSIZE=100000.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_STOPLEVEL=20.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_SPREAD=19.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_DIGITS=3.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_POINT=0.00100000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_ASK=111.70900000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_BID=111.69000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_TIME=1199260860.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_HIGH=0.00000000

2010.01.13 12:14:42 2008.01.02 08:01 OTestExpert3 USDJPY,M1: MODE_LOW=0.00000000


=============


string s=Symbol();
   
   int Code2[]={  MODE_LOW,
                  MODE_HIGH,
                  MODE_TIME,
                  MODE_BID,
                  MODE_ASK,
                  MODE_POINT,
                  MODE_DIGITS,
                  MODE_SPREAD,
                  MODE_STOPLEVEL,
                  MODE_LOTSIZE,
                  MODE_TICKVALUE,
                  MODE_TICKSIZE,
                  MODE_SWAPLONG,
                  MODE_SWAPSHORT,
                  MODE_STARTING,
                  MODE_EXPIRATION,
                  MODE_TRADEALLOWED,
                  MODE_MINLOT,
                  MODE_LOTSTEP,
                  MODE_MAXLOT,
                  MODE_SWAPTYPE,
                  MODE_PROFITCALCMODE,
                  MODE_MARGINCALCMODE,
                  MODE_MARGININIT,
                  MODE_MARGINMAINTENANCE,
                  MODE_MARGINHEDGED,
                  MODE_MARGINREQUIRED,
                  MODE_FREEZELEVEL
               };
   string CodeName2[]={"MODE_LOW",
                        "MODE_HIGH",
                        "MODE_TIME",
                        "MODE_BID",
                        "MODE_ASK",
                        "MODE_POINT",
                        "MODE_DIGITS",
                        "MODE_SPREAD",
                        "MODE_STOPLEVEL",
                        "MODE_LOTSIZE",
                        "MODE_TICKVALUE",
                        "MODE_TICKSIZE",
                        "MODE_SWAPLONG",
                        "MODE_SWAPSHORT",
                        "MODE_STARTING",
                        "MODE_EXPIRATION",
                        "MODE_TRADEALLOWED",
                        "MODE_MINLOT",
                        "MODE_LOTSTEP",
                        "MODE_MAXLOT",
                        "MODE_SWAPTYPE",
                        "MODE_PROFITCALCMODE",
                        "MODE_MARGINCALCMODE",
                        "MODE_MARGININIT",
                        "MODE_MARGINMAINTENANCE",
                        "MODE_MARGINHEDGED",
                        "MODE_MARGINREQUIRED",
                        "MODE_FREEZELEVEL"
                        };
   
   for ( i=0;i< ArraySize(Code2);i++){
      
      double mre  = MarketInfo ( s, Code2[i]);
      int    err = GetLastError();
         
      Print ( CodeName2[i],"=", DoubleToStr(mre,9));
 
      
      if ( ERR_NO_ERROR != err )
          Print ( "error(",err,")", "--", ErrorDescription(err)  );
 
SProgrammer >>:

MODE_TICKVALUE для EURUSD по маркетинфо = 1.0000000 :), а не 10.


1 - для 5 знаков

10 - для 4

 
kombat >>:

По тик волуму???

Мне казалось что их интересует лишь цена окрытия цена закрытия...

Не знаю, как разработчики считают прибыль. Если они это делают через MODE_TICKVALUE, то прибыль в некоторых случаях считается неправильно - больше, чем на самом деле. Например, на GBPJPY.

Но на самом деле MetaTrader4 прибыль вообще считает неправильно - он сразу переводит валюту прибыли в базовую валюту счета. Правильно это делать на момент валютирования.

На межбанке Equity постоянно меняется, если вы открыли и закрыли позицию с валютой прибыли не равной валюте счета (например, на USD-счете совершили сделку на USDJPY). И только в момент валютирования (возможно, неправильно использую этот термин) Equity фиксируется (на примере - прибыль в JPY переводится по текущему курсу USDJPY в USD).

Самое интересно, как считается прибыль, например, по AUDNZD на EUR-счете, когда курса EURNZD у брокера нет...