Dividere le posizioni aperte in gruppi - pagina 6

 
Aggiunta una nuova funzione, ora il consigliere può cambiare la casta di un gruppo di posizioni in un'altra impostata.
//+------------------------------------------------------------------+
//Перевод отобранных по тикетам позиций в указанную касту
//array_base[][observations] основная база, в которой нужно провести изменения
//array_change[]             массив с тикетами позиций, касту которых нужно изменить
//array_change[]             номер касты, к которой нужно приписать позиции
//+------------------------------------------------------------------+
int Transfer_Positions_Specified_Caste_by_Tickets(int &array_base[][observations], 
                                                  int &array_change[], 
                                                  int new_caste){
int size_change = ArraySize (array_change);
int size_base   = ArrayRange(array_base,0);

   for(int i=0; i<size_change; i++){
      int ticket_change = array_change[i];
      for(int a=0; a<size_base; a++){
         if(array_base[a][0] == ticket_change ||
            array_base[a][1] == ticket_change){
            array_base[a][2]  = new_caste;
            break;}}}    
   ArrayFree(array_change);
       
return(size_change);
}
//+------------------------------------------------------------------+
 

Buona sera. Mi piacerebbe sentire i professionisti.

Si prega di consigliare quali funzioni sono migliori da usare quando si deve fare il seguente compito:

Ho bisogno di aprire diverse posizioni (dal mercato, senza ordini) e mettere immediatamente i loro biglietti in un array.

La difficoltà è ottenere questi ticket, non ho trovato nessuna funzione che apra una posizione E la restituisca con un ticket (come in MT4).

Basta aprire transazioni nel ciclo, parametri, ecc - nessuna domanda, ma per ottenere un biglietto basta aprire una posizione, NON AVERE!

Si prega di consigliare plz.

In qualche modo va così:

Ticket = Function.Open Position(Buy, 0.01, ......);

 
Sergey Voytsekhovsky:

aprire una posizione E restituire un ticket (come in MT4).

.................... ma per ottenere un biglietto di posizione appena aperto, ho bisogno!!!

Si prega di avvisare.

Quando mi viene in mente, posso solo richiedere un ticket dell'ultima posizione aperta nella storia. Ma in qualche modo mi sembra goffo, troppo ambiguo, non c'è una connessione diretta tra l'ordine in codice e la posizione aperta. Sicuramente ci sono metodi più corretti, chi ha idee o forse abbastanza esperienza, condivida per favore?

 
Sergey Voytsekhovsky:

L'unica cosa che mi viene in mente è richiedere un ticket per l'ultima posizione aperta nella storia. Ma in qualche modo mi sembra un po' disordinato, troppo ambiguo, non c'è una connessione diretta tra l'ordine nel codice e la posizione aperta. Sicuramente ci sono metodi più corretti, chi ha idee o forse ha abbastanza esperienza, condivida per favore?

Ho descritto tutto questo in articoli. Per mql5 e mql4 tutto è fatto lì. Si può prendere un'idea e farne una funzione.

Tuttavia. Avete una transazione in cui viene scritto l'identificatore di posizione. Leggete gli accordi e le loro proprietà nella documentazione.

 
Sergey Voytsekhovsky:

Buona sera. Mi piacerebbe sentire i professionisti.

Si prega di consigliare quali funzioni sono migliori da usare quando si deve fare il seguente compito:

Ho bisogno di aprire diverse posizioni (dal mercato, senza ordini) e mettere immediatamente i loro biglietti in un array.

La difficoltà è ottenere questi ticket, non ho trovato nessuna funzione che apra una posizione E la restituisca con un ticket (come in MT4).

Basta aprire transazioni nel ciclo, parametri, ecc - nessuna domanda, ma per ottenere un biglietto basta aprire una posizione, NON AVERE!

Si prega di consigliare plz.

In qualche modo va così:

Ticket = Function.Open Position(Buy, 0.01, ......);

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
  if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
   {
    ulong ticket = trans.position; // тикет позиции
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
      {
      }
    if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT)// закрылась позиция
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
      if(HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_TP)
     }
   }
 }
 
Artyom Trishkin:

Ho descritto tutto negli articoli. Per mql5 e mql4 tutto è fatto lì. Si può prendere l'idea e fare la funzione.

Tuttavia. Avete un accordo in cui è scritto un identificatore di posizione. Leggete gli accordi e le loro proprietà nella documentazione.

Grazie mille, vado a indagare.

 
Alexey Viktorov:

Grande, questo è qualcosa da fare ora :-). Lo scoprirò e mi assicurerò di postare il risultato, forse aiuterà anche qualcun altro.

 
Sergey Voytsekhovsky:

Grande, questo è qualcosa da fare ora :-). Lo scoprirò e mi assicurerò di postare il risultato, forse aiuterà anche qualcun altro.

Ci sono pochissime persone che non lo sanno. E quelli che non lo sanno dovrebbero essere in grado di farlo dopo aver letto questo thread. Se non possono, non sono affari del re... per curiosare.

 
Artyom Trishkin:

Ho descritto tutto negli articoli. Per mql5 e mql4 tutto è fatto lì. Si può prendere l'idea e fare una funzione.

Grazie, in quale dei suoi articoli esattamente? Ne hai così tanti.....

 

Buon pomeriggio.

Di nuovo, mi appello ai guru di questo forum.

Ho scritto una piccola funzione. Funziona, ma molto lentamente. Capisco che l'algoritmo è estremamente inefficiente. L'ho letto qui:

https://www.mql5.com/ru/articles/567

che c'èuna funzione per aggiungere alla fine di un array.

Non capisco come usarlo, puoi aiutarmi a rimettere in moto la mia immaginazione, codificherò a colori l'area di interesse.

//+------------------------------------------------------------------+
//| Заполняем структуру своих позиций
//+------------------------------------------------------------------+
int Fill_Position_Structure(int kodclana)
{
   int n = 0;
   if(!Refresh_Rates())return(false);
   int SizeTotalPosition = PositionsTotal();
   int SizeArrayPosition = ArraySize(ArrayPosition);
//---Запись новых позиций в структуру        
   for(int i=0; i < SizeTotalPosition; i++)
      {//---Из списка открытых позиций выбираю очередную, предполагаю что она НОВАЯ, определяю ее ВремяЖизни, 
       //----проверяю есть ли она в массиве позиций, если есть, значит СТАРАЯ, обновляю ВремяЖизни, считаю, выхожу. 
         bool  new_pos  = true;
         ulong ticket   = PositionGetTicket(i);
         int   lifetime = DatetimeToInteger(TimeCurrent() - m_position.Time());
         SizeArrayPosition = ArraySize(ArrayPosition);
         for(int y = 0; y < SizeArrayPosition; y++)
            {
               if(ArrayPosition[y].ticket_pos == ticket)
                  {
                     ArrayPosition[y].lifetime_candle = lifetime/60*_Period;
                     ArrayPosition[y].lifetime_sek    = lifetime;
                     ArrayPosition[y].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
                     new_pos = false;
                     n++;
                     break;
                  }
            }
         if(new_pos)
            {//---Если НОВАЯ, забиваю позицию в массив со всеми параметрами
               ArrayResize(ArrayPosition, SizeArrayPosition+1, 1);
               ArrayPosition[SizeArrayPosition].lifetime_candle = lifetime/60*_Period;
               ArrayPosition[SizeArrayPosition].lifetime_sek    = lifetime;
               ArrayPosition[SizeArrayPosition].ticket_pos      = ticket;
               ArrayPosition[SizeArrayPosition].kod_clana       = kodclana;
               ArrayPosition[SizeArrayPosition].profit          = m_position.Profit() + m_position.Commission() + m_position.Swap();    
               ArrayPosition[SizeArrayPosition].type            = m_position.PositionType();
               n++;
            }
      }   
//---Удаление закрытых позиций из структуры  
      SizeArrayPosition = ArraySize(ArrayPosition);
      SizeTotalPosition = PositionsTotal();
      
      for(int z = 0; z < SizeArrayPosition; z++)
         {
            ulong ticket_cl   = ArrayPosition[z].ticket_pos;
            bool  cl_position = true;
            
            for(int i = 0; i < SizeTotalPosition; i++)
               {
                  if(ticket_cl == PositionGetTicket(i))
                     {
                        cl_position = false;
                        n++;
                        break;
                     }
                }
            if(cl_position)
               {
               ArrayRemove(ArrayPosition,z,1);
               Sleep(SLEEPTIME*slp);
               SizeArrayPosition = ArraySize(ArrayPosition);
               }
         }
return(n);
}