Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 897

 
Parece claro, suponho que sim. Mais uma vez obrigado!
 
Alexey Viktorov:
Pode.

Como?

 
Andy:

Como?

O pequeno sacaninha já me contou tudo.

 
Alexey Kozitsyn:

O identificador de posição não será alterado. Utilize-a para pesquisar transacções.

Obrigado. Após a compensação, a função não devolve o preço médio dos negócios como pretendido, mas o preço da posição reaberta. Onde está o erro, por favor digam-me.

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:

Obrigado. Após a compensação, a função não devolve o preço médio dos negócios, como pretendido, mas o preço da posição reaberta. Onde está o erro, por favor digam-me.

Se estiver a trabalhar com uma posição, trabalhe com a posição. Se estiver a trabalhar num ofício, trabalhe no ofício. O acordo é o preço do negócio, não o preço da posição.

 
Alexey Kozitsyn:

Se estiver a trabalhar com uma posição, trabalhe com uma posição. Se estiver a trabalhar num ofício, trabalhe no ofício. O acordo mostra o preço da transacção, não o preço da posição.

Não seleccionei os ofícios envolvidos na abertura da posição?

 
Sile Si:

Não seleccionei os ofícios envolvidos na abertura da posição?

O algoritmo é simples: selecciona-se uma posição, por ID de posição, todas as suas transacções. Selecciona para o trabalho apenas os acordos que formam o volume da posição, ou seja, exclui acordos de compensação.

Depois de escolher uma posição, recebe as suas ofertas, e depois solicita um preço para a posição! E precisa do preço de cada transacção específica.

 
Alexey Kozitsyn:

E precisa do preço de cada transacção específica.

Desculpe, não entendo como seleccionar uma profissão em vez de uma posição, mostre-me)

 
Sile Si:

Desculpe, não entendo como seleccionar uma profissão em vez de uma posição, mostre-me)

ulong dt = HistoryDealGetTicket(i);
 
Alexey Kozitsyn:

Ok, é isso que eu faço.

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

Depois comparo o id da transacção com o ticker da posição, e penso ter seleccionado a transacção,

mas devolve o preço da posição. Porquê?

Razão: