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

 

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

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

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


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

 

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

 
chv:


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

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

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

Файлы:
 
Xupypr:

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

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


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

 
chv:

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

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


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

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

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

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

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

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

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

 

Как-то так,

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

 
chv:

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

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

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

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

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

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

 

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

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

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

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

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

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

Причина обращения: