Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 897

 
Sembra chiaro, credo che lo sia. Grazie ancora!
 
Alexey Viktorov:
È possibile.

Come?

 
Andy:

Come?

Lo stronzetto mi ha già detto tutto.

 
Alexey Kozitsyn:

L'identificatore di posizione non cambia. Usalo per cercare le transazioni.

Grazie. Dopo la compensazione, la funzione non restituisce il prezzo medio degli scambi come previsto, ma il prezzo della posizione riaperta. Dov'è l'errore, per favore ditemelo.

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:

Grazie. Dopo la compensazione, la funzione non restituisce il prezzo medio degli scambi, come previsto, ma il prezzo della posizione riaperta. Dov'è l'errore, per favore ditemelo.

Se lavorate con una posizione, lavorate con la posizione. Se state lavorando su un commercio, lavorate sul commercio. L'affare è il prezzo dell'affare, non il prezzo della posizione.

 
Alexey Kozitsyn:

Se lavorate con una posizione, lavorate con una posizione. Se state lavorando su un commercio, lavorate sul commercio. L'accordo mostra il prezzo del trade, non il prezzo della posizione.

Non ho selezionato i trade coinvolti nell'apertura della posizione?

 
Sile Si:

Non ho selezionato i trade coinvolti nell'apertura della posizione?

L'algoritmo è semplice: si seleziona una posizione, per ID posizione, tutti i suoi scambi. Selezionate per il lavoro solo le operazioni che formano il volume della posizione, cioè escludete le operazioni di compensazione.

Dopo aver scelto una posizione, si ricevono le sue offerte, e poi si richiede un prezzo per la posizione! E avete bisogno del prezzo di ogni specifica transazione.

 
Alexey Kozitsyn:

E avete bisogno del prezzo di ogni specifica transazione.

Scusa, non capisco come selezionare un trade invece di una posizione, mostrami)

 
Sile Si:

Scusa, non capisco come selezionare un trade invece di una posizione, mostrami)

ulong dt = HistoryDealGetTicket(i);
 
Alexey Kozitsyn:

Ok, questo è quello che faccio.

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

Poi confronto l'id della transazione con il ticker della posizione, e penso di aver selezionato la transazione,

ma restituisce il prezzo della posizione. Perché?