Почему для некоторых криптовалют функция symbol_info.TickValue() возвращает 0? Как тогда рассчитать риск?

 
Сразу скажу, что проблема не у всех криптовалют, у BTCUSD, ETHUSD - все ровно. Проблемы начинаются у других криптовалют XRPUSD, DOGEUSD, MATICUSD и др., для них функция TickValue() возвращает нулевое значение. // Итак, есть объект symbol_info класса CSymbolInfo для получения свойств символа CSymbolInfo symbol_info; // Инициализируем его текущим именем финансового инструмента для которого будем получать информацию symbol_info.Name(_Symbol); // где _Symbol - это XRPUSD, DOGEUSD, MATICUSD и др. // Далее получаем информацию по этому символу double nTickSize = symbol_info.TickSize(); double nLotsMin = symbol_info.LotsMin(); // Минимальный размер лота double nLotsMax = symbol_info.LotsMax(); // Максимальный размер лота double nLotsStep = symbol_info.LotsStep();// Минимальный шаг лота // Все хорошо, пока не запрошен размер минимального изменения цены инструмента в валюте депозита double nTickValue = symbol_info.TickValue(); // Получаем нулевое значение!!! Подобное поведение получается у нескольких брокеров. Как узнать/получить ненулевой размер минимального изменения цены инструмента в валюте депозита?
 
Eugene Myzrov:
Сразу скажу, что проблема не у всех криптовалют, у BTCUSD, ETHUSD - все ровно. Проблемы начинаются у других криптовалют XRPUSD, DOGEUSD, MATICUSD и др., для них функция TickValue() возвращает нулевое значение. // Итак, есть объект symbol_info класса CSymbolInfo для получения свойств символа CSymbolInfo symbol_info; // Инициализируем его текущим именем финансового инструмента для которого будем получать информацию symbol_info.Name(_Symbol); // где _Symbol - это XRPUSD, DOGEUSD, MATICUSD и др. // Далее получаем информацию по этому символу double nTickSize = symbol_info.TickSize(); double nLotsMin = symbol_info.LotsMin(); // Минимальный размер лота double nLotsMax = symbol_info.LotsMax(); // Максимальный размер лота double nLotsStep = symbol_info.LotsStep();// Минимальный шаг лота // Все хорошо, пока не запрошен размер минимального изменения цены инструмента в валюте депозита double nTickValue = symbol_info.TickValue(); // Получаем нулевое значение!!! Подобное поведение получается у нескольких брокеров. Как узнать/получить ненулевой размер минимального изменения цены инструмента в валюте депозита?

решение не очень приятное, НО : не торговать крипту в MT. 

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

---

TickValue это рассчётная величина, то есть она рассчитывается через базовую валюту и кросс-курсы, по торговым маршрутам, к валюте депозита.. Чтобы нормально торговать крипту (или не-крипту, но с не-USD или EUR на счёте),

лучше рассчитывать это самому. Это не столь сложно, но крайне муторно. А TickValue просто упрощает подобные рассчёты.

Ещё, В 4-ке (возможно у некоторых DC и в 5-ке) требуется чтобы нужные кроссы по маршруту обязательно были в "обзоре рынка";

ВАЖНО: При торговле крипты, TickValue может очень малой величиной, и привычным Print(x) будет выведен 0. 

 
Maxim Kuznetsov #:


ВАЖНО: При торговле крипты, TickValue может очень малой величиной, и привычным Print(x) будет выведен 0. 

Спорное утверждение.
Максимум разрядов после запятой на крипте, восемь.
Топик стартер принимает в тип double, который вмещает 16 разрядов.

У биржевого брокера, в спецификации инструмента на акции тоже показывает ноль.
Но принт выводит верно. Странное поведение.

финам

2025.03.18 22:18:21.905 TEST (SBER,M1)  SBER SYMBOL_TRADE_TICK_VALUE 0.1
 
Roman #:

Спорное утверждение.
Максимум разрядов после запятой на крипте, восемь.
Топик стартер принимает в тип double, который вмещает 16 разрядов.

У биржевого брокера, в спецификации инструмента на акции тоже показывает ноль.
Но принт выводит верно. Странное поведение.

я просто не знаю как он пришёл к выводу что 0, кодов же не было никаких

Типичное (и в корне неверное) для форума  Print(x) - до 5-го если не ошибаюсь знака выводит. То есть может напечатать 0 просто при малой величине

А с криптой может быть всё что угодно..типичное представление крипто-котира: не менее 5-ти значащих разрядов (начиная со старшего) но не менее 10^-10.

PS/ честно говоря не вполне понимаю как можно крипто-котир перевести в MT, в крипте Point (и Digist) плавающая величина, в MT суровая константа. 

 
Maxim Kuznetsov #:

Типичное (и в корне неверное) для форума  Print(x) - до 5-го если не ошибаюсь знака выводит. То есть может напечатать 0 просто при малой величине

А как же DBL_MIN ?

Print(DBL_MIN);
2025.03.18 23:03:25.736 TEST (SBER,M1)  2.2250738585072014e-308

Print же не усекает его до пятого знака ))

 
Roman #:

А как же DBL_MIN ?

Print же не усекает его до пятого знака ))

DBL_MIN и иже с ним это на грани фола :-) 

ещё помяни неномализаованые по IEEE величины 

PS/ это выходит за рамки обсуждений. В любом случае Print(x) это злое зло - компилятор вынужден привести X в нечто печатаемое и определить его конверсии. И это во время компиляции, когда величина X будет определена только в ран-тайм; 

PPS/ Нельзя пользоваться Print(x) если X не строка. Болдом выделено, расцвечено, делайте так и будет счастье

 
Maxim Kuznetsov #:


PPS/ Нельзя пользоваться Print(x) если X не строка. Болдом выделено, расцвечено, делайте так и будет счастье

Чудны твои явления MQL5.
Абсолютный ноль вернул.

Print(DoubleToString(DBL_MIN, 16));
2025.03.18 23:28:52.049 TEST (SBER,M1)  0.0000000000000000
 
Roman #:

Чудны твои явления MQL5

у вас 

DoubleToString(DBL_MIN, 16)

на выходе дал строку. 

Её как-раз можно без страха отдавать в Print(x).. ты уже определил величины и точность 

 
Maxim Kuznetsov #:

у вас 

на выходе дал строку. 

Её как-раp можно без страха отдавать в Print(x)

Да это понятно. Чудо в том, что он абсолютный ноль возвращает.
На конце справа нет единички.

 
Roman #:

Да это понятно. Чудо в том, что он абсолютный ноль возвращает.
На конце справа нет единички.

Почему же это чудо? Единичка должна быть в 308-ом (утрирую) разряде, а ограничение стоит - 16.

 
Ihor Herasko #:

Почему же это чудо? Единичка должна быть в 308-ом (утрирую) разряде, а ограничение стоит - 16.

Я вот точно не помню, но раньше вроде такая запись выводила с единичкой в конце

Print(DoubleToString(DBL_MIN, 16));

А после 308 нуля, там двойка должна быть

printf("%.308f" , DBL_MIN);

prf