Hatalar, hatalar, sorular - sayfa 2794

 
Mihail Matkovskij :

Nedense, göstergem grafik nesneleri kaybetmeye başladı ve onları silmiyor. Sınıf yıkıcıda otomatik silme kullanıyorum. Ararım:

Sonuç olarak, yanlış alıyorum. GetLastError()'u çağırıyorum ve 4101 hatası alıyorum ("Yanlış grafik kimliği "). Diyelim ki... Kaldırılan grafik nesnesinin chartID'sini ChartID() işlevinin sonucuyla karşılaştırıyorum ve bunlar tamamen aynı. Nesnenin grafikten silinmemesinin nedeni ne olabilir ve nasıl atlanabilir?

Farklı bir şey denemeye karar verdi. Oluşturma sırasında tüm grafik nesnelerini listeye ekliyorum ve göstergeyi silerken bir döngü kullanarak tüm nesneleri siliyorum. Şimdi GetLastError() işlevi, ObjectDelete işlevini çağırdıktan sonra 4001 hatası veriyor ve bazı grafik nesneleri hala grafikte kalıyor.

 
Mihail Matkovskij :

Nedense, göstergem grafik nesneleri kaybetmeye başladı ve onları silmiyor. Sınıf yıkıcıda otomatik silme kullanıyorum. Ararım:

Sonuç olarak, yanlış alıyorum. GetLastError()'u çağırıyorum ve 4101 hatası alıyorum ("Yanlış grafik kimliği "). Diyelim ki... Kaldırılan grafik nesnesinin chartID'sini ChartID() işlevinin sonucuyla karşılaştırıyorum ve bunlar tamamen aynı. Nesnenin grafikten silinmemesinin nedeni ne olabilir ve nasıl atlanabilir?

Bu hatanın oluştuğu kaynağı yaptım:
 //+------------------------------------------------------------------+
//|                                           DeleteChartObjects.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version    "1.00"
#property indicator_chart_window

#property indicator_plots 0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

#include <ChartObjects\ChartObjectsLines.mqh>
#include <Arrays\ArrayObj.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- input parameters
input int       nBars = 100000 ;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int customN_Bars = 0 ;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CArrayObj listOfTrendLines;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit () {
//--- indicator buffers mapping
   int totalBars = iBars ( NULL , PERIOD_CURRENT );
  customN_Bars = (nBars < totalBars) ? nBars : totalBars;
//---
   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[]
) {
  CChartObjectTrend * trend;
   int delta = rates_total - customN_Bars;
   int shift;
   int i;
   for (i = 0 ; i < customN_Bars; i++) {
    shift = delta + customN_Bars - i - 1 ;
    trend = new CChartObjectTrend();
     if (trend.Create( 0 , "trend" +( string )i, 0 , time[shift], low[shift], time[shift], high[shift]))
      listOfTrendLines.Add(trend);
  }
   return (rates_total);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason) {
  
  CChartObjectTrend * trend;
  
   int i = listOfTrendLines.Total() - 1 ;
   for (; i >= 0 ; i--) {
    trend = dynamic_cast <CChartObjectTrend *> (listOfTrendLines.At(i));
    
     if ( CheckPointer (trend) == POINTER_INVALID )
       continue ;
    
     delete trend;
  }
}
//+------------------------------------------------------------------+

Hatayı göstermek için eylemler.

1. Göstergeyi tablonun üzerine bırakın.

2. Göstergeyi tablodan çıkarın.

3. Ctrl+B'ye basın, ardından penceredeki "Tümünü listele" düğmesine basın ve silinmemiş nesneleri görün.

nesneler

100.000'den 294'üm kaldı.

nBars giriş parametresinin değerini düşürürseniz, hata görünmez.

Dosyalar:
 

Güzel gün.

Uzun bir süre Windows 7'den 10'a geçişle lastik çektim, ancak bir hafta içinde yeniden yükledim.

Şimdi bir sorunum var, kendimin ve başkalarının göstergelerinin Expert Advisors demo sürümünü indiremiyorum,

İndirme düğmesine tıklıyorum ve hiçbir şey olmuyor, terminal açık ve kapalıyken denedim!?

MT4 terminali için indirmeye çalışıyorum, henüz MT5'i ziyaret etmedim.

Ne oluyor be?

 
Mihail Matkovskij :
Bu hatanın oluştuğu kaynağı yaptım:

Bir işaretçi silindiğinde ne olur?

 //+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason) {
  
  CChartObjectTrend * trend;
  
   int i = listOfTrendLines.Total() - 1 ;
   for (; i >= 0 ; i--) {
    trend = dynamic_cast <CChartObjectTrend *> (listOfTrendLines.At(i));
    
     if ( CheckPointer (trend) == POINTER_INVALID )
       continue ;
    
     delete trend;
  }
}

Grafik nesnesini silmek için grafiklere bir komut var mı? ObjectDelete ile ilgili nota bakın

Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
При вызове ObjectDelete() всегда используется асинхронный вызов, поэтому функция возвращает только результат постановки команды в очередь графика. В этом случае true означает только то, что команда успешно поставлена в очередь, сам результат её выполнения неизвестен. Для проверки результата выполнения можно использовать функцию ObjectFind() или...
 
Mihail Matkovskij :

Elimde 100.000'den 294'ü kaldı.

nBars giriş parametresinin değerini düşürürseniz, hata görünmez.

Döngünün OnDeinit uygulaması için ayrılan süreden daha uzun sürmesi mümkün değil mi?

Sonuçta, örneğinizde tüm nesneler "trend" önekine sahiptir, neden bundan yararlanıp döngüden vazgeçmiyorsunuz?

 int    ObjectsDeleteAll (
   long            chart_id,   // идентификатор графика
   const string      prefix,   // префикс имени объекта
   int        sub_window=- 1 ,   // индекс окна
   int       object_type=- 1      // тип объекта для удаления
   );
 
Rashid Umarov :

Bir işaretçi silindiğinde ne olur?

Grafik nesnesini silmek için grafiklere bir komut var mı? ObjectDelete ile ilgili nota bakın

Bu notu kesinlikle daha önce düşünmüştüm. Ama sonra nedense bunun bir terminal hatası olduğuna karar verdim. Bunun için özür dilerim. Benim hatam olduğu ortaya çıktı.

Ama bu durumda ne yapacağımı bilmiyorum. ObjectDelete'i ve ardından ObjectFind'i çağırın ve nesnenin gerçekten silinip silinmediğini öğrenmek için tamamlanmasını bekleyin. Aynı nota göre, bu çok zaman alıcıdır. Ve tekrarlanan silmenin işe yarayıp yaramayacağını bilmiyorum (göstergemde, arka arkaya iki kez ObjectDelete'i aramaya çalıştım ve boşuna). Ve göstergelerdeki Uyku işlevi, çizelgeye her bir nesneyi kaldırması için biraz zaman vermek için çalışmaz. Belki bir yerlerde bunun nasıl aşılacağına dair örnekler vardır?

 
Alexey Viktorov :

Döngünün OnDeinit uygulaması için ayrılan süreden daha uzun sürmesi mümkün değil mi?

Sonuçta, örneğinizde, tüm nesneler "trend" önekine sahiptir, neden bundan yararlanıp döngüden vazgeçmiyorsunuz?

Bu sadece bir örnek. Üzerinde çalıştığım göstergede isimler oldukça karmaşık. Ve sadece gösteri için bir örnek yaptım.

 
Mihail Matkovskij :

Bu notu kesinlikle daha önce düşünmüştüm. Ama sonra nedense bunun bir terminal hatası olduğuna karar verdim. Bunun için özür dilerim. Benim hatam olduğu ortaya çıktı.

Ama bu durumda ne yapacağımı bilmiyorum. ObjectDelete'i ve ardından ObjectFind'i çağırın ve nesnenin gerçekten silinip silinmediğini öğrenmek için tamamlanmasını bekleyin. Aynı nota göre, bu çok zaman alıcıdır. Ve tekrarlanan silmenin işe yarayıp yaramayacağını bilmiyorum (göstergemde, arka arkaya iki kez ObjectDelete'i aramaya çalıştım ve boşuna). Ve göstergelerdeki Uyku işlevi, çizelgeye her bir nesneyi kaldırması için biraz zaman vermek için çalışmaz. Belki bir yerlerde bunun nasıl aşılacağına dair örnekler vardır?

Bence listedeki tüm işaretçileri ekleyin. Terminal alt sisteminin kendisi, CArrayObj listesinde bulunan işaretçiler gibi nesneleri siler.

trend = new CChartObjectTrend();
     if (trend.Create( 0 , "trend" +( string )i, 0 , time[shift], low[shift], time[shift], high[shift]))
      listOfTrendLines.Add(trend);
Burada potansiyel bir bellek sızıntısı var. Ve geçersiz bir nesneye olası bir çağrı.
 
Artyom Trishkin :
Bence listedeki tüm işaretçileri ekleyin. Terminal alt sisteminin kendisi, CArrayObj listesinde bulunan işaretçiler gibi nesneleri siler.

Terminal tamamlandıktan sonra, grafikteki nesneler göstergeden sonra kalır. Ve terminali tekrar başlattığımda bu nesneler görünüyor ve tüm görünümü bozuyor.

 
Mihail Matkovskij :

Terminal tamamlandıktan sonra, grafikteki nesneler göstergeden sonra kalır. Ve terminali tekrar başlattığımda bu nesneler görünüyor ve tüm görünümü bozuyor.

Örneğinizi test etmek için bilgisayarımda değilim. Yukarıdaki yazımı yanlışlıkla gördüklerime ekledim.
Neden: