Questions des débutants MQL5 MT5 MetaTrader 5 - page 897

 
Ça semble clair, je suppose que ça l'est. Merci encore !
 
Alexey Viktorov:
Vous pouvez.

Comment ?

 
Andy:

Comment ?

Le petit bougre m'a déjà tout dit.

 
Alexey Kozitsyn:

L'ID de la position ne changera pas. Utilisez-le pour rechercher des transactions.

Merci. Après la compensation, la fonction ne renvoie pas le prix moyen des transactions comme prévu, mais le prix de la position réouverte. Où se trouve l'erreur, dites-le moi s'il vous plaît.

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:

Merci. Après la compensation, la fonction ne renvoie pas le prix moyen des transactions, comme prévu, mais le prix de la position réouverte. Où se trouve l'erreur, dites-le moi s'il vous plaît.

Si vous travaillez avec une position, travaillez avec la position. Si vous travaillez sur un métier, travaillez sur le métier. L'accord est le prix de l'accord, pas le prix de la position.

 
Alexey Kozitsyn:

Si vous travaillez avec une position, travaillez avec une position. Si vous travaillez sur un métier, travaillez sur le métier. La transaction indique le prix de la transaction, et non le prix de la position.

N'ai-je pas sélectionné les transactions impliquées dans l'ouverture de la position?

 
Sile Si:

N'ai-je pas sélectionné les transactions impliquées dans l'ouverture de la position?

L'algorithme est simple : vous sélectionnez une position, par ID de position, toutes ses transactions. Vous ne sélectionnez pour travailler que les opérations qui constituent le volume de la position, c'est-à-dire que vous excluez les opérations de compensation.

Après avoir choisi une position, vous recevez ses offres, puis vous demandez un prix pour la position ! Et vous avez besoin du prix de chaque transaction spécifique.

 
Alexey Kozitsyn:

Et vous avez besoin du prix de chaque transaction spécifique.

Désolé, je ne comprends pas comment sélectionner une transaction au lieu d'une position, montrez-moi)

 
Sile Si:

Désolé, je ne comprends pas comment sélectionner une transaction au lieu d'une position, montrez-moi)

ulong dt = HistoryDealGetTicket(i);
 
Alexey Kozitsyn:

Ok, c'est ce que je fais.

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

Ensuite, je compare l'identifiant de la transaction avec le ticker de la position, et je pense avoir sélectionné la transaction,

mais il renvoie le prix de la position. Pourquoi ?