Подсчет позиций в MT5-Hedge - страница 4

 
Evgeniy Zhdan:

Чтобы сделать подсчет позиций в MQL5 надо подключать стороннюю библиотеку?) Ужасно удобный язык)

Нет не нужно. вам нужно понять что такое ордер, что такое сделка и что такое позиция. почему это разные вещи и что вообще это такое.
Зачем нужна вся эта штука, какие возможности дает и почему без нее невозможно торговать на любом нормальном рынке кроме форекса. 

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

 
Ребята, Вы хоть смотрите на дату создания темы? 
 
Vladislav Andruschenko:
Ребята, Вы хоть смотрите на дату создания темы? 

упс ) кто-то занялся некрофилией ) 

 
Nikita Chernyshov:

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

По такой же логике просчет не выходит.

Для подсчёта ОТЛОЖЕННЫХ ОРДЕРОВ есть класс COrderInfo.

 
Vladislav Andruschenko:
Ребята, Вы хоть смотрите на дату создания темы? 

А что, это будет полезно тем, кто хочет перейти из MQL4 на MQL5 и тем, кто всё время жалуется.

Вот интересно, после открытия этой темы прошли чуть больше года и за это время мнение автора изменилось или нет :)

 
Я начал изучать мт5 с момента его старта.

Сначала нервничал. потом забил на него года на 2. Сделал пару разработок и бросил. 

Сейчас вообще все равно какой терминал (кросс код не использую, просто одинаково легко писать и там и там).

Были мысли сделать как fxsaber - но это не выход. Потом будет сложно.


Лучше сразу писать отдельно на мт4 и мт5.  

 

О том, что для MT4 можно написать программы через MQL4, узнал очень поздно и написал на MQl4 всего несколько скриптов.

Но как увидел что в MQL5 есть ООП, тем более такое оружие как усреднение позиций, то сразу перешел на MQL5.

Но к сожалению многие и до сих пор не понимают преимущество неттинговой торговли.

 
Vladimir Karputov:

Для подсчёта ОТЛОЖЕННЫХ ОРДЕРОВ есть класс COrderInfo.

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

//+------------------------------------------------------------------+
//| Calculate positions Buy and Sell                                 |
//+------------------------------------------------------------------+
int CalculatePositions(ENUM_ORDER_TYPE type)
  {
  
   int count=0;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_order.SelectByIndex(i)) 
         if(m_order.Symbol()==symbol_info.Name())
           {
            if(m_order.Type()==type)
               count++;
           }
//---
   return(count);
  }
 
Nikita Chernyshov:

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

Нельзя смешивать круглое и зеленое.

Чуть позже дам ссылки на готовые функции подсчёта ПОЗИЦИЙ и ОТЛОЖЕННЫХ ордеров.
 

Пример кода CCI_Reversy.

Функция CalculateAllVolumes подсчитываем ОБЪЁМЫ позиций (volumne_buys, volumne_sells) и отложенных ордеров (volumne_buy_limits, volumne_sell_limits, volumne_buy_stops, volumne_sell_stops)

//+------------------------------------------------------------------+
//| Calculate all volumes                                            |
//+------------------------------------------------------------------+
void CalculateAllVolumes(double &volumne_buys,double &volumne_sells,
                         double &volumne_buy_limits,double &volumne_sell_limits,
                         double &volumne_buy_stops,double &volumne_sell_stops)
  {
   volumne_buys         = 0.0;   volumne_sells        = 0.0;
   volumne_buy_limits   = 0.0;   volumne_sell_limits  = 0.0;
   volumne_buy_stops    = 0.0;   volumne_sell_stops   = 0.0;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name())
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
               volumne_buys+=m_position.Volume();
            else if(m_position.PositionType()==POSITION_TYPE_SELL)
               volumne_sells+=m_position.Volume();
           }

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
         if(m_order.Symbol()==m_symbol.Name())
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT)
               volumne_buy_limits+=m_order.VolumeInitial();
            else if(m_order.OrderType()==ORDER_TYPE_SELL_LIMIT)
               volumne_sell_limits+=m_order.VolumeInitial();
            else if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
               volumne_buy_stops+=m_order.VolumeInitial();
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
               volumne_sell_stops+=m_order.VolumeInitial();
           }
  }


А вот отдельные функции для подсчёта ПОЗИЦИЙ и ОТЛОЖЕННЫХ ордеров (уже не помню из какого кода взято)

считает ТОЛЬКО Buy stop и Sell stop

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void CalculateAllPendingOrders(int &count_buy_stops,int &count_sell_stops)
  {
   count_buy_stops   = 0;
   count_sell_stops  = 0;

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties
         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic)
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
               count_buy_stops++;
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
               count_sell_stops++;
           }
  }


считает ПОЗИЦИИ

//+------------------------------------------------------------------+
//| Calculate all positions                                          |
//+------------------------------------------------------------------+
int CalculateAllPositions()
  {
   int total=0;

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
            total++;
//---
   return(total);
  }
Причина обращения: