Стоимость 1 пункта и другие параметры ордера.

 

Помогите, пожалуйста, разобраться. Похоже, я запутался в простых вопросах.

Пытаюсь программно вычислить стоимость 1 пункта. Вот скрипт:

void OnStart()
   {  
   string
      str_0,str_1,str_2,str_3,str_4,str_5,str_6,
      text;                               
   double
      pips_up, pips_dn,                   
      calc_margin_buy,                    
      calc_margin_sell,                   
      ask, bid;                           


   str_0 = "Информация по   " + _Symbol+ "\n";                                                          
   str_1 = "Плечо                      =  1 : " + AccountInfoInteger(ACCOUNT_LEVERAGE)+ "\n";
   str_2 = "Значение одного пункта  =  " + DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_POINT), _Digits) + " (" + _Digits + "й знак)" + "\n";
   
   ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);                                               
   bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   OrderCalcMargin(ORDER_TYPE_BUY,  _Symbol, 1.0, ask, calc_margin_buy );                    
   OrderCalcMargin(ORDER_TYPE_SELL, _Symbol, 1.0, bid, calc_margin_sell);                    
   str_3 = "Стоимость 1 лота BUY       = "+ calc_margin_buy + "\n";                          
   str_4 = "Стоимость 1 лота SELL      = "+ calc_margin_sell+ "\n";                          
   
// Стоимость 1 пункта:
   pips_up = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_PROFIT),4);
   pips_dn = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_LOSS  ),4);
   str_5 = "Стоимость 1 пункта (1 лот) вверх =  "+ pips_up +"\n";                        
   str_6 = "Стоимость 1 пункта (1 лот) вниз  =  "+ pips_dn;

   text = str_0+str_1+str_2+str_3+str_4+str_5+str_6;
   Print("=============================================================================");
   Print(text);                                                          
   }


На валютах показывает результаты, совпадающие с моим пониманием.

На DAX30 я не могу понять:

На верхней картинке стоимость 1 пункта получается: 111.34 / (12725.7 - 12715.8) = 111.34/9.9

После закрытия оказалось, что есть ещё комиссия 4.58.


Поэтому формула вроде бы должна быть такая:

(111.34 - 4.58) / (12725.7 - 12715.8) = 106.76/9.9 = 106.76/99пт.

Вопросы такие:

1. Должна ли стоимость 1 п быть кратна 1$ или его 10й или 100й доле?

2. Какова на Ваш взгляд стоимость 1 пункта? (даже если отбросить неровности, то 1$ всё равно не 0.1$, как у скрипта)

3. Какова (и если можно, почему) стоимость 1 лота по этому фин. инструменту? (результаты скрипта и циферка в терминале тоже не совпадают)

4. Где обо всём этом можно почитать?

5. Что такое "стоимость тика"? (https://www.mql5.com/ru/docs/constant_indices, SYMBOL_TRADE_TICK_VALUE_PROFIT) Правильно ли понимать, что под тиком здесь имеется ввиду минимальное изменение цены, т.е. 1 пункт?

Документация по MQL5: Список констант языка MQL5
Документация по MQL5: Список констант языка MQL5
  • www.mql5.com
Список констант языка MQL5 - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
User_mt5:

Помогите, пожалуйста, разобраться. Похоже, я запутался в простых вопросах.

Пытаюсь программно вычислить стоимость 1 пункта. Вот скрипт:


Нужно учитывать размер контракта, а на даксе он как-раз таки не равный 1


 
Vitaly Muzichenko:

Нужно учитывать размер контракта, а на даксе он как-раз таки не равный 1


В данном случае контракт указан = 10.

Да. И как с помощью этого значения ответить на вопросы? Собственно, вопрос в том, как это закодировать.

 
ИМХО, стоимость одного пункта в валюте депозита для 1 лота всегда была (SYMBOL_TRADE_TICK_VALUE) / (SYMBOL_TRADE_TICK_SIZE). Или вопрос в другом?
 
Stanislav Korotky:
ИМХО, стоимость одного пункта в валюте депозита для 1 лота всегда была (SYMBOL_TRADE_TICK_VALUE) / (SYMBOL_TRADE_TICK_SIZE). Или вопрос в другом?

Да, это близко к истине, но не полная истина. Если ни о чём больше не думая просто сделать что Вы предлагаете, то на Даксе вроде работает, а на Евре - нет.

Здесь, видимо, нужно учитывать методы расчётов (например, что такое SYMBOL_TRADE_CALC_MODE ), которые я пока не могу найти в документации. Должны же где-то быть формулы. Может подскажете где почитать?

 
User_mt5:

Поэтому формула вроде бы должна быть такая:

(111.34 - 4.58) / (12725.7 - 12715.8) = 106.76/9.9 = 106.76/99пт.

4.58 здесь - лишнее, т. к. до момента закрытия сделки комиссия по ней нигде не учитывается. Таким образом, стоимость пункта (если пунктом в данном случае Вы считаете все, что слева от запятой) будет $11,246. Хотя в терминологии МТ стоимость пункта будет $1.1246.

1. Должна ли стоимость 1 п быть кратна 1$ или его 10й или 100й доле? 

Нет.


2. Какова на Ваш взгляд стоимость 1 пункта? (даже если отбросить неровности, то 1$ всё равно не 0.1$, как у скрипта)

$1.1246

3. Какова (и если можно, почему) стоимость 1 лота по этому фин. инструменту? (результаты скрипта и циферка в терминале тоже не совпадают)

Залог? Тогда именно то, что вывел скрипт. Ведь необходимый залог изменяется с каждым тиком, а Вы, как я понял, не придумали, как синхронизировать запуск скрипта и момент открытия сделки.

4. Где обо всём этом можно почитать?

В статьях на этом сайте. Но информация вряд ли будет структурирована именно в таком ракурсе, который Вам нужен. Придется собирать информацию по разным источникам.

5. Что такое "стоимость тика"? (https://www.mql5.com/ru/docs/constant_indices, SYMBOL_TRADE_TICK_VALUE_PROFIT) Правильно ли понимать, что под тиком здесь имеется ввиду минимальное изменение цены, т.е. 1 пункт?

Нет. Тик и пункт, по большому счету, разные понятия. Пункт (не биржевой, а точность котировок; то, что получаем от функции Point()) - это минимальное значение стоимости финансового инструмента в категории цены. А тик - это минимально возможное изменение этой цены.

К примеру, у инструмента котировка 2736.470. В этом случае пункт равен 0.001.А вот размер тика может быть в 10 раз больше - 0.01. То есть купить или продать по цене 2736.472 невозможно, такая цена не существует.

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

 
User_mt5:

Да, это близко к истине, но не полная истина. Если ни о чём больше не думая просто сделать что Вы предлагаете, то на Даксе вроде работает, а на Евре - нет.

Здесь, видимо, нужно учитывать методы расчётов (например, что такое SYMBOL_TRADE_CALC_MODE ), которые я пока не могу найти в документации. Должны же где-то быть формулы. Может подскажете где почитать?

Разве в документации по ENUM_SYMBOL_CALC_MODE не написаны все формулы?
 

Ihor Herasko:

..

Спасибо за разъяснения.

Действительно, я не учёл, что по Даксу стоимость пункта кратна (таки кратна), но не доллару, а евро. 1.1246 - это курс евро на тот момент. Это многое прояснило.

Но вопросы остались. Я пока не могу представить код, который подходил бы и для валютных пар и для индексов, подобных Даксу. Смысл-то мне понятен, но вот в моём примере кода на даксе где-то теряется 10: стоимость пункта получается в 10 раз меньше. Если Вы можете, покажите, пожалуйста, как должно выглядеть это выражение в коде.

 
Stanislav Korotky:
Разве в документации по ENUM_SYMBOL_CALC_MODE не написаны все формулы?

Я как раз это и спрашиваю, т.к не смог найти. Если Вы знаете где это описано, дайте, пожалуйста, ссылку.

Добавлено: кликнул по ссылке, здесь есть какие-то формулы. Спасибо. Буду разбираться.

 
User_mt5:

Смысл-то мне понятен, но вот в моём примере кода на даксе где-то теряется 10: стоимость пункта получается в 10 раз меньше. Если Вы можете, покажите, пожалуйста, как должно выглядеть это выражение в коде.


Для начала давайте определимся, что Вы понимаете под пунктом. Проблема в том, что есть, как минимум, две трактовки этого термина: биржевой пункт (4-хзнак по EURUSD) и то, что возвращает функция Point().

Для второго случая ответ Станислав дал. Тут и добавить нечего.

 
Ihor Herasko:


Для начала давайте определимся, что Вы понимаете под пунктом. Проблема в том, что есть, как минимум, две трактовки этого термина: биржевой пункт (4-хзнак по EURUSD) и то, что возвращает функция Point().

Для второго случая ответ Станислав дал. Тут и добавить нечего.

Думаю, что мой случай второй, т.е. пункт - это значение Point(). (правда, не понятно как это здесь использовать)

Вот код по формуле от Станислава (если я всё правильно понял):

void OnStart()
   { 
   Alert(" =============================================================================");
// SYMBOL_TRADE_TICK_VALUE_PROFIT Рассчитанная стоимость тика для прибыльной позиции
// SYMBOL_TRADE_TICK_SIZE  Минимальное изменение цены

   double pips = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_PROFIT);
   double stts = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   Alert("pips = ", pips, "     stts = ", stts, "     Стоимость 1 пункта (1 лот)  =  ", pips / stts);
   }

На Даксе получается 1.0, а на евре 99999.9(9)

Но судя по всему, правильные ответы соответственно 1.1246 и 1.0 (я хочу вычислить значения в валюте счёта, счёт открыт в $)