Как получить среднюю цену открытия при открытии нескольких позиций

 

Вопрос в теме, возможно тупой, но все же непонятный. Это необходимо чтобы получить размер профита В ПУНКТАХ по нескольким позициям одного символа.

Детальней на примере из жизни - идут сначала покупка, потом доливки к ней по 1 лоту на EURUSD, все ордера BUY :

  • открываем позицию по EURUSD размером в 1 лот на BUY на отметке 1.25111, таким образом в любой момент времени наш профит равен BID - 1.25111
  • цена пошла вниз, но мы снова открываем позицию размером в 1 лот на BUY, т.е. доливаемся на уровне 1.25077

- и вот тут я немного удивился потому что новая цена открытия теперь равна не 1.25111 и не 1.25077, а их среднее арифметическое. т.е. (1.25111 + 1.25077) / 2 = 1.25094, а профит равен BID - 1.25094

  • ок, пусть будет среднее, идем дальше, цена снова идет вниз и доливаемся еще 1 лотом на уровне 1.24664

- и тут я снова удивился, потому что, если для расчета новой цены открытия надо брать среднее от всех ордеров, то оно должно быть равно (1.25111 + 1.25077 + 1.24664) / 3 = 1.24951, но стандартная функция МТ возвращает слегка другое значение

PositionSelect("EURUSD");
double start = PositionGetDouble(POSITION_PRICE_OPEN); // returns 1.24954 != 1.24951

Вопрос : кто сожрал 3 пипса? какая формула расчета для цены открытия после доливок к текущей позиции? что я не учел?

 
 
может спред
может цену открытия надо брать не бид а аск
 

" ...кто сожрал 3 пипса? какая формула расчета для цены открытия после доливок к текущей позиции? что я не учел? ..."

для BUY (закрытие) нужно брать Bid (покупка идёт по Ask) 

a спред у вас какой?

а, вы учли свап, коммисионные по отдельно каждому ордеру (???)

 price_buy +=(Bid-BuyOrderOpenPrice)*xxx+(OrderCommission()+OrderSwap())*Point;

 
artemiusgreat:

Вопрос в теме, возможно тупой, но все же непонятный. Это необходимо чтобы получить размер профита В ПУНКТАХ по нескольким позициям одного символа.

Детальней на примере из жизни - идут сначала покупка, потом доливки к ней по 1 лоту на EURUSD, все ордера BUY :

  • открываем позицию по EURUSD размером в 1 лот на BUY на отметке 1.25111, таким образом в любой момент времени наш профит равен BID - 1.25111
  • цена пошла вниз, но мы снова открываем позицию размером в 1 лот на BUY, т.е. доливаемся на уровне 1.25077

- и вот тут я немного удивился потому что новая цена открытия теперь равна не 1.25111 и не 1.25077, а их среднее арифметическое. т.е. (1.25111 + 1.25077) / 2 = 1.25094, а профит равен BID - 1.25094

  • ок, пусть будет среднее, идем дальше, цена снова идет вниз и доливаемся еще 1 лотом на уровне 1.24664

- и тут я снова удивился, потому что, если для расчета новой цены открытия надо брать среднее от всех ордеров, то оно должно быть равно (1.25111 + 1.25077 + 1.24664) / 3 = 1.24951, но стандартная функция МТ возвращает слегка другое значение

Вопрос : кто сожрал 3 пипса? какая формула расчета для цены открытия после доливок к текущей позиции? что я не учел?

после первой доливки у вас 2 лота ,теперь для усреднения требуется не 1 лот как вы сделали ,а 2 лота и так далее +4,+8,+16.......
 
alek7710:
после первой доливки у вас 2 лота ,теперь для усреднения требуется не 1 лот как вы сделали ,а 2 лота и так далее +4,+8,+16.......
Расчеты автора топика и мои расчеты совпали. Конечно исходя из заданных данных
 
Vinin:
Расчеты автора топика и мои расчеты совпали. Конечно исходя из заданных данных

Да, переписал скрипт немного по-другому и все сошлось, скорей всего для последней позиции вместо ASK по ошибке брал BID

mobility-energy:

" ...кто сожрал 3 пипса? какая формула расчета для цены открытия после доливок к текущей позиции? что я не учел? ..."

 price_buy +=(Bid-BuyOrderOpenPrice)*xxx+(OrderCommission()+OrderSwap())*Point;

Что такое "ххх", лот?

Эта формула какая-то непонятная, причем, похоже, для денег, а не для пунктов. Вот какие формулы получаются на данный момент.

Для пунктов берется средняя цена открытия всех позиций и ее разница от текущей цены :

buyProfit = CurrentBid - (PriceAskOpen[0] + PriceAskOpen[1] + ... + PriceAskOpen[n - 1]) / n

Для денег берется сумма пунктов пройденных ценой для каждой позиции, переведенных в валюту депозита :

buyProfit =
    (BidForPos[0] - PriceAskOpen[0]) * TickValue * Lots[0] / TickSize + Swap[0] + Comission + ... +
    (BidForPos[n - 1] - PriceAskOpen[n - 1]) * TickValue * Lots[n - 1] / TickSize + Swap[n - 1] + Comission
 

В формуле должны участвовать лоты.

Средняя цена открытия:

double average_op = (op1 * lot1 + op2 * lot2 + opN * lotN) / (lot1 + lot2 + lotN);

Профит в пунктах:

double profit = Bid - average_op;

 

А в первом сообщении действительно где-то ошибка. Возможно, было проскальзывание, и последняя сделка исполнилась по 1.24674.

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