Расчет TickValue и прибыли

 

В MT4 столкнулся с неверным расчетом значения MODE_TICKVALUE для FOREX-инструментов. Скрипт на MQL4, показывающий это:

#property show_inputs

extern string BaseCurrency = "USD";

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

double GetTickValue( string Symb )
{
  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))
    {
//      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;

      PriceExchage = MarketInfo(Str, MODE_BID);
        
      Res = MarketInfo(Symb, MODE_LOTSIZE) * MarketInfo(Symb, MODE_TICKSIZE) * PriceExchage;
    }
  }
  
  return(Res);
}

void start()
{  
  double TickValueMT4, TickValueReal;
  
  TickValueMT4 = MarketInfo(Symbol(), MODE_TICKVALUE);
  TickValueReal = GetTickValue(Symbol());
  
  Print("MT4 TickValue = " + DoubleToStr(TickValueMT4, 5));
  Print("Real TickValue = " + DoubleToStr(TickValueReal, 5));
  
  return;
}

Например, на USD-счете TickValue GBPJPY считается неправильно. Из-за этого прибыль по этой паре и многим другим показывается (и начисляется) завышенная.

Также встает вопрос правильного расчета TickValue при подобных ситуациях:

как считается TickValue AUDNZD на EUR-счете, когда у брокера нет пары EURNZD? Понятно, что TickValue считается через синтетический кросс EURNZD, но здесь встает вопрос неоднозначности, т.к. синтетических кроссов EURNZD может быть несколько и их цены могут (как правило) различаться. По какому синтетическому инструменту будет вычисляться TickValue и прибыль на MT5?

Проблему TickValue поднял на MT5, т.к., очевидно, ошибки, как правило, качуют от одной версии терминала к другой.

Далее еще тема по расчету прибыли:

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

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

Как на MT5 эта разница в подходах расчета прибыли состыковывается? На момент валютирования добавляется/списывается соответствующая сумма?

Это касается не только FOREX-инструментов, т.к. некоторые фондовые инструменты считаются в разных валютах. 

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

У Вас неправильное понимание значения MODE_TICKVALUE:

MODE_TICKVALUE16Размер минимального изменения цены инструмента в валюте депозита

Мы не используем эту величину в своих расчетах профитов.


О сложных случаях пересчета: при отсутствии прямого курса используется конвертация через доллар.

MarketInfo - Документация на MQL4
  • docs.mql4.com
MarketInfo - Документация на MQL4
 

Вы привели определение, которое так и понимаю. Именно на основаниии этого определения и написал вышеприведенный код.

При вычислении TickValue вы используете только BID-цену. С такой же логикой могли использовать и только ASK-цену. Но надо же использовать, как одну, так и другую цену для расчета TickValue.

Например, для расчета TickValue USDJPY для USD-счета вам надо JPY перевести в USD. Это делается через ASK-цену USDJPY, а не BID, как у вас.

Так или иначе косвенно для расчета профитов вы не можете не использовать на определенном этапе TickValue. Если у вас логика такая же при его расчете там, то профит считается иногда некорректно.

P.S. Может показаться, что пытаюсь сделать "из мухи слона", но есть ясное понимание, что у вас ошибка.

P.P.S. По теме валютирования пока определенного решения не приняли? 

 
getch   :

Вы привели определение, которое так и понимаю. Именно на основаниии этого определения и написал вышеприведенный код.

При вычислении TickValue вы используете только BID-цену. С такой же логикой могли использовать и только ASK-цену. Но надо же использовать, как одну, так и другую цену для расчета TickValue.

Например, для расчета TickValue USDJPY для USD-счета вам надо JPY перевести в USD. Это делается через ASK-цену USDJPY, а не BID, как у вас.

Ничего переводить не надо, USDJPY означает цену американского доллара в йенах и котируется в йенах. При точности 2 знака после запятой TickValue будет означать 0.01. То есть, минимальное допустимое изменение котировочной цены. Цена может измениться с 95.60 до 95.61, но не до 95.604. Ничего никуда конвертироватьне нужно.

 
Rosh, вы путаете TickSize с TickValue.
 
getch   :
Rosh, вы путаете TickSize с TickValue.

Да, точно, перепутал.

 
Renat   :

У Вас неправильное понимание значения MODE_TICKVALUE:

MODE_TICKVALUE 16 Размер минимального изменения цены инструмента в валюте депозита

Мы не используем эту величину в своих расчетах профитов.


О сложных случаях пересчета: при отсутствии прямого курса используется конвертация через доллар.

:) День добрый. А сообственно эта тема выросла из темы на форуме mql4 .

И на самом деле "ошибка"  немного другая - по сути там показывается через маркетинфо один бид а при расчете используется значение по текущему рынку. То есть получается расхождение. Что не есть хорошо.

https://www.mql5.com/ru/forum/123136/page3 

  

***

То getch - 

Только зачем сюда в mql5 было постить то что никак к нему не относится?

Тут такой "ошибки" быть не может - тестер то мультивалютный. :)

MODE_TICKVALUE -- ВРЕТ!!!! :) - MQL4 форум
  • www.mql5.com
MODE_TICKVALUE -- ВРЕТ!!!! :) - MQL4 форум
 

SProgrammer, вам там же уже написал о TickValue для тестера MT4:

Это не ошибка (расчет TickValue в тестере).
Вы имеете возможность тестировать стратегии на USD-счете, например, на GBPJPY, не имея истории на USDJPY. В этом есть свои плюсы и минусы.

Чтобы корректно считать TickValue в тестере, необходимо, чтобы он работал по тиковой истории сразу нескольких торговых инструментов.

В данной ветке поднят вопрос расчета TickValue и прибыли не в тестере, а в реальной торговле на MT5.

MODE_TICKVALUE -- ВРЕТ!!!! :) - MQL4 форум
  • www.mql5.com
MODE_TICKVALUE -- ВРЕТ!!!! :) - MQL4 форум
 
getch   :

SProgrammer, вам там же уже написал о TickValue для тестера MT4:

Это не ошибка (расчет TickValue в тестере).
Вы имеете возможность тестировать стратегии на USD-счете, например, на GBPJPY, не имея истории на USDJPY. В этом есть свои плюсы и минусы.

Чтобы корректно считать TickValue в тестере, необходимо, чтобы он работал по тиковой истории сразу нескольких торговых инструментов.

В данной ветке поднят вопрос расчета TickValue и прибыли не в тестере, а в реальной торговле.

Так я ошибки тут вообще не вижу. :) Расчет прибыли идет по другому. :)

Ну да лано -  все, что называется вопрос исчерпан.

Хотя Вы зачем-то взяли тему про _одно_ и придумал _свое_, которого нет. :)

Ладно - проехали... Без обид, ладно? :)

 
getch   :

В данной ветке поднят вопрос расчета TickValue и прибыли не в тестере, а в реальной торговле на MT5.

Мы не используем параметр TickValue в расчетах. Там используются прямые формулы конверсий.

 
SProgrammer :

Так я ошибки тут вообще не вижу. :) Расчет прибыли идет по другому. :)

 Все. Вы зачем-то взяли тему про _одно_ и придумал _свое_, кторого нет. :)

Не представляю, как по другому (не через TickValue) можно вычислять прибыль.

В вашей теме я написал скрипт, который обнаружил ошибку расчета TickValue в реальной торговле.

Хочется, чтобы этой ошибки в MT5 не было.

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