Hatalar, hatalar, sorular - sayfa 1124

 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   struct ARGB
  {
     uchar blue;
     uchar green;
     uchar red;
     uchar alpha;
  };
  
   struct N
  {
     uint num;
  };
  
  N n={ 100288 };
  ARGB c;
  c=n;         //так получаем предупреждение implicit struct cast       sample.mq5      22      4
  c=(ARGB)n;   //а так всё в порядке
}
Her iki yapının boyutları aynı olmasına ve birbirlerine kopyalanmaları kayıpsız olmasına rağmen yine de uyarı alıyoruz.
 
Fleder :
Her iki yapının boyutları aynı olmasına ve birbirlerine kopyalanmaları kayıpsız olmasına rağmen yine de uyarı alıyoruz.
Bu harika. Açık bir oyuncu kadrosu yapmak o kadar da zor değil. Ve böcekler tırmanırken neyi uygun gördüğünüzü anlamak pek hoş değil.
 
TheXpert :
Bu harika. Açık bir oyuncu kadrosu yapmak o kadar da zor değil. Ve böcekler tırmanırken neyi uygun gördüğünüzü anlamak pek hoş değil.
Görünüşe göre derleyicinin sloganı: "Aşırı yapmak, gereğinden az yapmaktan daha iyidir!".
 

Uygulamadan SD'ye kopyala-yapıştır:

Zaman serilerini RAM'den *.hc önbelleğine geri yükleme yeteneği
Hatalar, MetaTrader 5 MQL, Açıldı, Başlatıldı: 2014.04.12 06:04, #995430

Terminalin sürümü ve bitliği

910 32bit

problemin tanımı

Merhaba sevgili geliştiriciler!

MQL5 dilinde, CopyRates , CopyTime , CopyOpen vb. gibi bir dizi sistem işlevi, zaman serisi verilerini almak için tasarlanmıştır.

Bu fonksiyonlardan herhangi biri çağrıldığında istenilen zaman serisi "Max bar in chart" parametresi içerisinde RAM'e yüklenir.

Bununla birlikte, aşağıdaki gibi faktörlerin bir kombinasyonu:

1. Sembolle veya tamamen sunucudan indirilen, yeterince derin erişilebilir geçmiş.

2. "Grafikteki maksimum çubuklar" parametresi "Sınırsız" değerine eşittir.

3. En küçük M1 zaman çerçevesinin verileri istenir.

Çok büyük bir RAM tüketimi var.

Sorun, çalışan bir MQL5 programının mantığında (örneğin, çok para birimli bir Uzman Danışman veya gösterge ise) gerçeğiyle daha da ağırlaşıyor.

birkaç sembolün daha düşük zaman dilimlerindeki verilere alternatif erişim sağlanabilir (örneğin, tek bir arama).

Sonuç olarak, RAM tüketimi katlanarak artar.

Получение данных нужного таймфрейма из промежуточных данных

HCC formatındaki hizmet dosyaları, talep edilen zaman dilimleri için HC formatında fiyat verilerinin çizilmesi için bir veri kaynağı görevi görür. HC formatındaki veriler, hızlı erişim için maksimum düzeyde hazırlanmış zaman serileridir. Yalnızca bir çizelgenin veya bir mql5 programının talebi üzerine, "Grafiklerdeki maksimum çubuklar" parametresinin değerini aşmayan bir miktarda oluşturulurlar ve hc uzantılı dosyalarda daha sonra kullanılmak üzere kaydedilirler.

Kaynaklardan tasarruf etmek için, zaman çerçevesi verileri yalnızca gerektiğinde RAM'e yüklenir ve saklanır; uzun süre veri erişimi yoksa, RAM'den kaldırılır ve bir dosyaya kaydedilir. Her bir zaman dilimi için, diğer zaman dilimleri için hazır verilerin bulunup bulunmadığına bakılmaksızın veriler hazırlanır. Veri oluşturma ve kullanılabilirlik kuralları tüm zaman dilimleri için aynıdır. Onlar. HCC formatında veri depolama biriminin bir dakika çubuğu olmasına rağmen, HCC formatında verilerin varlığı, HC formatında aynı ciltte M1 zaman dilimi verilerinin kullanılabilirliği ve kullanılabilirliği anlamına gelmez.

Sunucudan yeni verilerin alınması , kullanılan fiyat verilerinin tüm zaman dilimleri için HC formatında otomatik olarak güncellenmesine ve bunları hesaplama için giriş verileri olarak açıkça kullanan tüm göstergelerin yeniden hesaplanmasına neden olur.

Dokümantasyondan alınan yukarıdaki alıntıda sarı ile vurgulanan sürecin zamanlaması oldukça büyüktür: yaklaşık yarım saat (gözlemlerime göre).

Sonuç olarak, istenen tüm zaman serileri "RAM" içinde "toplanır", bunun nedeni açık değildir.

"RAM" henüz "kauçuk" değilse, ancak "doyumsuz" EA/göstergesi giderek daha fazla zaman serisi gerektiriyorsa, terminal için hiçbir şey kalmaz,

Ekstra zaman serilerinin acilen dosyaya (önbellek) nasıl "atılacağı" dışında. Böylece, bu acil durum sıfırlaması ile terminal, zaman serilerini şu şekilde sıfırlayabilir:

"bozuk önbellek" yani. verilerin "iyi bir yarısını" kaybedecek. Ve bu zaman serisine bir daha erişildiğinde, terminal bu "bozuk önbelleği" normal bir tane kisvesi altında yükler.

Sonuç olarak, gerekli zaman serileri, tarihte büyük bir "delik" ile terminal grafiğinde görüntülenir.

Beklenen Sonuç

MQL5, çalışma zamanı kaynaklarından tasarruf etme eğilimindedir. Bir örnek aşağıdaki olacaktır:

1. ArrayFree işlevi

2. Kaynaksız işlev

3. silme operatörü

4. "Grafiklerdeki maksimum çubuklar" parametresi

MQL5 dilinin işlevselliğine, artık kullanılmayan zaman serileriyle terminalin kendisinin ne yaptığını zorlayacak bir sistem işlevi eklemek mümkün müdür?

zamanlamanın sonunda, örneğin, bu zaman serisine sahip hiçbir çizelge açık değilse?

Örneğin, bir işlev:

bool  SeriesFlush (
    string             symbol_name ,        // имя символа
    ENUM_TIMEFRAMES    timeframe ,          // период
   );

Bu, şunları sağlar:

1. RAM taşması için korkmayın.

2. Yalnızca terminal kapatıldığında *.hc dosyalarının manuel olarak silinmesiyle kaldırılabilen "bozuk önbelleklerin" görünümü konusunda endişelenmeyin.

3. İşletim sisteminin bitliğine ve RAM'in boyutuna bağlı kalmayın.

4. Bir yazılım ürünü geliştirirken, yukarıda açıklanan eksiklikleri gidermeye çalışan "koltuk değneği" kullanmayın.

 

 
Fleder :

Uygulamadan SD'ye kopyala-yapıştır:

Zaman serilerini RAM'den *.hc önbelleğine geri yükleme yeteneği
Ne harika bir fikir.
 
Olumlu bir önyargı ile gösterge verilerinin nasıl alınacağını söyleyebilir misiniz? -1 bar'daki verilerle ilgileniyor musunuz?
 
dentraf :
Olumlu bir önyargı ile gösterge verilerini nasıl alacağımı söyleyebilir misiniz? -1 bar'daki verilerle ilgileniyor musunuz?

Bunu yapmak için, ilgilenilen gösterge çizgisi için ofset ayarlarını bilmeniz gerekir. Bu, iAlligator teknik göstergesinden bir örnektir

 //--- зададим смещение для каждой линии
   PlotIndexSetInteger ( 0 , PLOT_SHIFT ,jaw_shift);

Bu tam olarak ofsettir ve gelecek için göstergenin hesaplanması değildir.

 

Uygulamadan SD'ye kopyala-yapıştır:

Göstergelerde IsStopped sistem işlevinin yanlış çalışması
Hatalar, MetaTrader 5 MQL, Açıldı, Başlatıldı: 2014.04.12 07:59, #995480

Terminalin sürümü ve bitliği

910 32bit

problemin tanımı

Merhaba sevgili geliştiriciler!

Çok sayıda yinelemeli döngüler tasarlarken kod kalitesini iyileştirmeye yönelik önerilerden biri

sistemi kullanarak MQL5 programının zorla sonlandırılması gerçeği için bir kontrol yerleştirmektir.

fonksiyonlar bool IsStopped ();

Ancak, uygulamanın gösterdiği gibi, bu kontrol göstergelerde çalışmaz (komut dosyalarında ve Uzman Danışmanlarda çalışır)

İşte sorunun özünü yansıtan kısa bir gösterge kodu:

 #property indicator_plots 0
//=====================================================================
// Custom indicator initialization function
//=====================================================================
int OnInit ()
{
   return (INIT_SUCCEEDED);
}
//=====================================================================
// Custom indicator iteration function
//=====================================================================
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
   long n= 0 ;
   for ( int i= 0 ;i< 1 e+ 10 && ! IsStopped ();i++) {n++;}
   Print ( "OnCalculate End" );
   return (rates_total);
}

Bu göstergeyi grafikten çıkarmaya çalışırsanız, "göstergeyi hesaplama" işlemi bu şekilde durmaz,

program durdurma bayrağının kontrol edilmesi nedeniyle olması gerektiği halde.

Görev yöneticisinde terminal.exe işlemini izleyerek bunu kolayca öğrenebilirsiniz. Dört çekirdekli bir işlemcide

yaklaşık %25 CPU kullanımıdır. Ek olarak, terminal yükü kapatılana kadar zamanla hiç azalmaz.

terminal. Ve terminali kapattıktan sonra bile terminal.exe işlemi sevk programında asılı kalmaya devam eder. Ve sanki

işletim sistemi tarafından "asılı" olarak boşaltılır.


Beklenen Sonuç

Lütfen bu sorunu düzeltin.

 
barabashkakvn :

Bunu yapmak için, ilgilenilen gösterge çizgisi için ofset ayarlarını bilmeniz gerekir. Bu, iAlligator teknik göstergesinden bir örnektir

Bu tam olarak ofsettir ve gelecek için göstergenin hesaplanması değildir.

işte bu, ileride bir hesaplamam var ve çizmek için ofset uyguluyorum, uzmandan -1 bar değerleri nasıl hesaplanır ???

Herhangi birinin ihtiyacı varsa, bunu CopyBuffer'ı yapabilirsiniz(Handle_original,0,-2,10,Data_Ind )

 
dentraf :
İşte bu, ileride bir hesabım var ve çizmek için ofset uyguluyorum, uzmandan -1 bar değerleri nasıl hesaplanır ???
"-1" çubuğu için alıntılar mevcut değil. Ofset: MEVCUT bir çubuk için bir hesaplama (örneğin, çubuk numarası 2) ve ardından bu hesaplanan değer çubuk 2 eksi ofset üzerine çizilir. Onlar. ofset 5 ise, 2. çubukta hesaplanan değer "-3" çubuğuna çizilecektir.