Уровень безубытка цены для множества ордеров

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Valery V. Chesnokov
1326
Valery V. Chesnokov  

Прошу уважаемых форумчан подсказать, писал ли кто-нибудь MQL код, рассчитывающий для произвольного множества ордеров одного типа (только BUY, или только SELL), с разной ценой открытия и разными лотами, уровень безубыточной цены, т.е. такой уровень, закрытие на котором ордеров заданного множества приведёт к нулевому изменению баланса?

Опираться нужно, как я понимаю, на OrderProfit, OrderCommission, OrderSwap(), но они дадут по формуле: NormalizeDouble( OrderProfit() + OrderCommission() + OrderSwap(), 2);
общий текущий профит со знаком для каждого ордера, для текущей цены, а как получить уровень безубытка для всего множества?

Shinigami
141
Shinigami  
Опираюсь на OrderOpenPrice и Ask/Bid - работает уже с пол года......
Valery V. Chesnokov
1326
Valery V. Chesnokov  
Shinigami:
Опираюсь на OrderOpenPrice и Ask/Bid - работает уже с пол года......


Размер лотов тоже играет роль. Напишите формулу, пожалуйста.

Valery V. Chesnokov
1326
Valery V. Chesnokov  

Всё, нашёл статью 'Азбука торговли валютами', мозги ночью не варят, думаю, завтра всё пойму из неё.

Xupypr1
572
Xupypr1  
chv:


Размер лотов тоже играет роль. Напишите формулу, пожалуйста.

Посмотрите этот скрипт - расчитывает уровень без убытка, а также уровни покупки и продажи для множества ордеров по одному инструменту.

ЗЫ: Исправил ошибку - вот новый скрипт.

Файлы:
Valery V. Chesnokov
1326
Valery V. Chesnokov  
Xupypr:

Посмотрите этот скрипт - расчитывает уровень без убытка, а также уровни покупки и продажи для множества ордеров по одному инструменту.

ЗЫ: Исправил ошибку - вот новый скрипт.


Посмотрел Ваш скрипт. Вы используете встроенные MQL функции по формуле: OrderProfit()+OrderCommission()+OrderSwap(). Но они всё считают исходя из текущей цены, а мне нужно для множества ордеров (одного типа из {BUY, SELL}): A1, A2, ..., An рассчитать уровень цены, на котором их можно закрыть все с нулевым изменением баланса. Т.е. цену я буду подбирать, например, итерационно. Но тогда все встроенные функции OrderProfit и т.д. мне бесполезны, они опираются на текущую цену и рыночную ситуацию, а не на любую предлагаемую. Т.е. аргумента CurrentPrice у них нет.

Candid
1630
Candid  
chv:

Прошу уважаемых форумчан подсказать, писал ли кто-нибудь MQL код, рассчитывающий для произвольного множества ордеров одного типа (только BUY, или только SELL), с разной ценой открытия и разными лотами, уровень безубыточной цены, т.е. такой уровень, закрытие на котором ордеров заданного множества приведёт к нулевому изменению баланса?

Опираться нужно, как я понимаю, на OrderProfit, OrderCommission, OrderSwap(), но они дадут по формуле: NormalizeDouble( OrderProfit() + OrderCommission() + OrderSwap(), 2);
общий текущий профит со знаком для каждого ордера, для текущей цены, а как получить уровень безубытка для всего множества?


Я такого не писал, но порассуждать могу :)

По идее во-первых нужно рассчитать текущий баланс нужной группы ордеров. Это вроде понятно, для этого и нужны OrderProfit() + OrderCommission() + OrderSwap()

Во-вторых нужно рассчитать изменение баланса при изменении цены на 1 пункт. Это тоже вроде понятно, суммарная позиция*цена пункта для одного лота

После этого делением первого на второе можно получить количество пунктов, необходимых для обнуления баланса

Наконец последнее, остаётся решить, нужно их прибавить к текущей цене или от неё отнять.

При желании всё можно здорово усложнить, попытавшись спрогнозировать ещё и время достижения нужной цены (чтобы свопы учесть) :)

Вот такой ход мыслей.

Andrei
849
Andrei  

Как-то так,

BuLevelBuy =NormalizeDouble((OpenLotSumBuy-PcommisBuy)/LotsSumBuy,Digits);
BuLevelSell =NormalizeDouble((OpenLotSumSel+PcommisSel)/LotsSumSel,Digits);
где, суммы по по всем ордерам типа:
OpenLotSum - Lots*OpenPrice,
Pcommis - Commis*Point/стоим.пункта
LotsSum - Lots

Andrey Khatimlianskii
57655
Andrey Khatimlianskii  
chv:

Посмотрел Ваш скрипт. Вы используете встроенные MQL функции по формуле: OrderProfit()+OrderCommission()+OrderSwap(). Но они всё считают исходя из текущей цены, а мне нужно для множества ордеров (одного типа из {BUY, SELL}): A1, A2, ..., An рассчитать уровень цены, на котором их можно закрыть все с нулевым изменением баланса. Т.е. цену я буду подбирать, например, итерационно. Но тогда все встроенные функции OrderProfit и т.д. мне бесполезны, они опираются на текущую цену и рыночную ситуацию, а не на любую предлагаемую. Т.е. аргумента CurrentPrice у них нет.

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

Свопы расчитать тоже можно, но с одной оговоркой - в mql4 нет функции, возвращающей день начисления тройного свопа.
Xupypr1
572
Xupypr1  
komposter:
Свопы расчитать тоже можно, но с одной оговоркой - в mql4 нет функции, возвращающей день начисления тройного свопа.

Разве ночь со среды на четверг не является временем тройных свопов или бывают другие случаи?

chv, я не понял, чем вам не подходит мой скрипт :) Расчитывает три уровня - уровень где сумма профита всех ордеров на покупку будет равна нулю, такой же уровень на продажу и уровень "нуля" для локированных позиций не равных по объему.

Понятно, что для кроссов стоимость пункта меняется, но мы не можем предугадать какой она будет через некоторое время. Также и для свопов - они тоже каждый день разные. Для EURUSD, например, всё четко - уровеь не изменяется в течении суток, если не было открыто новых ордеров, разумеется.

Xupypr1
572
Xupypr1  

Понял о чём речь!

Вижу такой выход:

1 - для валютных пар с прямой котировкой всё ясно, т.к. пункт постоянный уровень расчитывается точно.

2 - для валютных пар с обратной котировкой (USDJPY, USDCHF) есть смысл делать перерасчёт уровня, т.е. использовать для расчёта пункта котировку, которую предлагает мой скрипт (приближенный уровень безубытка). Формула стоимости пункта - [pip] = [lot size] × [tick size] / [current quote]

3 - для кроссов всё намного сложнее - для перерасчёта уровня потребуется ещё котировка базовой (первой) валюты к доллару США, а она не известно какой будет к тому времени. Ктстати, формула - [pip] = [lot size] × [tick size] × [base quote] / [current quote]

Вот как-то так.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий