Açık pozisyonları gruplara ayırma - sayfa 7

 

Bence soruyu daha açık bir şekilde formüle etmeye çalışacağım - Konum yapısına yeni bir konum (ve onun 6 özelliği) eklemek için daha hızlı ve daha verimli bir algoritma var mı ??? Benim için böyle çalışıyor - yineleme kullanarak, pozisyonun gerçekten yeni olduğundan emin oluyorum, gerekli parametrelerin değerlerini alıyorum, diziyi 1 arttırıyorum ve yeni bir eleman yazıyorum. Makalede, bir arkadaşa yazmanın ve yazmanın mümkün ve gerekli olduğunu okudum. Orada belirtilen işlevi terminalimde bulamadım, ancak olanları nasıl dolduracağımı bilmiyorum.

 
Sergey Voytsekhovsky :

Bence soruyu daha açık bir şekilde formüle etmeye çalışacağım - Konum yapısına yeni bir konum (ve onun 6 özelliği) eklemek için daha hızlı ve daha verimli bir algoritma var mı ??? Benim için böyle çalışıyor - yineleme kullanarak, pozisyonun gerçekten yeni olduğundan emin oluyorum, gerekli parametrelerin değerlerini alıyorum, diziyi 1 arttırıyorum ve yeni bir eleman yazıyorum. Makalede, bir arkadaşa yazmanın ve yazmanın mümkün ve gerekli olduğunu okudum. Orada belirtilen işlevi terminalimde bulamadım, ancak olanları nasıl dolduracağımı bilmiyorum.

"Pozisyonun gerçekten yeni olduğunu" belirlemek için pozisyonları numaralandırmayı reddedin. Başka bir yol bul. Örneğin OnTradeTransaction'da . Ve diziyi yeniden doldurmak yerine ArrayRemove işlevini kullanın.

 
Alexey Viktorov :

"Pozisyonun gerçekten yeni olduğunu" belirlemek için pozisyonları numaralandırmayı reddedin. Başka bir yol bul. Örneğin OnTradeTransaction'da . Ve diziyi yeniden doldurmak yerine ArrayRemove işlevini kullanın.

Saygılar, hızlı destek ve pratik tavsiye için teşekkürler, devam ediyorum. Ve dizinin kuyruğuna, boyutuna +1 olmadan nasıl veri eklenir, hazır terminal sınıflarından bir formül atılır ??? Peki, şimdi genel gelişme için, kafada boşluk bırakmamak için, pliz ,,, ???

 
Sergey Voytsekhovsky :

Ve dizinin kuyruğuna, boyutuna +1 olmadan nasıl veri eklenir, hazır terminal sınıflarından bir formül atılır ??? Peki, şimdi genel gelişme için, kafada boşluk bırakmamak için, pliz ,,, ???

Yöntemin kendisini buldum ama nasıl sabitleyeceğimi bilmiyorum, yeterli tecrübem yok. Varlığından bile haberiniz olmadığı bir yabancı dile hakim olmak zordur. Bu böyle, lirik bir arasöz.

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

Peki nasıl batırırsın??? Artırmak istediğiniz diziyi nereye çekiçlemelisiniz? Dizi bir yapıysa ne olur?

 
Sergey Voytsekhovsky :

Saygılar, hızlı destek ve pratik tavsiye için teşekkürler, devam ediyorum. Ve dizinin kuyruğuna, boyutuna +1 olmadan nasıl veri eklenir, hazır terminal sınıflarından bir formül atılır ??? Peki, şimdi genel gelişme için, kafada boşluk bırakmamak için, pliz ,,, ???

Elimden geldiğince hazır dersleri kullanmamaya çalışıyorum. Yalnızca CTrade ve ticaret panelleri oluşturmak için kullanıyorum. CTrade'i kendim için yeniden yazmak tembel ve paneller benim için zor ve anlama arzusu yok. Bu nedenle, dizinin +1'inin ve yapının elemanlarının doldurulmasının üç döngü ile karşılaştırıldığında aynı gecikme olmadığından eminim.
 
Sergey Voytsekhovsky :

Yöntemin kendisini buldum ama nasıl sabitleyeceğimi bilmiyorum, yeterli tecrübem yok. Varlığından bile haberiniz olmadığı bir yabancı dile hakim olmak zordur. Bu böyle, lirik bir arasöz.

Peki nasıl batırırsın???

Yapı dizinize - herhangi bir şekilde.

 
Sergey Voytsekhovsky :

Yöntemin kendisini buldum ama nasıl sabitleyeceğimi bilmiyorum, yeterli tecrübem yok. Varlığından bile haberiniz olmadığı bir yabancı dile hakim olmak zordur. Bu böyle, lirik bir arasöz.

Peki nasıl batırırsın???

Ve bu, eğer doğru anlarsam, daha çok OOP nesnelerinin dizileri için tasarlanmıştır.
 
Alexey Viktorov :
Ve bu, eğer doğru anlarsam, daha çok OOP nesnelerinin dizileri için tasarlanmıştır.

"Daha fazla" değil, oradan.

 
Alexey Viktorov :
Elimden geldiğince hazır dersleri kullanmamaya çalışıyorum. Yalnızca CTrade ve ticaret panelleri oluşturmak için kullanıyorum. CTrade'i kendim için yeniden yazmak tembel ve paneller benim için zor ve anlama arzusu yok. Bu nedenle, dizinin +1'inin ve yapının elemanlarının doldurulmasının üç döngü ile karşılaştırıldığında aynı gecikme olmadığından eminim.

Fikir açık, neden kanıtlanmış hazır algoritmaların kullanılmadığı açık değil, ancak "üç döngü" hakkında - çok anlaşılır, teşekkürler. Yüksek kaliteli basit çözümler elde ettiğinizde, neden kendim tahmin etmediğimi merak ediyorum, yüzeyde öyle. Teşekkür ederim.

 
Artyom Trishkin :

"Daha fazla" değil, oradan.

Lütfen söyleyin https://www.mql5.com/ru/articles/567 yazısında böyle bir kod var ve bahsi geçiyor.

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

  }

Ama standart pakette bulamadım. Kötü arandı veya makale güncel değil ???

Neden: