Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 13

 
Renat Fatkhullin'in fotoğrafı.

Gerçekte belirli bir bileti arayan ve önbelleğe alan HistorySelect (test cihazında erişim aralığını ayarlar) ve HistoryDealSelect(bilet) arasında karşılaştırma yapamazsınız.

Bu anlayıştan dolayı, Clear versiyonu hemen oluşturuldu. Clear ile Full'u aynı anda karşılaştırabilmek.

 
fxsaber :
Böylece tarih (özellikle test cihazında) sadece tamamlanır, eski kayıtlar değişmez. Temizle seçeneğiyle ilgili.


Gerçek hayatta, bir emir kısmen yürütüldüğünde ve birkaç işlem oluşturduğunda bile, tamamen dolana veya iptal edilene kadar geçmişe girmeyecek gibi görünüyor. Onlar. donmuş tarih kuralı korunur.

Kontroller olmadan yazılım yazsaydık, her şey uzun zaman önce çökerdi.

Finansal yazılım, "kesilmiş köşeler" modunda yazmanıza izin vermez. Bir yerde, sonra başka bir yerde kesersiniz ve ardından geliştiriciler zorlu kontrolleri atlamanın doğru olduğuna inanır ve başarısızlık kaçınılmazdır.

Test cihazında yine de kontrolleri zayıflatabilirsiniz, ancak gerçek hayatta Uzman Danışmanınızın çalışmasına paralel olarak tüm pazar ortamında sürekli değişiklikler üzerinde çalışan birçok asenkron süreç vardır. MQL5 aramaları arasında bir şeylerin kaydedileceğini düşünmek bile korkutucu.

 
Renat Fatkhullin'in fotoğrafı.

Kontroller olmadan yazılım yazsaydık, her şey uzun zaman önce çökerdi.

Finansal yazılım, "kesilmiş köşeler" modunda yazmanıza izin vermez. Bir yerde, sonra başka bir yerde kesersiniz ve ardından geliştiriciler zorlu kontrolleri atlamanın doğru olduğuna inanır ve başarısızlık kaçınılmazdır.

Test cihazında yine de kontrolleri zayıflatabilirsiniz, ancak gerçek hayatta Uzman Danışmanınızın çalışmasına paralel olarak tüm pazar ortamında sürekli değişiklikler üzerinde çalışan birçok asenkron süreç vardır. MQL5 aramaları arasında bir şeylerin kaydedileceğini düşünmek bile korkutucu.

Açıklama için teşekkürler! Tester, umarım biraz düzeltirsin.

 
fxsaber :

Bu anlayıştan dolayı, Clear versiyonu hemen oluşturuldu. Clear ile Full'u aynı anda karşılaştırabilmek.

Test ettiğiniz şeyi yanlış anlıyorsunuz. Bu hiçbir şekilde Clear seçeneği değildir ve ilk olarak HistorySelect'e yapılan referansla ilgisi yoktur.

Tam seçeneğiniz, esasen, birincisi önbellekte bir anlaşma seçen ve ikincisi önbelleğe alınan sonuca erişen çift arama (bilet arama) anlamına gelir. Bir anlaşmanın var olduğu bilinen belirli bir problemde, ilk seçim çağrısı gereksizdir. Get yöntemleri, etkilenen girişi dolaylı olarak önbelleğe gönderir.



Bilgi için: geliştiricilerin hatanın temel nedenlerini alabilmeleri için dahili olarak ayrıntılı Son Hata kodlarını (GetLastError() çağrısı altında) göstermemiz gerekir. Genellikle, platformun derinliklerinde arama başına bu tür birkaç kontrol vardır.
 
Renat Fatkhullin'in fotoğrafı.

Test ettiğiniz şeyi yanlış anlıyorsunuz. Bu, hiçbir şekilde Temizle seçeneği değildir ve ilk olarak HistorySelect'e yapılan referansla ilgisi yoktur.

Bunu fark etmemişsin gibi görünüyor.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Genel sınıf kitaplığı - hatalar, açıklama, sorular, kullanım ve öneriler

fxsaber , 2017.12.08 22:46

  BENCH( HistorySelect ( 0 , INT_MAX ) );
  BENCH( Print (SumProfit(Deals, GetDealProfitClear))); // Реализация с предварительно загруженной историей
Ya da belki farklı şeylerden bahsediyoruz.
 
fxsaber :

Bunu fark etmemiş gibisin.

Ya da belki farklı şeylerden bahsediyoruz.

Algılanan.

Önceden yüklenmiş hikaye nedir? Test cihazındaki HistorySelect'in sahte olduğunu ve istekte belirtilen tüm geçmişi önbelleğe aktarmadığını, ancak yalnızca mevcut işlem veritabanındaki & ile konumlarını işaretlediğini belirttim. Bu nedenle, maliyet sıfırdır.

GetDealProfitClear'da, HistoryDealGetDouble (Deal, DEAL_PROFIT ) aracılığıyla yanlış anladığınız GetDealProfitFull yöntemiyle aynı şekilde ve tamamen aynı şekilde bir istekte bulunursunuz, burada tamamen aynı fiziksel yöntemler vardır

 return ( HistoryDealSelect (Deal) ? HistoryDealGetDouble (Deal, DEAL_PROFIT ) : 0 )

Yani, test cihazındaki geçmişe erişim çok optimize edilmiştir ve gerçekten, Uzman Danışmanınız dışında hiç kimsenin ticaret geçmişini değiştiremeyeceği gerçeğine odaklanır (hala kontroller vardır).

Gerçek bir terminalde her şey farklıdır ve HistorySelect pahalıdır.

 
Renat Fatkhullin'in fotoğrafı.

Ne demek istediğini anladım. Ayrıntılar için teşekkürler! Neyle sonuçlanacağını merak ediyorsun

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Genel sınıf kitaplığı - hatalar, açıklama, sorular, kullanım ve öneriler

Renat Fatkhullin , 2017.12.08 23:19

Kodumuza baktım - alım satım işlemleri veritabanına yapılan çağrıları optimize etmek mümkün. Önümüzdeki hafta piyasaya sürülmek üzere uygulamaya çalışacağız.

Bununla birlikte, Genel tema çok kullanışlıdır! ilgiyle takip edeceğim.
 

CHashMap uygulamasıyla tanıştım
Dürüst olmak gerekirse, beğendim.

 //+------------------------------------------------------------------+
//| Class CHashMap<TKey, TValue>.                                    |
//| Usage: Represents a collection of keys and values.               |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
class CHashMap: public IMap<TKey,TValue>
  {
protected :
   int                m_buckets[];                        
   Entry<TKey,TValue>m_entries[];
   int                m_count;
   int                m_free_list;
   int                m_free_count;
   IEqualityComparer<TKey>*m_comparer;
   bool               m_delete_comparer;

public :
                     CHashMap( void );
                     CHashMap( const int capacity);
                     CHashMap(IEqualityComparer<TKey>*comparer);
                     CHashMap( const int capacity,IEqualityComparer<TKey>*comparer);
                     CHashMap(IMap<TKey,TValue>*map);
                     CHashMap(IMap<TKey,TValue>*map,IEqualityComparer<TKey>*comparer);
                    ~CHashMap( void );
   //--- methods of filling data 
   bool               Add(CKeyValuePair<TKey,TValue>*pair);
   bool               Add(TKey key,TValue value );
   //--- methods of access to protected data
   int                Count( void )                                       { return (m_count-m_free_count); }
   IEqualityComparer<TKey>*Comparer( void )                         const { return (m_comparer);           }
   bool               Contains(CKeyValuePair<TKey,TValue>*item);
   bool               Contains(TKey key,TValue value );
   bool               ContainsKey(TKey key);
   bool               ContainsValue(TValue value );
   //--- methods of copy data from collection   
   int                CopyTo(CKeyValuePair<TKey,TValue>*&dst_array[], const int dst_start= 0 );
   int                CopyTo(TKey &dst_keys[],TValue &dst_values[], const int dst_start= 0 );
   //--- methods of cleaning and deleting
   void               Clear( void );
   bool               Remove(CKeyValuePair<TKey,TValue>*item);
   bool               Remove(TKey key);
   //--- method of access to the data
   bool               TryGetValue(TKey key,TValue & value );
   bool               TrySetValue(TKey key,TValue value );

private :
   void               Initialize( const int capacity);
   void               Resize( int new_size, bool new_hash_codes);
   int                FindEntry(TKey key);
   bool               Insert(TKey key,TValue value , const bool add);
  };


Olası iyileştirme için birkaç öneri var:

1) Benim düşünceme göre, uygulama tamamen doğru olmayan bir kapasite seçimi içeriyor - hem ilk boyut 3 hem de hash tablosu yeniden oluşturulduğunda sonrakiler.
Evet, doğru, düzgün dağılım için bir asal sayı seçmeniz gerekiyor.
Ancak, CPrimeGenerator uygulaması beklentileri karşılamıyor ve eksik asal sayılar içeriyor.
Böyle bir "jeneratörün" amacı açıktır - otomatik asal sayılar oluşturma ile 1.2 mertebesinde bir büyüme faktörü sağlamak.
Ancak, bu çok küçük bir faktör değil mi? Vektörler için C++'da katsayı genellikle kitaplığa bağlı olarak 1.5-2.0'dır (çünkü işlemin ortalama karmaşıklığını büyük ölçüde etkiler).
Çıktı sabit bir katsayı olabilir, ardından bir asal sayılar listesinde ikili arama yoluyla sayı bir asal sayıya yuvarlanabilir .
Ve başlangıçtaki kapasite boyutu 3 çok küçük, geçen yüzyılda yaşamıyoruz.

2) Şu anda, karma tablonun yeniden oluşturulması (Yeniden boyutlandırma) yalnızca %100 dolum kapasitesi ile gerçekleştirilir (tüm m_entries[] doldurulur)
Bu bağlamda, çok düzgün dağılıma sahip olmayan anahtarlar için önemli sayıda çarpışma mümkündür.
Bir seçenek olarak, karma tablo yeniden oluşturma işlemini gerçekleştirmek için gereken sınıra göre %100 azaltacak bir doldurma faktörü eklemeyi düşünün.

 
fxsaber :

Ve sizin durumunuzda klasik versiyon ne kadar geri dönüyor?

 ulong GetDealOrder( const ulong Deal )
{
   return ( HistoryDealSelect (Deal) ? HistoryDealGetInteger (Deal, DEAL_ORDER ) : 0 );
}
 2017.12 . 08 17 : 56 : 05.184 OrdersID (SBRF Splice,M1)       Время выполнения запроса: 9 микросекунд

Bu printf çalışma zamanıdır.

Bir şekilde örneğimi yanlış anladın. MetaTrader'ın standart işlevselliği ile hiçbir şeyi karşılaştırma amacım yok. Bu, kullanıcı düzeyinde, ilişkilendirmeler için etkili algoritmaların nasıl organize edileceği ve herhangi bir şeyin herhangi bir şeyle örneklenmesiyle ilgilidir. Anlaşma numarasının sipariş numarasına bağlanması örneği sadece bir örnek olarak düşünülmelidir, çünkü pratik değeri düşüktür. HistoryDealGetInteger (Deal, DEAL_ORDER ) sistemi var.

 
fxsaber :

Peki, seçilen iki göstergeyi karşılaştıralım. HashMap erişiminin geliştiricilerin sahip olduğundan 4 kat daha hızlı olduğu ortaya çıktı. Ancak geliştiriciler için zaten tarih içeriyor ...

Aynı nedenle, karşılaştırma yanlıştır. Bir ticaret ortamı elde etmek için özel CHashMap'i nasıl karşılaştırabilir ve sistem işlevleriyle nasıl çalışabilirsiniz?