Стоимоcть пункта - страница 3

 
Mihail Matkovskij:

Да, действительно, для USDCHF всё оказалось куда сложнее:


Прибыль позиции: 36.19, расчётная прибыль (profit_clc): 36.17. Что я мог не учесть в вычислении?

Я как-то попытался разобраться в этой проблеме. У меня вышел такой вот код:

void OnStart()
{  
   double fContractSize = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_CONTRACT_SIZE);
   double fPoint = SymbolInfoDouble(Symbol(), SYMBOL_POINT);
   string sProfitCurrency = SymbolInfoString(Symbol(), SYMBOL_CURRENCY_PROFIT);
   string sAccountCurrency = AccountInfoString(ACCOUNT_CURRENCY);

   if (sProfitCurrency != sAccountCurrency)
   {
      string sReverse = sAccountCurrency + sProfitCurrency;
      if (IsSymbolExists(sReverse))      
         Alert("Стоимость 1 пункта: ", fPoint * fContractSize / SymbolInfoDouble(sReverse, SYMBOL_BID));
      else
      {
         string sDirect = sProfitCurrency + sAccountCurrency;
         if (IsSymbolExists(sDirect))      
            Alert("Стоимость 1 пункта: ", fPoint * fContractSize * SymbolInfoDouble(sDirect, SYMBOL_BID));
         else
            Alert("Невозможно рассчитать стоимость пункта.");
      }
        
   }
   else
      Alert("Стоимость 1 пункта:  ", fPoint * fContractSize);   
}
bool IsSymbolExists(string sSymbol)
{
   ResetLastError();
   SymbolInfoDouble(sSymbol, SYMBOL_BID);                      
   int error = GetLastError();
   return !(error == 5040 || (error >= 4301 && error <= 4303));
}

И вроде бы совпадало с тем, что отображает терминал, для большинства символов.

P. S. Здесь нет проверок на ошибки (в частности, деления на 0), а также рассчитывается именно стоимость пункта. Нужно учесть, что выше Вы используете стоимость тика. А тик и пункт не всегда равны. Хотя для EURUSD и USDCHF - равны.

 

Сделал в виде советника, уже с проверками. Запустил на GBPJPY. Данные совпадают:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // Нет позиции по текущему символу
   if (!PositionSelect(Symbol()))
      return;
      
   // Стоимость пункта
   double fPointValue = GetPointValue(Symbol());
   if (fPointValue == 0.0)       // Не удалось вычислить стоимость пункта
      return;
      
   // Свойства позиции
   ENUM_POSITION_TYPE ePosType = ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE));
   double fOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
   double fPriceDistance = (ePosType == POSITION_TYPE_BUY)? 
                           (SymbolInfoDouble(Symbol(), SYMBOL_BID) - fOpenPrice) : 
                           (fOpenPrice - SymbolInfoDouble(Symbol(), SYMBOL_ASK));
   double fPoint = SymbolInfoDouble(Symbol(), SYMBOL_POINT);
   if (fPoint <= 0.0)
      return;
   
   // Прибыль позиции
   double fProfitCalc = fPriceDistance / fPoint * fPointValue;
   
   Comment("Прибыль по MT: ", DoubleToString(PositionGetDouble(POSITION_PROFIT), 2), 
           "\nПрибыль расчетная: ", DoubleToString(fProfitCalc, 2));
}
//+------------------------------------------------------------------+
//| Расчет стоимости пункта                                          |
//+------------------------------------------------------------------+
double GetPointValue(string strSymbol)
{
   if (!IsSymbolExists(strSymbol))
      return 0.0;

   double fContractSize = SymbolInfoDouble(strSymbol, SYMBOL_TRADE_CONTRACT_SIZE);
   double fPoint = SymbolInfoDouble(strSymbol, SYMBOL_POINT);
   string sProfitCurrency = SymbolInfoString(strSymbol, SYMBOL_CURRENCY_PROFIT);
   string sAccountCurrency = AccountInfoString(ACCOUNT_CURRENCY);

   // Валюта прибыли совпадает с валютой депозита
   if (sProfitCurrency == sAccountCurrency)
      return fPoint * fContractSize;   

   // Валюта прибыли не совпадает с валютой депозита
   string sReverse = sAccountCurrency + sProfitCurrency;
   if (IsSymbolExists(sReverse))
   {
      double fReverseBid = SymbolInfoDouble(sReverse, SYMBOL_BID);
      if (fReverseBid <= 0.0)
         return 0.0;
         
      return fPoint * fContractSize / fReverseBid;
   }

   string sDirect = sProfitCurrency + sAccountCurrency;
   if (IsSymbolExists(sDirect))      
      return fPoint * fContractSize * SymbolInfoDouble(sDirect, SYMBOL_BID);

   return 0.0;
}
//+------------------------------------------------------------------+
//| Существует ли указанный символ?                                  |
//+------------------------------------------------------------------+
bool IsSymbolExists(string strSymbol)
{
   ResetLastError();
   SymbolInfoDouble(strSymbol, SYMBOL_BID);                      
   int error = GetLastError();
   return !(error == 5040 || (error >= 4301 && error <= 4303));
}
 
Ihor Herasko:

Сделал в виде советника, уже с проверками. Запустил на GBPJPY. Данные совпадают:

Все равно не пойму. Тогда что не так с SYMBOL_TRADE_TICK_VALUE, раз он дает неправильную стоимость пункта? И почему, пункт и тик отличаются, разве это не одно и то же?
 

Тик - минимальное изменение цены, не всегда равно пункту. параметр SYMBOL_TRADE_TICK_SIZE

 

Mihail Matkovskij:
Все равно не пойму. Тогда что не так с SYMBOL_TRADE_TICK_VALUE, раз он дает неправильную стоимость пункта?

Стоимость тика. И с ней все в порядке. Просто нужно ее еще правильно применить. Для этого недостаточно умножить стоимость на расстояние, пройденное ценой. К сожалению, в двух словах не могу объяснить, почему так. 

И почему, пункт и тик отличаются, разве это не одно и то же?

Пункт - это точность представления цены. Тик - насколько минимально может измениться измениться цена. На Форекс-инструментах редко встречается это отличие. А вот на биржевых - сплошь и рядом.
 
Aleksey Lebedev:

Тик - минимальное изменение цены, не всегда равно пункту. параметр SYMBOL_TRADE_TICK_SIZE

Ihor Herasko:

Стоимость тика. И с ней все в порядке. Просто нужно ее еще правильно применить. Для этого недостаточно умножить стоимость на расстояние, пройденное ценой. К сожалению, не могу объяснить, почему так. В МТ4 такого расхождения не замечал, а вот в МТ5 столкнулся с ним.

Пункт - это точность представления цены. Тик - насколько минимально может измениться измениться цена. На Форекс-инструментах редко встречается это отличие. А вот на биржевых - сплошь и рядом.

Примерно так я себе и представлял, что тик, это минимальное изменение цены. Но думал, что на 5-ти знаке пункт и тик это одно и тоже. Хотя, на 4-х знаке часто наблюдал, как цена колеблется в пределах одного пункта. Но там точность в 10 раз меньше. Спасибо за разъяснения. Теперь я точно уверен, что тик и пункт отличаются. А так была какая-то каша в голове. И главное, в справке нет никаких разъяснений, чтобы узнать.

Одно остается в силе. Стоимость пункта и стоимость тика даются при стандартном размере лота в 1, как я и предполагал в самом начале темы.

 
Mihail Matkovskij:

Одно только остается в силе. Стоимость пункта и стоимость тика даются при стандартном размере лота в 1, как я и предполагал в самом начале темы.

Да, для одного лота. Лот завязан на величину контракта. Поэтому 1 лот может быть разной величиной. Это не константа.
 
Mihail Matkovskij:

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

В справке MQL4 дается довольно сжатое описание этого параметра:

MODE_TICKVALUE

16

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


С справке MQL5 есть аж три параметра:

SYMBOL_TRADE_TICK_VALUE

Значение SYMBOL_TRADE_TICK_VALUE_PROFIT

double

SYMBOL_TRADE_TICK_VALUE_PROFIT

Рассчитанная стоимость тика для прибыльной позиции

double

SYMBOL_TRADE_TICK_VALUE_LOSS

Рассчитанная стоимость тика для убыточной позиции

double


Всё, что я понял, это то, что SYMBOL_TRADE_TICK_VALUE и SYMBOL_TRADE_TICK_VALUE_PROFIT, это абсолютно одинаковые флаги по смыслу. И,поэтому, у меня возник вопрос. Может, для вычисления лота по риск менеджменту следует взять SYMBOL_TRADE_TICK_VALUE_LOSS, а не SYMBOL_TRADE_TICK_VALUE, раз лот вычисляется от процента риска по СЛ?

И еще один вопрос, это как раз то, что я не нашел в справке. Что такое, Размер минимального изменения цены инструмента в валюте депозита и
Рассчитанная стоимость тика? При каком объеме изменение цены на 1 пункт будет приводить к изменению прибыли позиции на
SYMBOL_TRADE_TICK_VALUE или SYMBOL_TRADE_TICK_VALUE_LOSS? На сколько я понял, при объеме в 1 лот. Но это только мои догадки. В справке об этом ничего нет.


Похожая тема.

https://www.mql5.com/ru/forum/189438

Как рассчитать размер комиссии брокера в пунктах?
Как рассчитать размер комиссии брокера в пунктах?
  • 2017.04.05
  • www.mql5.com
Брокер кроме спреда начисляет комиссию, например $8 за лот ($100000...
 
Ihor Herasko:
Да, для одного лота. Лот завязан на величину контракта. Поэтому 1 лот может быть разной величиной. Это не константа.

Читал тему и совсем запутался. Получается есть три разных величины: SYMBOL_TRADE_TICK_VALUE, SYMBOL_POINT, SYMBOL_TRADE_TICK_SIZE

В чем их отличие?! В Справке SYMBOL_TRADE_TICK_VALUE=Рассчитанная стоимость тика, SYMBOL_POINT= Значение одного пункта, SYMBOL_TRADE_TICK_SIZE= Минимальное изменение цены

Что интересно - проверил два брокера на полный список символов - у обоих брокеров SYMBOL_POINT = SYMBOL_TRADE_TICK_SIZE

Как я понимаю, я принял SYMBOL_POINT за стоимость тика в валюте депозита (то есть сколько будет стоить изменение тика), а для этого нужно использовать SYMBOL_TRADE_TICK_VALUE?

 
Alexey Kolybelnikov:

Читал тему и совсем запутался. Получается есть три разных величины: SYMBOL_TRADE_TICK_VALUE, SYMBOL_POINT, SYMBOL_TRADE_TICK_SIZE

В чем их отличие?!

  1. Point - минимальное значение, в котором измеряется цена. Для символов типа EURUSD, USDCHF в пятизначной котировке равно 0.00001. 
  2. Tick size - минимально возможное изменение цены за один тик. Не может быть меньше, чем Point. Чаще всего равно Point, но бывают случаи, когда и больше, чем Point. Например, Point = 0.01, а Tick size = 0.02. То есть цена может принимать значения 1.12, 1.14, 1.16, но никак не 1.13, 1.15 или 1.17.
  3. Tick value - стоимость одного пункта. Сколько прибыли или убытка будет получено позицией объемом 1 лот при изменении цены на Tick size.

Как я понимаю, я принял SYMBOL_POINT за стоимость тика в валюте депозита (то есть сколько будет стоить изменение тика), а для этого нужно использовать SYMBOL_TRADE_TICK_VALUE?

Да.