Dividere le posizioni aperte in gruppi - pagina 7

 

Secondo me, c'è un algoritmo più veloce ed efficiente per aggiungere una nuova posizione (e le sue 6 proprietà) alla struttura della posizione? Da me funziona così - uso la forza bruta per assicurarmi che la posizione sia davvero nuova, ottengo i valori dei parametri richiesti, aumento l'array di 1 e scrivo un nuovo elemento. Ho letto nell'articolo che ingrandire e scrivere può e deve essere fatto in modo diverso. Non ho trovato la funzione specificata lì nel mio terminale e non so come riempirla.

 
Sergey Voytsekhovsky:

Secondo me, c'è un algoritmo più veloce ed efficiente per aggiungere una nuova posizione (e le sue 6 proprietà) alla struttura della posizione? Da me funziona così - uso la forza bruta per assicurarmi che la posizione sia davvero nuova, ottengo i valori dei parametri richiesti, aumento l'array di 1 e scrivo un nuovo elemento. Ho letto nell'articolo che ingrandire e scrivere può e deve essere fatto in modo diverso. Non ho trovato la funzione specificata lì nel mio terminale e non so come riempirla.

Non cercate di cercare le posizioni per determinare "che la posizione è veramente nuova". Trova un altro modo. Per esempio in OnTradeTransaction. E provate a usare la funzione ArrayRemove invece dell'overflow dell'array

 
Alexey Viktorov:

Non provate molte posizioni per determinare "che la posizione è veramente nuova". Trova un altro modo. Per esempio in OnTradeTransaction. E provate a usare la funzione ArrayRemove invece dell'overflow dell'array

Rispetto, grazie per il tuo rapido supporto e i tuoi utili consigli, inizierò. E come aggiungere alla coda dei dati dell'array senza +1 alla dimensione, formula da classi pronte per il lancio del terminale? Bene, ora per lo sviluppo generale, per non lasciare vuoti nella mia testa, per favore?

 
Sergey Voytsekhovsky:

E come aggiungere alla coda dei dati dell'array senza +1 alla dimensione, formula da classi già pronte terminale buttare su? Bene, ora per lo sviluppo generale, per non lasciare vuoti nella mia testa, per favore?

Ho trovato il metodo da solo, ma come attaccarlo, non posso pensare, non ho abbastanza esperienza. È difficile padroneggiare una lingua straniera quando non si sa nemmeno che esiste. Questa è una digressione.

//+------------------------------------------------------------------+
//| Adding an element to the end of the array                        |
//| Добавление элемента в конец массива                              |
//+------------------------------------------------------------------+
bool CArrayInt::Add(const int element)
  {
//--- check/reserve elements of array
//--- проверка / резерв элементов массива
   if(!Reserve(1))
      return(false);
//--- add
   m_data[m_data_total++]=element;
   m_sort_mode=-1;
//--- successful
//--- успешный
   return(true);
  }

Come si avvita? Dove mettete il tipo di matrice che volete coltivare? E se l'array è una struttura?

 
Sergey Voytsekhovsky:

Rispetto, grazie per il tuo rapido supporto e i tuoi utili consigli, inizierò. E come aggiungere alla coda dei dati dell'array senza +1 alla dimensione, formula da classi pronte per il lancio del terminale? Bene, ora per lo sviluppo generale, per non lasciare vuoti nella mia testa, per favore?

Cerco di non usare classi già pronte. Uso solo CTrade per creare pannelli di trading. Sono troppo pigro per riscrivere CTrade per i miei bisogni, mentre i pannelli sono complicati per me e non ho nessuna voglia di capirli. Ecco perché sono sicuro che +1 all'array e il riempimento degli elementi della struttura non è un ritardo così grande rispetto a tre cicli.
 
Sergey Voytsekhovsky:

Ho trovato il metodo stesso, ma non riesco a capire come applicarlo, perché non sono abbastanza esperto. È difficile padroneggiare una lingua straniera quando non si sa nemmeno che esiste. Questa è una digressione.

Quindi come faccio ad avvitarlo?

Alla vostra serie di strutture - non c'è modo.

 
Sergey Voytsekhovsky:

Ho trovato il metodo stesso, ma non riesco a capire come applicarlo, perché non sono abbastanza esperto. È difficile padroneggiare una lingua straniera quando non si sa nemmeno che esiste. Questa è una digressione.

Quindi come faccio ad avvitarlo?

E questo, se ho capito bene, è più per gli array di oggetti OOP.
 
Alexey Viktorov:
E questo, se ho capito bene, è più per gli array di oggetti OOP.

Non "più", ma da lì.

 
Alexey Viktorov:
Cerco di non usare classi già pronte. Uso CTrade solo per creare pannelli di trading. Sono troppo pigro per riscrivere CTrade per le mie esigenze, mentre i pannelli sono troppo complicati per me e sono riluttante a capirli. Ecco perché sono sicuro che +1 a un array e riempire gli elementi della struttura non è un gran ritardo rispetto a tre cicli.

L'idea è chiara, non è chiaro perché non dovremmo usare algoritmi già collaudati, ma sui "tre loop" - molto comprensibile, grazie. Quando si ottengono soluzioni semplici di alta qualità, mi chiedo sempre perché non l'ho capito io, perché è così ovvio. Grazie.

 
Artyom Trishkin:

Non "più", ma da qui.

Per favore ditemi, l'articolohttps://www.mql5.com/ru/articles/567 ha il seguente codice e menziona

Этот класс находятся в файле "CDynamicArray.mqh" приложения. Файл должен располагаться в каталоге "MQL5\Include" каталога данных терминала.
class CDynamicArray
  {
private:
   int               m_ChunkSize;    // Размер блока
   int               m_ReservedSize; // Реальный размер массива
   int               m_Size;         // Количество занятых элементов массива
public:
   double            Element[];      // Собственно массив. Находится в секции public, 
                                     // чтобы в случае необходимости работать с ним напрямую
   //+------------------------------------------------------------------+
   //|   Конструктор                                                    |
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // Количество занятых элементов
      m_ChunkSize=ChunkSize;               // Размер блока
      m_ReservedSize=ChunkSize;            // Реальный размер массива
      ArrayResize(Element,m_ReservedSize); // Подготовка массива
     }
   //+------------------------------------------------------------------+
   //|   Функция добавления в конец массива                             |
   //+------------------------------------------------------------------+
   void AddValue(double Value)
     {
      m_Size++; // Увеличение количества занятых элементов
      if(m_Size>m_ReservedSize)
        { // Требуемое количество больше реального размера массива
         m_ReservedSize+=m_ChunkSize; // Рассчитываем новый размер массива
         ArrayResize(Element,m_ReservedSize); // Увеличиваем реальный размер массива
        }
      Element[m_Size-1]=Value; // Добавляем значение
     }
   //+------------------------------------------------------------------+
   //|   Функция получения количества занятых элементов массива         |
   //+------------------------------------------------------------------+
   int Size()
     {
      return(m_Size);
     }
  };
Этот класс находятся в файле "CDynamicArray.mqh" приложения. Файл должен располагаться в каталоге "MQL5\Include" каталога данных терминала.

Сравним быстродействие при последовательном увеличении массива на 1 и при увеличении размера массива блоками:

int n=50000;
   double ar[];
   CDynamicArray da;

//--- Вариант 1 (увеличение размера по 1-му элементу)
   long st=GetTickCount(); // Запомним время начала 
   ArrayResize(ar,0); // Установка нулевого размера массива 
   for(int i=0;i<n;i++)
     {
      ArrayResize(ar,i+1); // Последовательное изменение размера массива
      ar[i]=i;
     }
   Alert("Вариант 1: "+IntegerToString(GetTickCount()-st)+" мс"); // Сообщение о времени, затраченном на первый вариант

//--- Вариант 2 (увеличение размера блоками)
   st=GetTickCount(); // Запомним время начала 
   for(int i=0;i<n;i++)
     {
      da.AddValue(i); // Добавляем элемент
     }
   Alert("Вариант 2: "+IntegerToString(GetTickCount()-st)+" мс"); // Сообщение о времени, затраченном на второй вариант

  }

Ma non l'ho trovato nel pacchetto standard. Non è una buona ricerca o l'articolo non è aggiornato?