[SERVICE DESK] Zamanlayıcıda kıdemli TF'nin zamanı alınırken hata oluştu! - sayfa 15

 
Taras Slobodyanik :

Göstergeniz veri güncellemelerini izlemiyor.
Komisyoncudan yeni çubuklar gelir, ancak onları kontrol etmezsiniz.
Kontrol edildiğinde her şeyin doğru görüntülendiğini göstermek için birkaç satır ekledim.

Bu bir çalışma durumu - yeni bir çubuğu kontrol etmek.

Evet sen ne! Ve sana yeni barları takip etmem gerektiğini düşündüren ne? Belgelerde var mı? Demek istediğim, işlevin değerini almalı ve sonra onu öncekiyle karşılaştırmalı mıyım? Bir fonksiyon var, fonksiyon daha yüksek zaman dilimlerinde çalışmak üzere tasarlandı. İşlev, verisi olmadığında bir hata verebilir veya geçersiz bir değer döndürebilir (bu durumda 0'a eşittir). Herşey. Programcılar %100 doğru bir değer elde etmek için bir şeyi çitle çevirmemelidir.

Ama bak SeriesInfoInteger() belgelerinde ne buldum:

Hata hakkında daha fazla bilgi almak için GetLastError() işlevini çağırmanız gerekir.

GetLastError() kodumda, gördünüz mü? İşte çek. Bu kontrol gerekli ve YETERLİ olmalıdır! Diğer her şey koltuk değneği çözümleri.
 
Alexey Kozitsyn :

Ve ilk mesajıma bakın. Orada 4066 hatasını görüyor musunuz? Ardından 0 hatası ve yanlış verilerin döndürülmesi. İşlev (bu durumda SeriesInfoInteger()) verileri göndermeden önce neden geçerliliğini kontrol etmiyor? Neden hata bayrağını kaldırmıyor? Görüyorsunuz, hataları daha sonra aramak yerine, dahili kontrollerin geçmesi için biraz daha beklemek daha iyidir.

Ancak ondan sonra, sonucun alınmadığı birçok tavsiye verildi. Ve zamanlayıcıda bile ortaya çıkmadı.

tamam, yardımı oku)

SeriBilgiTamsayı

Geçmiş verilerin durumu hakkında bilgi verir.

Tarihsel kelimesi ne anlama gelir?
Geçmiş yüklenirse, hata yoktur.


Alexey Kozitsyn :

Evet sen ne! Ve sana yeni barları takip etmem gerektiğini düşündüren ne? Belgelerde var mı? Demek istediğim, işlevin değerini almalı ve sonra onu öncekiyle karşılaştırmalı mıyım? Bir fonksiyon var, fonksiyon daha yüksek zaman dilimlerinde çalışmak üzere tasarlandı. İşlev, verisi olmadığında bir hata verebilir veya geçersiz bir değer döndürebilir (bu durumda 0'a eşittir). Herşey. Programcılar %100 doğru bir değer elde etmek için bir şeyi çitlememelidir.

Ama bak SeriesInfoInteger() belgelerinde ne buldum:

GetLastError() kodumda, gördünüz mü? İşte çek. Bu kontrol gerekli ve YETERLİ olmalıdır! Diğer her şey koltuk değneği çözümleri.

Hiçbir şey borçlu değilsin)
...aracı size güncellenmiş verileri gönderir - isterseniz, bunları hesaplama için kullanın, değilse - hangi sorunları, mevcut Geçmişe göre düşünün)


not. hafta sonu, piyasa kapalı , terminalde yanlış verileriniz var!
ve hata yok!!!

 
Taras Slobodyanik :

tamam, yardımı oku)

Tarihsel kelimesi ne anlama gelir?
Geçmiş yüklenirse, hata yoktur.


Hiçbir şey borçlu değilsin)
...aracı size güncellenmiş veriler gönderir - isterseniz, bunları hesaplama için kullanın, değilse - hangi problemler, Geçmişe göre sayın)

Terminale gelen her tik zaten tarih oluyor. Ve gerçek değerlerini veya bir hatasını almak istiyorum. Her şey size uyuyorsa - tamam.

 
Alexey Kozitsyn :

Terminale gelen her tik zaten tarih oluyor. Ve gerçek değerlerini veya bir hatasını almak istiyorum. Her şey size uyuyorsa - tamam.

Evet, tarih zaten yüklenmiş bir şeydir veya geçmişe yüklenmiş bir şeydir.
Ve sadece şimdi güncellenen (son alıntıdan sonra) henüz tarih değil, yeni ham verilerdir.

 
Taras Slobodyanik :

Çubukların hesaplanmasını değil, mumun zamanını kontrol edin.
Bu şekilde doğru bir şekilde güncellenecektir (işaretli).

Taras, işte kodunun sonucu:

 2018.10 . 08 11 : 11 : 39.080 test_isNewDayInOnCalculate GBPUSD,M1: initialized
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия недельного бара = 2018.09 . 30 00 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущей недели = 2018.10 . 01 00 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего дня = 2018.10 . 05 00 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего дня = 2018.10 . 05 00 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего часа = 2018.10 . 05 23 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего часа = 2018.10 . 05 23 : 00 . Ошибка # 0
2018.10 . 08 11 : 11 : 39.788 test_isNewDayInOnCalculate GBPUSD,M1: OnCalculate : Данные старших ТФ загружены!
 
Alexey Kozitsyn :

Taras, işte kodunun sonucu:

Evet, bu ilk kene, bitmiş hikayeyi veren, mevcut olan.
Bu onay işaretinden sonra ( yeni çubuklar varsa), kodumun değişkenlerinizi güncellediği ve doğru verileri gösterdiği ikinci onay hemen gelir.

not. yeni bir çubuğu kontrol etmek için kendi işlevinizi ekleyebilirsiniz, aynı olacaktır.

pps. Evde, sayı 1'den fazla değiştiyse, çubuk sayısını sürekli kontrol ediyorum, o zaman her şeyi yeniden hesaplamanız gerekir, sayı 1 değiştiyse, bu sadece yeni bir çubuk anlamına gelir. Ve sadece en kritik hataları kontrol ediyorum ve bu gecikme hatasını görmüyorum.

 
Taras Slobodyanik :

Evet, bu ilk kene, bitmiş hikayeyi veren, mevcut olan.
Bu onay işaretinden sonra ( yeni çubuklar varsa), kodumun değişkenlerinizi güncellediği ve doğru verileri gösterdiği ikinci onay hemen gelir.

not. yeni bir çubuğu kontrol etmek için kendi işlevinizi ekleyebilirsiniz, aynı olacaktır.

pps. Evde, sayı 1'den fazla değiştiyse, çubuk sayısını sürekli kontrol ediyorum, o zaman her şeyi yeniden hesaplamanız gerekir, sayı 1 değiştiyse, bu sadece yeni bir çubuk anlamına gelir. Ve sadece en kritik hataları kontrol ediyorum ve bu gecikme hatasını görmüyorum.

Ve burada, bu arada, bir hatanın meydana geldiği lehine başka bir argüman var. Göstergedeki hesaplamada bir HATA! Danışman yazdı:

 #property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _weekOpenTime = 0 ;
datetime _hourOpenTime = 0 ;
datetime _dayOpenTime= 0 ;
//--- Вести лог журнала
const bool inpFileLog= true ;
//--- Количество секунд в одном дне
const int SEC_PER_DAY= 86400 ;
//--- Флаг работоспособности индикатора
bool _isWorking= true ;
//--- Флаг соединения с торговым сервером (для таймера, получаем в OnCalculate())
bool _isConnected= false ;
//---
bool _firstLaunch = true ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   //--- Устанавливаем флаг первого запуска
   _firstLaunch = true ;
//--- Сбрасываем время открытия текущего часа, дня и недели
   _weekOpenTime= 0 ;
   _dayOpenTime = 0 ;
   _hourOpenTime= 0 ;
//--- Устанавливаем флаг работоспособности
   _isWorking= true ;
//--- Сбрасываем флаг установки соединения
   _isConnected= false ;
////--- Запускаем таймер
//   if(!EventSetMillisecondTimer(20))
//     {
//      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 не установлен!");
//      //--- Устанавливаем флаг неработоспособности индикатора
//      _isWorking=false;
//     }
//--- Запрос данных
   SeriesInfoInteger ( _Symbol , PERIOD_W1 , SERIES_LASTBAR_DATE );
   SeriesInfoInteger ( _Symbol , PERIOD_D1 , SERIES_LASTBAR_DATE );
   SeriesInfoInteger ( _Symbol , PERIOD_H1 , SERIES_LASTBAR_DATE );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                   |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
////--- Выключаем таймер
//   EventKillTimer();
  }
////+------------------------------------------------------------------+
////|                                                                  |
////+------------------------------------------------------------------+
//void OnTimer()
//  {
////---
//   if(!_isWorking)
//      return;
////---
//   if(!_isConnected)
//      return;
////---
//   Print(__FUNCTION__,": Данные старших ТФ загружены!");
////--- Отключаем таймер
//   EventKillTimer();
//  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
//--- Проверяем связь с сервером
   if (! IsConnected ())                               // Если не удалось установить связь с сервером
     {
       //--- Сбрасываем флаг соединения с сервером
      _isConnected= false ;
       //--- Выходим
       return ;
     }
         //--- Проверяем первый запуск эксперта
         if ( _firstLaunch )
                {
             //--- Проверяем, записано ли время открытия текущей недели
             if (!CheckCurrentWeekOpenTime())                               // Если время не записано
               return ;                                                 // Выходим
             //--- Проверяем, записано ли время открытия текущего дня
             if (!CheckCurrentDayOpenTime())                               // Если время не записано
               return ;                                                 // Выходим
             //--- Проверяем, записано ли время открытия текущего часа
             if (!CheckCurrentHourOpenTime())                               // Если время не записано
               return ;                                                 // Выходим
             ////--- Устанавливаем флаг соединения с сервером для запуска таймера
             //_isConnected=true;
             //---
             Print ( __FUNCTION__ , ": Данные старших ТФ загружены!" );
             //--- Сбрасываем флаг первого запуска
            _firstLaunch = false ;
                }
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущей недели             |
//+------------------------------------------------------------------+
bool CheckCurrentWeekOpenTime()
  {
//--- Проверяем, записано ли время
   if (_weekOpenTime== 0 ) // Если время не записано
     {
       //--- Получаем время открытия недельного бара
       ResetLastError ();
       const datetime weekBarOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_W1 , SERIES_LASTBAR_DATE );
       const int err= GetLastError ();
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Время открытия недельного бара = " + TimeToString (weekBarOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Проверяем, получено ли время открытия недельного бара
       if (weekBarOpenTime== 0 || err!= 0 ) // Если время бара не получено или история обновляется
         return ( false );                               // Возвращаем ложь
       //--- Запоминаем время открытия текущей недели (время открытия недельного бара - воскресенье)
      _weekOpenTime=weekBarOpenTime+SEC_PER_DAY;
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Актуальное время открытия текущей недели = " + TimeToString (_weekOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Возвращаем истину
       return ( true );
     }
//--- Время открытия недели ранее записано. Возвращаем истину
   return ( true );
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего дня                  |
//+------------------------------------------------------------------+
bool CheckCurrentDayOpenTime()
  {
//--- Проверяем, записано ли время
   if (_dayOpenTime== 0 ) // Если время не записано
     {
       //--- Получаем время открытия дневного бара
       ResetLastError ();
       const datetime tempDayOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_D1 , SERIES_LASTBAR_DATE );
       const int err= GetLastError ();
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Время открытия текущего дня = " + TimeToString (tempDayOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Проверяем, получено ли время открытия дневного бара
       if (tempDayOpenTime== 0 || err!= 0 ) // Если время бара не получено
         return ( false );                                 // Возвращаем ложь
       //--- Сохраняем в глобальную переменную значение открытия текущего дня
      _dayOpenTime=tempDayOpenTime;
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Актуальное время открытия текущего дня = " + TimeToString (_dayOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Возвращаем истину
       return ( true );
     }
//--- Время открытия дня ранее записано. Возвращаем истину
   return ( true );
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего часа              |
//+------------------------------------------------------------------+
bool CheckCurrentHourOpenTime()
  {
//--- Проверяем, записано ли время
   if (_hourOpenTime== 0 ) // Если время не записано
     {
       //--- Получаем время открытия часового бара
       ResetLastError ();
       const datetime tempHourOpenTime=( datetime ) SeriesInfoInteger ( _Symbol , PERIOD_H1 , SERIES_LASTBAR_DATE );
       const int err= GetLastError ();
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Время открытия текущего часа = " + TimeToString (tempHourOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Проверяем, получено ли время открытия часового бара
       if (tempHourOpenTime== 0 || err!= 0 ) // Если время бара не получено
         return ( false );                                 // Возвращаем ложь
       //---
      _hourOpenTime=tempHourOpenTime;
       //---
       if (inpFileLog)
        {
         Print ( __FILE__ , ": Актуальное время открытия текущего часа = " + TimeToString (_hourOpenTime)+ ". Ошибка #" ,err);
        }
       //--- Возвращаем истину
       return ( true );
     }
//--- Время открытия часа ранее записано. Возвращаем истину
   return ( true );
  }
//+------------------------------------------------------------------+

Gösterge ile aynı grafikten başlatılır. Sonuçları görelim:

 2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: OnTick : Данные старших ТФ загружены!
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущего часа = 2018.10 . 09 06 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия текущего часа = 2018.10 . 09 06 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущего дня = 2018.10 . 09 00 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия текущего дня = 2018.10 . 09 00 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Актуальное время открытия текущей недели = 2018.10 . 08 00 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 42.627 test_isNewDayInOnTick GBPUSD,M1: test_isNewDayInOnTick.mq4: Время открытия недельного бара = 2018.10 . 07 00 : 00 . Ошибка # 0
2018.10 . 09 08 : 45 : 41.479 test_isNewDayInOnTick GBPUSD,M1: initialized

2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentHourOpenTime: Время открытия текущего часа = 2018.10.08 11:00
2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentDayOpenTime: Время открытия текущего дня = 2018.10.08 00:00
2018.10.09 08:45:40.822	GBPUSD,M1: CheckCurrentWeekOpenTime: Время открытия текущей недели = 2018.10.08 00:00
2018.10.09 08:45:40.064	GBPUSD,M1: initialized

2018.10 . 09 08 : 45 : 40.022 Expert Other\test_isNewDayInOnTick GBPUSD,M1: loaded successfully

Ne görüyoruz. Her şeyin yolunda olduğunu görüyoruz. Her şey yüklendi ve dikkat edin, hata yok, hemen güncel veriler! Ana SORU: Neden bir Uzman Danışmanda normal olarak daha yüksek zaman dilimlerinin verilerini alabilirsiniz, ancak göstergede "tef ile dans etmeniz" gerekiyor? Programlar aynı şekilde çalışmamalı mı? Bir göstergede ve bir EA'da aynı kod neden farklı çalışıyor?! Böyle olmamalı.

 
Alexey Kozitsyn :

Ve burada, bu arada, bir hatanın meydana geldiği lehine başka bir argüman var. Göstergedeki hesaplamada bir HATA! Danışman yazdı:

Gösterge ile aynı grafikten başlatılır. Sonuçları görelim:

Ne görüyoruz. Her şeyin yolunda olduğunu görüyoruz. Her şey yüklendi ve dikkat edin, hata yok, hemen güncel veriler! Ana SORU: Neden bir Uzman Danışmanda normal olarak daha yüksek zaman dilimlerinin verilerini alabilirsiniz, ancak göstergede "tef ile dans etmeniz" gerekiyor? Programlar aynı şekilde çalışmamalı mı? Bir göstergede ve bir EA'da aynı kod neden farklı çalışıyor?! Böyle olmamalı.

Yükleme, kontrol vb. ile bağlantı kurmak ve bir şeyler yapmak terminale bağlı olduğundan, tüm göstergeler aynı iş parçacığındadır ve iş parçacığındaki her şey bitene kadar (aslında, bir sonraki OnCalculate çağrısına kadar), yeni bir şey olmaz. , yani Bu akışın içinde, akışın sonundan daha hızlı olarak, yine de hiçbir şey elde edemezsiniz. Uzman Danışman kendi iş parçacığında bulunur, bu nedenle başlatıldığında, veri güncellemeleri, verileri güncelleme süresi boyunca lansmanını ertelemesine izin verilir - terminaldeki diğer her şey etkilenmez. Doğumdan itibaren bu hiçbir şekilde düzeltilemez, çünkü. metatrader4 ortamı gömüldü.

 
Unicornis :

Yükleme, kontrol vb. ile bağlantı kurmak ve bir şeyler yapmak terminale bağlı olduğundan, tüm göstergeler aynı iş parçacığındadır ve iş parçacığındaki her şey bitene kadar (aslında, bir sonraki OnCalculate çağrısına kadar), yeni bir şey olmaz. , yani Bu akışın içinde, akışın sonundan daha hızlı olarak, yine de hiçbir şey elde edemezsiniz. EA kendi iş parçacığında bulunur, bu nedenle başlatıldığında, veri güncellemeleri, verileri güncelleme süresi boyunca lansmanını ertelemesine izin verilir - terminaldeki diğer her şey etkilenmez. Doğumdan itibaren bu hiçbir şekilde düzeltilemez, çünkü. metatrader4 ortamı gömüldü.

Evet, bir sembolün tüm göstergelerinin tek bir iş parçacığında olduğunun ve her Uzman Danışmanın kendi iş parçacığına sahip olduğunun farkındayım. Ama mesele bu değil. Geliştiriciler - kreasyonlarındaki hataları düzelten geliştiricilerdir. Programlar farklı çalışmamalı! Göstergelerin bir şey yapmak için zamanı yoksa - bir hata ve sorun yok. Sonuçta, uzman bir şekilde doğru verileri hatasız olarak aldı! Yani uygulanabilir. @Slava , bariz hatalı davranışın düzeltilip düzeltilmeyeceği konusunda yorum yapabilir misiniz? Ya da en azından belgelere bir ek (önceki_hesaplanmış = 0 ise, eski zaman dilimlerinin doğru verileri elde edilemez)?

 
Alexey Kozitsyn :

Evet, bir sembolün tüm göstergelerinin tek bir iş parçacığında olduğunun ve her Uzman Danışmanın kendi iş parçacığına sahip olduğunun farkındayım. Ama mesele bu değil. Geliştiriciler - kreasyonlarındaki hataları düzelten geliştiricilerdir. Programlar farklı çalışmamalı! Göstergelerin bir şey yapmak için zamanı yoksa - bir hata ve sorun yok. Sonuçta, uzman bir şekilde doğru verileri hatasız olarak aldı! Yani uygulanabilir. @Slava , bariz hatalı davranışın düzeltilip düzeltilmeyeceği konusunda yorum yapabilir misiniz? Ya da en azından belgelere bir ek (önceki_hesaplanmış = 0 ise, eski zaman dilimlerinin doğru verileri elde edilemez)?

Belgelerde bir yerde, uzmana veri almaya başlamadan önce 5 saniye kadar süre verildiği ve şu anda terminalin uzman için veri indirmeye çalıştığı söylendi. Bu, göstergeye verilmez, göstergenin bir geçmiş güncellemesi talep etmemesi gerektiği gibi, onun için kritik değildir, kritikse bir Uzman Danışmanda değerlendirin. Ana fikir, mevcut uygulamada istenen durumun mümkün olmadığıdır. Özünde, TF'ler zamanlayıcılardır ve bu çoklu zamanlayıcıların bir anda çakıştığı dönemler vardır - bu %100 eşzamanlı eşzamanlı bir süreçtir (açma/kapama zamanı hariç), çünkü. mevcut TF'nin dakikasının ilk işareti, beş dakikalık, saat, vb.'nin ilk dakikasına denk geliyor. - bu sadece birkaç değişkende aynı değerin bir kaydıdır ve bu anlarda gerekli TF'leri ayarlayabilmeniz ve gerekli tüm verileri bir kerede alabilmeniz mantıklıdır. Geliştiriciler bunu neden yaptı, aksi halde xs değil, belki de istemci-sunucu ayrımı nedeniyle, bunu mevcut terminal modelinde yapmak imkansızdı (olacak), çünkü Şimdi göstergelere uzmanların imkanını verirsek, terminali asacaklar.

Gösterge çağrısının nasıl çalıştığını merak edenler için günün sonuna bakabilirsiniz, gösterge başka bir göstergeyi çağırır, Uzman Danışman (_asktfexp) göstergeyi (_asktf_sample) çağırarak göstergeyi (_asktf) çağırır. Bir Uzman Danışmandan bir gösterge çağrıldığında, göstergedeki zamanlayıcı başlamaz, bu nedenle göstergede bir zamanlayıcı bulunan çözümler yalnızca bu göstergenin yalnızca grafikte asılı kalacağı ve çağrılmayacağı durumlar içindir (bu genellikle mantıklıdır) ).

Dosyalar:
Neden: