Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 897

 
Вроде понятно, наверно так и есть. Еще раз спасибо!
 
Alexey Viktorov:
Можно.

А как?

 
Andy:

А как?

Барабашка уже всё рассказал.

 
Alexey Kozitsyn:

Идентификатор позиции не поменяется. По нему ищите сделки.

Спасибо. После клиринга, функция возвращает не среднюю цену сделок, как задумано, а цену пере открытой позиции. Где ошибка, скажите, пожалуйста.

double Aver_Pr_sell_nett()
  {
   double total_price_multiply_volume_sell   = 0.0;
   double total_volume_sell                  = 0.0;
   double net_price_sell_=0.0;
   string symb=_Symbol;
   int    total       =0;  // 

   for(int i=0; i<PositionsTotal(); i++)
     {
      ulong pt=PositionGetTicket(i);
      long ID=PositionGetInteger(POSITION_IDENTIFIER);
      if(PositionGetString(POSITION_SYMBOL)==symb && HistorySelect(PositionGetInteger(POSITION_TIME),TimeCurrent()+60))
        {
         //--- Получим количество сделок в полученном списке
         total=HistoryDealsTotal();
         //--- Пройдем по всем сделкам в полученном списке
         for(int i=0; i<total; i++)
           {
            ulong dt = HistoryDealGetTicket(i);
            long did = HistoryDealGetInteger(dt, DEAL_POSITION_ID);
            ENUM_DEAL_ENTRY in_out=HistoryDealGetInteger(dt,DEAL_ENTRY);
            if(did==pt && in_out==DEAL_ENTRY_IN)
              {
               if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  total_price_multiply_volume_sell+=PositionGetDouble(POSITION_PRICE_OPEN)*PositionGetDouble(POSITION_VOLUME);
                  total_volume_sell+=PositionGetDouble(POSITION_VOLUME);
                  if(total_price_multiply_volume_sell!=0 && total_volume_sell!=0)
                    {
                     net_price_sell_=total_price_multiply_volume_sell/total_volume_sell;
                     
                    };
                 }
              }
           }
        }
     }
//---
   return(net_price_sell_);
  }
 
Sile Si:

Спасибо. После клиринга, функция возвращает не среднюю цену сделок, как задумано, а цену пере открытой позиции. Где ошибка, скажите, пожалуйста.

Если Вы работаете с позицией - работайте с позицией. Если Вы работаете со сделкой - работайте со сделкой. В сделке указана цена сделки, а не цена позиции.

 
Alexey Kozitsyn:

Если Вы работаете с позицией - работайте с позицией. Если Вы работаете со сделкой - работайте со сделкой. В сделке указана цена сделки, а не цена позиции.

Разве я не выбрала сделки участвовавшие в открытии позиции?

 
Sile Si:

Разве я не выбрала сделки участвовавшие в открытии позиции?

Алгоритм простой: выбираете позицию, по идентификатору позиции - все ее сделки. Выбираете для работы только те сделки, которые формируют объем позиции, т.е. исключаете клиринговые сделки.

Вы же выбрав позицию, получаете ее сделки, а дальше у сделок запрашиваете цену ПОЗИЦИИ! А нужна цена каждой конкретной сделки.

 
Alexey Kozitsyn:

 А нужна цена каждой конкретной сделки.

Извините, не пойму как сделку выбрать вместо позиции, покажите)

 
Sile Si:

Извините, не пойму как сделку выбрать вместо позиции, покажите)

ulong dt = HistoryDealGetTicket(i);
 
Alexey Kozitsyn:

Так, я так и делаю

ulong dt = HistoryDealGetTicket(i);
long did = HistoryDealGetInteger(dt, DEAL_POSITION_ID);

потом id сделки сравниваю с тикетом позиции, и считаю что выбрала сделку,

но возвращает цену позиции. Почему?

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