열린 직위를 그룹으로 나누기 - 페이지 7

 

내 의견으로는 질문을 더 명확하게 공식화하려고 노력할 것입니다. 위치 구조에 새 위치(및 6가지 속성)를 추가하는 더 빠르고 효율적인 알고리즘이 있습니까 ??? 그것은 나에게 다음과 같이 작동합니다. 반복을 사용하여 위치가 정말 새로운지 확인하고 필요한 매개 변수의 값을 얻고 배열을 1씩 늘리고 새 요소를 작성합니다. 기사에서 나는 친구를 늘리고 쓰는 것이 가능하고 필요하다는 것을 읽었습니다. 터미널에 표시된 기능을 찾지 못했지만 어떻게 채워야 하는지 모르겠습니다.

 
Sergey Voytsekhovsky :

내 의견으로는 질문을 더 명확하게 공식화하려고 노력할 것입니다. 위치 구조에 새 위치(및 6가지 속성)를 추가하는 더 빠르고 효율적인 알고리즘이 있습니까 ??? 그것은 나에게 다음과 같이 작동합니다. 반복을 사용하여 위치가 정말 새로운지 확인하고 필요한 매개 변수의 값을 얻고 배열을 1씩 늘리고 새 요소를 작성합니다. 기사에서 나는 친구를 늘리고 쓰는 것이 가능하고 필요하다는 것을 읽었습니다. 내 터미널에서 거기에 표시된 기능을 찾지 못했고 그 기능을 채우는 방법을 모르겠습니다.

"그 위치가 정말로 새로운 것인지" 판단하기 위해 위치를 열거하는 것을 거부합니다. 다른 방법을 찾으십시오. 예를 들어 OnTradeTransaction . 배열을 다시 채우는 대신 ArrayRemove 함수를 사용하십시오.

 
Alexey Viktorov :

"그 위치가 정말로 새로운 것인지" 판단하기 위해 위치를 열거하는 것을 거부합니다. 다른 방법을 찾으십시오. 예를 들어 OnTradeTransaction . 배열을 다시 채우는 대신 ArrayRemove 함수를 사용하십시오.

존경합니다. 신속한 지원과 실질적인 조언에 감사드리며 진행합니다. 그리고 크기를 +1하지 않고 배열의 꼬리에 데이터를 추가하는 방법은 기성 터미널 클래스에서 수식을 던집니다 ??? 글쎄, 이제 일반적인 개발을 위해 머리에 틈을 남기지 않도록 pliz ,,, ???

 
Sergey Voytsekhovsky :

그리고 크기를 +1하지 않고 배열의 꼬리에 데이터를 추가하는 방법은 기성 터미널 클래스에서 수식을 던집니다 ??? 글쎄, 이제 일반적인 개발을 위해 머리에 틈을 남기지 않도록 pliz ,,, ???

방법 자체는 찾았지만 고정하는 방법을 모르고 경험이 충분하지 않습니다. 외국어의 존재조차 모르는 상태에서 외국어를 마스터하는 것은 어렵습니다. 이것은 서정적 인 탈선입니다.

 //+------------------------------------------------------------------+
//| 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 );
  }

그럼 어떻게 짜나요??? 어떤 어레이를 늘리고 싶은지 망치는 곳은 어디입니까? 배열이 구조체라면?

 
Sergey Voytsekhovsky :

존경합니다. 신속한 지원과 실질적인 조언에 감사드리며 진행합니다. 그리고 크기를 +1하지 않고 배열의 꼬리에 데이터를 추가하는 방법은 기성 터미널 클래스에서 수식을 던집니다 ??? 글쎄, 이제 일반적인 개발을 위해 머리에 틈을 남기지 않도록 pliz ,,, ???

기성 수업을 사용하지 않으려고 최선을 다합니다. 저는 CTrad 와 트레이딩 패널을 만드는 데만 사용합니다. 나 자신을 위해 CTrade를 다시 작성하는 것은 게으르고 패널이 나에게 어렵고 이해하려는 욕구가 없습니다. 따라서 배열에 +1하고 구조의 요소를 채우는 것은 3주기에 비해 동일한 지연이 아니라고 확신합니다.
 
Sergey Voytsekhovsky :

방법 자체는 찾았지만 고정하는 방법을 모르고 경험이 충분하지 않습니다. 외국어의 존재조차 모르는 상태에서 외국어를 마스터하는 것은 어렵습니다. 이것은 서정적 인 탈선입니다.

그럼 어떻게 짜나요???

어떤 식 으로든 구조 배열에.

 
Sergey Voytsekhovsky :

방법 자체는 찾았지만 고정하는 방법을 모르고 경험이 충분하지 않습니다. 외국어의 존재조차 모르는 상태에서 외국어를 마스터하는 것은 어렵습니다. 이것은 서정적 인 탈선입니다.

그럼 어떻게 짜나요???

그리고 이것은 내가 올바르게 이해한다면 OOP 객체의 배열을 위한 것입니다.
 
Alexey Viktorov :
그리고 이것은 내가 올바르게 이해한다면 OOP 객체의 배열을 위한 것입니다.

"더"가 아니라 거기에서.

 
Alexey Viktorov :
기성 수업을 사용하지 않으려고 최선을 다합니다. 저는 CTrad와 트레이딩 패널을 만드는 데만 사용합니다. 나 자신을 위해 CTrade를 다시 작성하는 것은 게으르고 패널이 나에게 어렵고 이해하려는 욕구가 없습니다. 따라서 배열에 +1하고 구조의 요소를 채우는 것은 3주기에 비해 동일한 지연이 아니라고 확신합니다.

아이디어는 분명합니다. 이미 만들어진 검증된 알고리즘을 사용하지 않는 이유는 명확하지 않지만 "세 주기"에 대해서는 매우 이해하기 쉽습니다. 감사합니다. 고품질의 간단한 솔루션을 얻을 때면 항상 내가 스스로 추측하지 못한 이유가 무엇인지 궁금합니다. 표면적으로는 그렇습니다. 고맙습니다.

 
Artyom Trishkin :

"더"가 아니라 거기에서.

https://www.mql5.com/ru/articles/567 기사에 그런 코드와 언급이 있다고 말해주세요.

Этот класс находятся в файле "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)+ " мс" ); // Сообщение о времени, затраченном на второй вариант

  }

하지만 표준 패키지에서는 찾을 수 없었습니다. 잘못 검색했거나 기사가 구식 ???