нужна линия по средней цене ордеров.

 

ищу несколько часов - никак не могу найти. 

нужна обычная линия по средней цене открытых позиций (с учётом кол-ва лотов).

нашёл для мт4. нужно для мт5.


если поможет - вот код для мт4.

//+------------------------------------------------------------------+
//|                                         Middle_Order_Price_5.mq4 |
//|                                                         StSpirit |
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                           Middle_Order_Price.mq4 |
//|                                                         StSpirit |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "StSpirit"
#property link      ""

#property indicator_chart_window

extern color LineColor = Magenta;              //цвет линии
extern int LineWidth = 2;                      //толщина линии

extern bool Text_With_Line = true;             //включить или выключить подпись к линии
extern string Text="Middle Order Price";       //текст подписи к линии
extern color TextColor = Violet;               //цвет шрифта подписи к линии
extern int FontSize = 8;                       //размер шрифта подписи к линии

string LineName = "Middle_Order_Price";        //название линии
string TextName = "Text_MOP";                  //название метки с текстом


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
  
  void OrderMiddleLine(string Name, double Value)
   {
   string objectName = Name;
   if(ObjectFind("Middle_Order_Price")!=0)// такого объекта нет
      {
   ObjectCreate(objectName, OBJ_HLINE, 0, 0, Value);
   ObjectSet(objectName, OBJPROP_COLOR, LineColor);
   ObjectSet(objectName, OBJPROP_WIDTH, LineWidth);
   ObjectSet(objectName, OBJPROP_BACK, true);
      }
   else  // объект есть, передвигаем его
      {
      ObjectMove(objectName, 0, Time[0],Value);
      }
   return(0);
  }

    void LineText(string Name, double MOP)
   {
   string objectName = Name;
   if(ObjectFind("Text_MOP")!=0)// такого объекта нет
      {
      ObjectCreate(objectName, OBJ_TEXT, 0, Time[5],MOP);
      ObjectSetText(objectName, Text, FontSize, "Arial", TextColor); //параметры вывода объекта
      ObjectSet(objectName, OBJPROP_BACK, true);
      }
   else  // объект есть, передвигаем его
      {
      ObjectMove(objectName, 0, Time[5],MOP);
      }
   return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete(LineName);
   ObjectDelete(TextName);
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  double a=0, b=0, price_ask=0, price_bid=0;
//----

   if (OrdersTotal()!=0)
      {
      for (int i = 0; i < OrdersTotal(); i++)
         {
         if (OrderSelect(i, SELECT_BY_POS)==true)
            {
            if (OrderSymbol() == Symbol())
               {
               if (OrderType() == OP_BUY)
                  {
                  price_ask = price_ask + OrderOpenPrice() * OrderLots();
                  a = a + OrderLots();
                  }
            
               if (OrderType() == OP_SELL)
                  {
                  price_bid = price_bid + OrderOpenPrice() * OrderLots();
                  b = b + OrderLots();
                  }
               }
            }
         }
      }
      if (a==0 && b==0)
         {
         ObjectDelete(LineName);
         ObjectDelete(TextName);
         Comment("AVERAGE NONE");       
         }
      if (a != 0)
         {
         Comment("AVERAGE"," BUY = ",a," : ",DoubleToStr(price_ask/a,6));
         OrderMiddleLine(LineName, price_ask/a);
         if (Text_With_Line!=false) LineText(TextName, price_ask/a);
         a=0;
         price_ask=0;
         }
      if (b != 0)
         {
         Comment("AVERAGE"," SELL = ",b," : ", DoubleToStr(price_bid/b,6));
         OrderMiddleLine(LineName, price_bid/b);
         if (Text_With_Line!=false) LineText(TextName, price_bid/b);
         b=0;
         price_bid=0;
         
         
/*         if (OrdersTotal()==0)
            {
            ObjectDelete(LineName);
            ObjectDelete(TextName);                   
            }*/

  }

//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Полную функцию дать не могу, только несколько основных строк

В цикле суммируем

              summPrice += PositionGetDouble(POSITION_PRICE_OPEN)*PositionGetDouble(POSITION_VOLUME);
              summVolume += PositionGetDouble(POSITION_VOLUME);

Выйдя из цикла

          averagePrice = NormalizeDouble(summPrice/summVolume, _Digits);

получили среднюю цену.

 
//+------------------------------------------------------------------+
//|                                                   Zero_Level.mq5 |
//|                                         Copyright © 2007, Xupypr |
//+------------------------------------------------------------------+
// Функция вычисляющая уровни безубытка, на покупку, на продажу с учетом накопленных свопов.
double Zero_Level(string symb="", int op=-1, int mn=-1)
  {
   if(symb=="0")
      symb=_Symbol;
   double TickValue=SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE);
   double BuyLots=0;
   double SellLots=0;
   double BuyProfit=0;
   double SellProfit=0;
   double BuyLevel=0;
   double SellLevel=0;
   int Total=PositionsTotal();
   for(int i=Total-1; i>=0; i--)
     {
      if(po.SelectByIndex(i))
        {
         if(po.Symbol()!=symb)
            continue;
         if(po.Magic()!=mn)
            continue;
         if(po.PositionType()==OP_BUY && (op<0 || po.PositionType()==op))
           {
            BuyLots+=NormalizeDouble((po.Volume()),2);
            BuyProfit+=NormalizeDouble((po.Profit()+(po.Commission()*2)+po.Swap()),2);
           }
         if(po.PositionType()==OP_SELL && (op<0 || po.PositionType()==op))
           {
            SellLots+=NormalizeDouble((po.Volume()),2);
            SellProfit+=NormalizeDouble((po.Profit()+(po.Commission()*2)+po.Swap()),2);
            //   Print(SellLots);
            //   Print(SellProfit);
            //   Print(TickValue);
           }
        }
     }
   double Price=0;

   if(BuyLots>0)
      BuyLevel=NormalizeDouble(SymbolInfoDouble(symb,SYMBOL_BID)-(BuyProfit/(TickValue*BuyLots)*SymbolInfoDouble(symb,SYMBOL_POINT)),(int)SymbolInfoInteger(symb,SYMBOL_DIGITS));
   else
      BuyLevel=0;
   if(SellLots>0)
      SellLevel=NormalizeDouble(SymbolInfoDouble(symb,SYMBOL_ASK)+(SellProfit/(TickValue*SellLots)*SymbolInfoDouble(symb,SYMBOL_POINT)),(int)SymbolInfoInteger(symb,SYMBOL_DIGITS));
   else
      SellLevel=0;
   if((BuyLots-SellLots)>0)
      Price=NormalizeDouble(SymbolInfoDouble(symb,SYMBOL_BID)-((BuyProfit+SellProfit)/(TickValue*(BuyLots-SellLots))*SymbolInfoDouble(symb,SYMBOL_POINT)),(int)SymbolInfoInteger(symb,SYMBOL_DIGITS));
   if((SellLots-BuyLots)>0)
      Price=NormalizeDouble(SymbolInfoDouble(symb,SYMBOL_ASK)+((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*SymbolInfoDouble(symb,SYMBOL_POINT)),(int)SymbolInfoInteger(symb,SYMBOL_DIGITS));

//   Print(SellLevel);
   return(Price);
  }
//+----------------------------------------------------------------------------+
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - sy.Bid())                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1)
  {
   if(nm=="")
      nm=DoubleToString(iTime(sy.Name(),PERIOD_CURRENT,0), 0);
   if(p1<=0)
      p1=sy.Bid();
   if(ObjectFind(0,nm)<0)
      ObjectCreate(0,nm, OBJ_HLINE, 0, 0,0);
   ObjectSetDouble(0,nm, OBJPROP_PRICE,0, p1);
   ObjectSetInteger(0,nm, OBJPROP_COLOR, cl);
   ObjectSetInteger(0,nm, OBJPROP_STYLE, st);
   ObjectSetInteger(0,nm, OBJPROP_WIDTH, wd);
  }
//END
//+------------------------------------------------------------------+

функции для MT5. Дальше встраивайте их в советник, скрипт или индикатор.

 
Volodymyr Zubov #:

функции для MT5. Дальше встраивайте их в советник, скрипт или индикатор.

Что-то мне подсказывает, что это очень лишнее, а тем более в этих местах

--

 
Vitaly Muzichenko #:

Что-то мне подсказывает, что это очень лишнее, а тем более в этих местах

--

Может и лишнее, давно переделывал с MQ4. На кроссах цену стабильно не показывет, гуляет немного цена, незнал как её стабилизировать. Нормализацию в этих местах можно и не делать.

 
Volodymyr Zubov #:

Может и лишнее, давно переделывал с MQ4. На кроссах цену стабильно не показывет, гуляет немного цена, незнал как её стабилизировать. Нормализацию в этих местах можно и не делать.

она и должна слегка гулять - цена тика меняется

и ещё полезно убрать привязку с Bid/Ask, (БУ = средняя цена - сколько пунктов сожрали своп и комиссия)

для комиссии умножение на два должно быть опционально. Некоторые берут сразу всё на открытии

 

спасибо всем!

странно, что за много лет никто не написал такой индикатор.