Поиск совокупного уровня нулевой прибыли

 

Здравствуйте. Такой вопрос.

Предположим, у меня на EURUSD открыто несколько ордеров с разным Value. Не могу придумать элегантное решение, как искать уровень, где прибыль всех ордеров в совокупности будет нулевой. Ну, типо того, хочу я закрыть все имеющиеся ордера с нулевой прибылью, а где поставить совокупный для всех TP не знаю.

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

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

Спасибо за ответы.

 

Для позиций одного типа (только Buy или только Sell) совокупная цена открытия рассчитывается по формуле:

,

где:

        n - количество позиций,

        OpenPrice - цена открытия одной позиции,

        Volume - объем позиции.

 

Есть готовые индикаторы например Уровень Зеро (см ниже правда для мт4) и ещё одна скромная поделка у меня

https://www.mql5.com/ru/code/8873

i-UrovenZero-v.2.2.7
i-UrovenZero-v.2.2.7
  • www.mql5.com
индикатор всевозможных НУЛЕВЫХ УРОВНЕЙ, общей информации по валютной паре и примитивный калькулятор :)
 
Ihor Herasko:

Для позиций одного типа (только Buy или только Sell) совокупная цена открытия рассчитывается по формуле:

,

где:

        n - количество позиций,

        OpenPrice - цена открытия одной позиции,

        Volume - объем позиции.

Ого, выглядит круто.

Я правильно понял, что по этой формуле можно свести все позиции к одной и считать прибыль, будто бы у нас одна позиция?

И еще не подскажете, откуда этот скриншот? Ссылку на статью или что-то, подробнее посмотреть, как можно использовать?

 
Вообще классно, что можно свести все позиции к одной. Это сильно упрощает математику и код в целом.
 
transcendreamer:

Есть готовые индикаторы например Уровень Зеро (см ниже правда для мт4) и ещё одна скромная поделка у меня

https://www.mql5.com/ru/code/8873

Спасибо за ответ. Посмотрю )

 
yar.forex:
Вообще классно, что можно свести все позиции к одной. Это сильно упрощает математику и код в целом.

На самом деле у Вас всегда одна позиция по одному инструменту, просто на хеджинг-счетах она разбита на части, для удобства.

 
yar.forex:

Здравствуйте. Такой вопрос.

Предположим, у меня на EURUSD открыто несколько ордеров с разным Value. Не могу придумать элегантное решение, как искать уровень, где прибыль всех ордеров в совокупности будет нулевой. Ну, типо того, хочу я закрыть все имеющиеся ордера с нулевой прибылью, а где поставить совокупный для всех TP не знаю.

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

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

Спасибо за ответы.

void OnTick()

  {

//---

   double lowPriceBuy=99999999;

   double highPriceSell=0;

   double LotSell=0,LotBuy=0;

   double NettoLotBuy=0, NettoLotSell=0;

   double MedianPriceBuy=0,MedianPriceSell=0;

   for(int i=OrdersTotal()-1;i>=0;i--)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()==Magik)

        {

         int cmd=OrderType();

         double OrderPrice=OrderOpenPrice();

         double OrderLot=OrderLots();

         switch(cmd)

           {

            case OP_BUY:

              {

               if(OrderPrice<lowPriceBuy)

               {

                  lowPriceBuy=OrderPrice;

                  LotBuy=OrderLot;

               }

               NettoLotBuy=NettoLotBuy+OrderLot;

               MedianPriceBuy=MedianPriceBuy+(OrderPrice*OrderLot);

               break;

              }

            case OP_SELL:

              {

               if(OrderPrice>highPriceSell)

               {

                  highPriceSell=OrderPrice;

                  LotSell=OrderLot;

               }

               NettoLotSell=NettoLotSell+OrderLot;

               MedianPriceSell=MedianPriceSell+(OrderPrice*OrderLot);

               break;

              }

            default: break; 

           }

        }

     }

   if(Nettolotb!=0)PriceBuy= MedianPriceBuy /NettoLotSell;

   if(Nettolots!=0)PriceSell= MedianPriceSell /NettoLotBuy;


}

 
yar.forex:

Ого, выглядит круто.

Я правильно понял, что по этой формуле можно свести все позиции к одной и считать прибыль, будто бы у нас одна позиция?

Ну да, Вы же этот вопрос задавали.

И еще не подскажете, откуда этот скриншот?

Из Word'a ))

Ссылку на статью или что-то, подробнее посмотреть, как можно использовать?

Использовать просто:

  1. Пройтись циклом по всем ордерам.
  2. Подсчитать суммы произведений цен открытия каждой позиции Buy и Sell в отдельности.
  3. Подсчитать суммарный объем позиций Buy и Sell в отдельности.
  4. Разделить сумму из п. 2 на сумму из п. 3
 
Alexandr Bryzgalov:

void OnTick()

  {

//---

   double lowPriceBuy=99999999;

   double highPriceSell=0;

   double LotSell=0,LotBuy=0;

   double NettoLotBuy=0, NettoLotSell=0;

   double MedianPriceBuy=0,MedianPriceSell=0;

   for(int i=OrdersTotal()-1;i>=0;i--)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()==Magik)

        {

         int cmd=OrderType();

         double OrderPrice=OrderOpenPrice();

         double OrderLot=OrderLots();

         switch(cmd)

           {

            case OP_BUY:

              {

               if(OrderPrice<lowPriceBuy)

               {

                  lowPriceBuy=OrderPrice;

                  LotBuy=OrderLot;

               }

               NettoLotBuy=NettoLotBuy+OrderLot;

               MedianPriceBuy=MedianPriceBuy+(OrderPrice*OrderLot);

               break;

              }

            case OP_SELL:

              {

               if(OrderPrice>highPriceSell)

               {

                  highPriceSell=OrderPrice;

                  LotSell=OrderLot;

               }

               NettoLotSell=NettoLotSell+OrderLot;

               MedianPriceSell=MedianPriceSell+(OrderPrice*OrderLot);

               break;

              }

            default: break; 

           }

        }

     }

   if(Nettolotb!=0)PriceBuy= MedianPriceBuy /NettoLotSell;

   if(Nettolots!=0)PriceSell= MedianPriceSell /NettoLotBuy;


}

Круто 😮

Спасибо ) Буду применять )

 
Ihor Herasko:

Ну да, Вы же этот вопрос задавали.

Из Word'a ))

Использовать просто:

  1. Пройтись циклом по всем ордерам.
  2. Подсчитать суммы произведений цен открытия каждой позиции Buy и Sell в отдельности.
  3. Подсчитать суммарный объем позиций Buy и Sell в отдельности.
  4. Разделить сумму из п. 2 на сумму из п. 3

Спасибо 😊