Hatalar, hatalar, sorular - sayfa 2676

 
Sergey Dzyublik :

MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?

Lütfen ArrayResize kullanarak dahili rezervasyon algoritmasını iyileştirmeyi düşünün.

Örneğin, sınıflar için, yapıcıyı çağırmanın yanı sıra, bir tür "listelerde dahili kayıt" gerçekleştirdiklerini varsayabilirsiniz.
ArrayResize kullanarak rezervasyonun bir parçası olarak, doğrudan bellek ayırmaya ek olarak, süreci optimize etmeyi deneyebilirsiniz:
- oluşturulan komşu bir öğeden veri alın (örneğin, sanal işlevler tablosuna bir işaretçi);
- henüz oluşturulmamış sınıfların "iç kaydı" için avans veya alan ayırma;

Mesaj için teşekkürler.

ArrayResize kodunun boş bir çağrıya karşı koruması vardır (eleman sayısında herhangi bir değişiklik olmadığında), bu nedenle fonksiyon kodu çalışmaz.

Öğe sayısındaki gerçek bir değişiklik, diziye bağlı olarak ArrayResize işlevinin bir veya bir kısmının çalışmasına neden olurken


Sağladığınız kod sayesinde, ArrayResize'ın parçalarından birinin karmaşıklığını sıfıra indirebildim, bu, nesne dizileri için işlevi hızlandıracak
 
Ilyas :

Bana Terminalin bellek tüketimini nasıl azaltacağımı söyle? Danışmanı başlatırken, birkaç milyon onay talep ediyorum. Onlar üzerinde hesaplamalar yapıyorum ve artık bunlara gerek yok. Boşluk kalmaması için yeni keneler yüklemek için yalnızca kene işlevlerini kullanıyorum.


Bu milyon tıklama nedeniyle, terminal 500 MB bellek tüketir ve onu boşaltmak için acelesi yoktur. Daha doğrusu, basitçe serbest bırakmaz. Tüketimi en aza indirmek için Terminal'i tüm önbelleklerini temizlemeye zorlamak bir şekilde mümkün mü? Her Terminal için VPS 0,5 GB için - cesurca çıkıyor.

 
fxsaber :

Bana Terminalin bellek tüketimini nasıl azaltacağımı söyle? Danışmanı başlatırken, birkaç milyon onay talep ediyorum. Onlar üzerinde hesaplamalar yapıyorum ve artık bunlara gerek yok. Boşluk kalmaması için yeni keneler yüklemek için yalnızca kene işlevlerini kullanıyorum.


Bu milyon tıklama nedeniyle, terminal 500 MB bellek tüketir ve onu boşaltmak için acelesi yoktur. Daha doğrusu, basitçe serbest bırakmaz. Tüketimi en aza indirmek için Terminal'i tüm önbelleklerini temizlemeye zorlamak bir şekilde mümkün mü? Her Terminal için VPS 0,5 GB için - cesurca çıkıyor.

Dizi Ücretsiz

Programın karmaşık dinamik koşullarda belleği bağımsız olarak yönetmesi gerekiyorsa, ArrayFree() işlevi, zaten gereksiz olan bir dinamik dizi tarafından işgal edilen belleği açıkça ve hemen serbest bırakmanıza olanak tanır.

Документация по MQL5: Операции с массивами / ArrayFree
Документация по MQL5: Операции с массивами / ArrayFree
  • www.mql5.com
//| Класс диалога для работы с памятью                               | //| Освобождение памяти текущего массива                             | //| Попытка добавления памяти для текущего массива                   | //| Обработка событий                                                |...
 

serbest bırakıyorum tabii. Terminalin kendisi, işlem sırasında ihtiyaç duymadığım keneleri önbellekte saklar.

Bu tikleri tekrar soğukta yükseltmek benim için daha iyi. Terminalin "soğutma" mekanizması gereklidir.

 

Merhabalar, test cihazında bulunan CopyTicks ve CopyTicksRange'ın diğer cihazlardan veri alamama sorunu ile karşılaştım.Tabloya eklendiğinde her şey çalışıyor.

2363 oluşturun (ve 2361 için aynıydı)

Belki bir hata yaptım? Lütfen yardım edin, teşekkürler!

 #property copyright "Copyright 2020, LittleBitTime"
#property link        "https://login.mql5.com/ru/users/LittleBitTime"
#property version    "1.00"

int OnInit () {
   return INIT_SUCCEEDED ;
}

void OnDeinit ( const int reason) {
}

void OnTick () {
   MqlTick LastTick;
   if ( SymbolInfoTick ( Symbol (), LastTick)) {
       //Print("START");
      
       if (GetTicks( "RTS-3.20" , LastTick.time_msc) && GetTicks( "RTS-6.20" , LastTick.time_msc)) {
         Print ( "История загружена" );
      } else {
         Print ( "Ошибка загрузки истории" );
      }
       //Print("END");
   } else {
       Print ( "Ошибка получения последнего тика, для получения последнего известного времени" );
   }
}

bool GetTicks( string symbol, ulong TimeEnd) {
   ulong TimeStartPeriod = TimeEnd-( 60 * 1000 );
   
   MqlTick ticks[];
   bool success = false ; //флаг успешного выполнения копирования тиков
   uint start = GetTickCount (); //замерим время старта перед получением тиков
   
   int received = CopyTicksRange (symbol, ticks, COPY_TICKS_ALL , TimeStartPeriod, TimeEnd);
   if (received != - 1 ) {
       //выведем информацию о количестве тиков и затраченном времени времени
       PrintFormat ( "%s: received %d ticks in %d ms" , symbol, received, GetTickCount ()-start);
       //если тиковая история синхронизирована, то код ошибки равен нулю
       if ( GetLastError () == 0 )
         success = true ;
       else
         PrintFormat ( "%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d" , symbol, received, GetTickCount ()-start, _LastError );
   }
   
   if (!success) {
       PrintFormat ( "Ошибкаp загрузки тиков! " + symbol);
      
       return false ;
   }
   
   
   return true ;
}
Dosyalar:
terminal.png  59 kb
tester.png  25 kb
tester_log.png  41 kb
 
LittleBitTime :

Merhabalar, test cihazında bulunan CopyTicks ve CopyTicksRange'ın diğer cihazlardan veri alamama sorunu ile karşılaştım.Tabloya eklendiğinde her şey çalışıyor.

2363'ü oluşturun (ve 2361 için aynıydı)

Belki bir hata yaptım? Lütfen yardım edin, teşekkürler!

CopyTicks, test cihazında veri indirme işlemini başlatmıyor

İlk önce istenen enstrümanın CopyRates'ini isteyin. En az 1 bar. Ardından, inci dizinin indirilmesi ve kenelerin oluşturulması gerçekleşecektir.

Bundan sonra, sakince keneler isteyin

Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 
Ilyas :

Mesaj için teşekkürler.
ArrayResize kodunun boş bir çağrıya karşı koruması vardır (eleman sayısında herhangi bir değişiklik olmadığında), bu nedenle fonksiyon kodu çalışmaz.
Öğe sayısındaki gerçek bir değişiklik, diziye bağlı olarak ArrayResize işlevinin bir veya bir kısmının çalışmasına neden olurken

Verdiğiniz kod sayesinde, ArrayResize'ın parçalarından birinin karmaşıklığını sıfıra indirebildim, bu, nesne dizileri için işlevi hızlandıracak

İyi günler!
Yeni operatörü daha önce kullanmadım, çünkü mantıksal olarak ayrılmış belleğe sahip ArrayResize'dan daha yavaş olması gerekir.
Ancak sonuçlar etkileyiciydi, bunun tam tersi olduğu ortaya çıktı - yeni operatör aracılığıyla kendi kendine yapılan bir dizi daha hızlı.

MT5 (2363 derlemesi):

 #define K 1000
#define M ( 1000 * K)

#define   SpeedTest(test_count,msg,EX)        { uint mss= GetTickCount (); ulong count=test_count; for ( ulong ii= 0 ;ii<count&&! _StopFlag ;ii++){EX;} \
                                               printf ( "%-60s: loops=%i ms=%u" ,msg,count, GetTickCount ()-mss);}
                                              
class A{
public :
   int data;
};


template < typename T>
void test1( const int test_count, const int array_size){
   SpeedTest(
   test_count, "Test Class ArrayResize all" ,
   {
      T class_array[];
       ArrayResize (class_array, array_size);
   }
   )
};

template < typename T>
void test2( const int test_count, const int array_size){
   SpeedTest(
   test_count, "Test Class ArrayResize one by one with reserved memory" ,
   {
      T class_array[];
       ArrayResize (class_array, 1 , array_size - 1 );
       for ( int i = 2 ; i <= array_size; i++){
         ArrayResize (class_array, i);
      }
   }
   )
};

template < typename T>
void test3( const int test_count, const int array_size){
   SpeedTest(
   test_count, "Test Class ArrayResize one by one with new operator" ,
   {
      T* class_array[];
       ArrayResize (class_array, array_size);
       for ( int i = 0 ; i < array_size; ++i){
         class_array[i] = new T();
      }
       for ( int i = 0 ; i < array_size; ++i){
         delete class_array[i];
      }
   }
   )
};


void OnStart ()
{
   const int test_count = 1 *K;
   const int array_size = 25 *K;  
  
   printf ( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" );
   test1<A>(test_count, array_size);               // Avg time: release( 730) / debug( 830)
   test2<A>(test_count, array_size);               // Avg time: release(1540) / debug(1720)
   test3<A>(test_count, array_size);               // Avg time: release(1200) / debug(1470)
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
   test1<A>(test_count, array_size);
   test2<A>(test_count, array_size);
   test3<A>(test_count, array_size);
}
  
 
Slava :

CopyTicks, test cihazında veri indirme işlemini başlatmıyor

İlk önce istenen enstrümanın CopyRates'ini isteyin. En az 1 bar. Ardından, inci dizinin indirilmesi ve kenelerin oluşturulması gerçekleşecektir.

Bundan sonra, sakince keneler isteyin

Çok teşekkürler, yardımcı oldu. Ama bunu belgelerde bulamadım.. Yoksa kötü mü görünüyordum? Oraya yazarsan iyi olur :)
 
LittleBitTime :
Çok teşekkür ederim, yardımcı oldu. Ama bunu belgelerde bulamadım.. Yoksa kötü mü görünüyordum? Oraya yazarsan iyi olur :)

CopyRates'e göre otomatik indirme yapmak daha iyidir.

 

Dün profildeki "eski" etkin olmayan aracıların listesini temizledi

Bir gün sonra profile gidiyorum ve silinen girişlerin acenteler listesinde geri yüklendiğini görüyorum.

Ayrıca, acentelerin kuruluş ve faaliyet tarihleri de değiştirilmiştir.

Cloud.mql5.com'da aracıların istatistiklerini görüntüledikten sonra listenin geri yüklendiğine dair bir varsayım (muhtemelen hatalı) var.