Универсальная формула расчета объема ордера по заданному риску для всех инструментов

 

Во время торговли любым инструментом существуют две прямо противоположные задачи.


Задача №1. По заданному объему открываемой позиции в лотах и размеру SL в пунктах вычислить размер убытка в валюте депозита, чаще всего это USD.

Задача №2. По заданному убытку в валюте депозита (USD) и размеру SL в пунктах вычислить объем открываемой позиции в лотах.

Достаточно решить одну задачу, вторая решается обратными расчетами. Для определенности попробуем найти решение Задачи №1. Какие данные нам для этого понадобятся?


Параметры, которые поставляет брокер:

CONTRACT -  размер контракта в единицах базовой валюты
TICK_SIZE - размер тика, минимальный шаг изменения цены инструмента
TICK_VOLUME - цена тика, минимальное изменение цены инструмента в валюте депозита

Параметры, которыми управляет трейдер:

VOLUME
- объем открываемой позиции в лотах
OPEN – цена открытия
CLOSE – цена закрытия

В таблице Excel находятся две формулы.
Одна формула предназначена для промежуточного расчета кол-ва пунктов, которая прошла цена от открытия позиции до ее закрытия. Эта формула для ячейки L3 выглядит так: =ЕСЛИ(D3>0;K3-H3;H3-K3)/F3

Вторая формула предназначена для окончательно расчета прибыли/убытков и находится в ячейке M3 первой строки таблицы: =ОКРУГЛ(L3*G3*ABS(D3)*E3*P3;2)
Обе формулы следует протянуть (продублировать) ниже во всех строчках таблицы Excel.

Как видно из приведенной таблицы формула вначале давала правильные расчеты, т.е. они совпадали с фактическими значениями П/У в терминале MT5. Активами здесь выступали разные инструменты: валютные пары, криптовалюты и индексы.

Но далее что-то пошло не так, расчеты П/У для других активов не совпали с фактическими значениями П/У в терминале MT5. Очевидно, что чего-то не хватает, чтобы приведенная выше формула была универсальной…

Прошу подсказать, что не учтено здесь, чтобы формула стала универсальной для расчета П/У ордера для всех инструментов? Ну или наоборот, для расчета объема открываемой позиции по заданному П/У?


Таблица тестируемых инструментов


 

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

Итак, необходимо вычислить (рассчитать) объем открываемой позиции в лотах, если известно следующее:

- торгуемая валютная пара EURUSD;
- плановый убыток в деньгах, например, MONEY=100 USD;
- плановый убыток в пунктах, например, SL=50 п.
- цена тика (минимальное изменение цены инструмента в валюте депозита),
TICK_VALUE =1 USD;

Тогда объем VOLUME открываемой позиции можно расчитать по формуле:
VOLUME = MONEY/ (SL * TICK_VALUE);

Для EURUSD получим:
VOLUME = 100$ / (50 * 1$) = 2 лота;

Пока все хорошо…

 
Eugene Myzrov #:
Итак, необходимо вычислить (рассчитать) объем открываемой позиции в лотах, если известно следующее:

- торгуемая валютная пара EURUSD;

Если формула должна быть действительно универсальной, то не "валютная пара", а "инструмент", который вовсе не обязательно будет именно валютной парой. Он может быть акцией, облигацией, фьючем, спредом,...

Иначе это очередное частное решение.

 
JRandomTrader #:

Если формула должна быть действительно универсальной, то не "валютная пара", а "инструмент", который вовсе не обязательно будет именно валютной парой. Он может быть акцией, облигацией, фьючем, спредом,... Иначе это очередное частное решение.

Согласен, и это тоже я имел ввиду, полагая, что универсальная формула (если конечно она существует) должна подразумевать и различные торговые инструменты…

 
Попробуем обобщить формулу, применив ее к индексам, и конкретно для немецкого индекса GER40. Но тут сразу возникает небольшая проблема – у разных брокеров этот индекс называется по-разному: GER40, DE40, DAX30 и т.д.,  Кроме того, поскольку цены на все индексы котируются в национальной валюте, то для расчета индекса GER40 потребуется знать текущий курс валютной пары EURUSD, и здесь возникает та же самая засада – у разных брокеров этот пара тоже называется по-разному: EURUSD, EURUSD.b, EURUSD.mm и т.д. Но отбросим на потом трудности с определением имени индекса и валютной пары к нему, а пока посмотрим как в этом случает будет выглядеть формула для расчета объема ордера.

- торгуемый инструмент
DE40;
- плановый убыток в деньгах, например, MONEY=100 USD;
- плановый убыток в пунктах, например, SL=1 000 п.
- цена тика (минимальное изменение цены инструмента в валюте депозита), TICK_VALUE =0.01 USD;
- курс
EURUSD, RATE = 1.13560;

Тогда объем VOLUME открываемой позиции можно рассчитать по формуле: VOLUME = MONEY/ (SL * TICK_VALUE *
RATE);

Подставив значения, получаем VOLUME = 100$ / (1000 * 0.01$ * 1.13560) = 8.80 лота;

Немного обобщив таким образом формулу, добавив в нее для индексов курс национальной валюты, получили тоже адекватный результат…
 
JRandomTrader #:

Если формула должна быть действительно универсальной, то не "валютная пара", а "инструмент", который вовсе не обязательно будет именно валютной парой. Он может быть акцией, облигацией, фьючем, спредом,...

Иначе это очередное частное решение.

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

при этом этих формул - полинтернета и в каждой книжке дважды приводятся.

 
Maxim Kuznetsov #:

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

при этом этих формул - полинтернета и в каждой книжке дважды приводятся.

Ну ты же понимаешь, что прошерстить "пол-интернета" это нереальная задача, а если у тебя под рукой есть пару полезных ссылок, сделай одолжение, пришли, пожалуйста. Мне ведь для дела, я не собираюсь Америку открывать....
 

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

ЗЫ. Чтобы не заморачиваться формулами, есть функция OrderCalcProfit.

Документация по MQL5: Торговые функции / OrderCalcProfit
Документация по MQL5: Торговые функции / OrderCalcProfit
  • www.mql5.com
Вычисляет размер прибыли для текущего счета и рыночного окружения на основании переданных параметров. Предназначена для предварительной оценки...
 
Eugene Myzrov #:
Ну ты же понимаешь, что прошерстить "пол-интернета" это нереальная задача, а если у тебя под рукой есть пару полезных ссылок, сделай одолжение, пришли, пожалуйста. Мне ведь для дела, я не собираюсь Америку открывать....

не надо ничего шерстить - любой калькулятор риска или форекс или трейдера с пояснениями. В начале произвольной книжки по тематике также написано

торговый инструмент :=: базовый_актив/котировочная_валюта. В базе считается объём, в котировке его цена.

профит_в_котир_валюте = разница_цен * объём_сделки ; разница_цен в точности, с учётом bid,ask
профит_в_валюте_депо=профит_в_котир * курс_депо_к_котировочной_на_момент_закрытия_сделки ; тоже с учетом bid,ask

формулы естественные и донельзя простые, но в них легко накосячить в округлениях лотов и пунктов;

tickValue и tickSize нужны для учёта округлений (заодно спреда и колебаний валюты депо к usd, хотя не факт); подобное только в MQ и встречал, это для "упрощения". Навскидку - tickValue=курс_котир/депо*tickSize,  tickSize - постоянный масштабный коэфф, учитывающий разные размеры пунктов и лотов, минимально-измеримая величина. Это чтобы можно было хранить предсрасчитанное значение и не обращаться лишний раз к базе котировок. Но для себя любимого лучше обратиться и использовать курсы как они есть, не экономя микросекунды 

в общем случае, в точности, по заранее заданному TP посчитать профит_в_депо нельзя. Только примерно. Потому что будущий курс валюта_депозита/котирочная_инструмента неизвестен

Но как правило депо в долларах и торгуют xxx/usd или usd/xxx - там это упрощается и результат точный.

А когда депо в тугриках и торгуются кроссы - тот ССЗБ

 
Stanislav Korotky #:

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

ЗЫ. Чтобы не заморачиваться формулами, есть функция OrderCalcProfit.

Действительно, функция OrderCalcProfit() снимает головную боль и решает все проблемы с универсальностью, поскольку она как-то учитывает внутри себя рыночное окружение.

Единственное что, эта функция решает только одну задачу - по заданному объему ордера вычисляет размер прибыли/убытка, а мне сейчас надо решить обратную задачу, по Profit/Loss, заданному в валюте и в пунктах - вычислить объем ордера, т.е. в MQL5 не хватает обратной функции типа OrderCalcVolume(). Придется написать такую функцию как надстройку на базе OrderCalcProfit().

Спасибо огромное, Станислав, за наводку!
 

 

К сожалению, небольшая засада, ошибка 4014.

RR_FUNCTION_NOT_ALLOWED

4014

Системная функция не разрешена для вызова


получается так, что системная функция OrderCalcProfit не разрешена для вызова внутри индикатора.
Так что, чтобы получить все плюсы от использования этой функция придется переделать индикатор в советник.
Ну это не беда, все равно планировалось добавить туда торговые функции...

Документация по MQL5: Торговые функции / OrderCalcProfit
Документация по MQL5: Торговые функции / OrderCalcProfit
  • www.mql5.com
Вычисляет размер прибыли для текущего счета и рыночного окружения на основании переданных параметров. Предназначена для предварительной оценки...