Помогите, пожалуйста, разобраться. Похоже, я запутался в простых вопросах.
Пытаюсь программно вычислить стоимость 1 пункта. Вот скрипт:
Нужно учитывать размер контракта, а на даксе он как-раз таки не равный 1
Нужно учитывать размер контракта, а на даксе он как-раз таки не равный 1
В данном случае контракт указан = 10.
Да. И как с помощью этого значения ответить на вопросы? Собственно, вопрос в том, как это закодировать.
ИМХО, стоимость одного пункта в валюте депозита для 1 лота всегда была (SYMBOL_TRADE_TICK_VALUE) / (SYMBOL_TRADE_TICK_SIZE). Или вопрос в другом?
Да, это близко к истине, но не полная истина. Если ни о чём больше не думая просто сделать что Вы предлагаете, то на Даксе вроде работает, а на Евре - нет.
Здесь, видимо, нужно учитывать методы расчётов (например, что такое SYMBOL_TRADE_CALC_MODE ), которые я пока не могу найти в документации. Должны же где-то быть формулы. Может подскажете где почитать?
Поэтому формула вроде бы должна быть такая:
(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 невозможно, такая цена не существует.
Правда, в большинстве случаев пункт и размер тика совпадают.
Да, это близко к истине, но не полная истина. Если ни о чём больше не думая просто сделать что Вы предлагаете, то на Даксе вроде работает, а на Евре - нет.
Здесь, видимо, нужно учитывать методы расчётов (например, что такое SYMBOL_TRADE_CALC_MODE ), которые я пока не могу найти в документации. Должны же где-то быть формулы. Может подскажете где почитать?
Ihor Herasko:
..
Спасибо за разъяснения.
Действительно, я не учёл, что по Даксу стоимость пункта кратна (таки кратна), но не доллару, а евро. 1.1246 - это курс евро на тот момент. Это многое прояснило.
Но вопросы остались. Я пока не могу представить код, который подходил бы и для валютных пар и для индексов, подобных Даксу. Смысл-то мне понятен, но вот в моём примере кода на даксе где-то теряется 10: стоимость пункта получается в 10 раз меньше. Если Вы можете, покажите, пожалуйста, как должно выглядеть это выражение в коде.
Я как раз это и спрашиваю, т.к не смог найти. Если Вы знаете где это описано, дайте, пожалуйста, ссылку.
Добавлено: кликнул по ссылке, здесь есть какие-то формулы. Спасибо. Буду разбираться.
Смысл-то мне понятен, но вот в моём примере кода на даксе где-то теряется 10: стоимость пункта получается в 10 раз меньше. Если Вы можете, покажите, пожалуйста, как должно выглядеть это выражение в коде.
Для начала давайте определимся, что Вы понимаете под пунктом. Проблема в том, что есть, как минимум, две трактовки этого термина: биржевой пункт (4-хзнак по EURUSD) и то, что возвращает функция Point().
Для второго случая ответ Станислав дал. Тут и добавить нечего.
Для начала давайте определимся, что Вы понимаете под пунктом. Проблема в том, что есть, как минимум, две трактовки этого термина: биржевой пункт (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 (я хочу вычислить значения в валюте счёта, счёт открыт в $)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите, пожалуйста, разобраться. Похоже, я запутался в простых вопросах.
Пытаюсь программно вычислить стоимость 1 пункта. Вот скрипт:
{
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 пункт?