Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 33

 
Artyom Trishkin :

Bir seçim 0 döndürebilir. BCS çarpıştı.

Evet, sahtekar komisyoncular. Hala negatif sayıları oraya doldururlardı.

Brokerler semboller oluşturduğunda geliştiricilerin her parametre için olası değer aralığı üzerinde bir sınırı olsaydı iyi olurdu.

 
Artyom Trishkin :

Tam olarak yanlış olan nedir? Kulağa gelen soru buydu - yerel olmayan bir zaman diliminden gösterge verilerini almak için neyi yanlış yapıyorum?

Örnek: gösterge M1'de başlatılır ve AO'dan gelen veriler M5'ten alınmalıdır. Yani - sınırımız> 1 iken (geçmişi yeniden hesaplamamız gerekiyor), o zaman M5'li AO, veri eksikliği hatasıyla sıfırları döndürür. Tüm geçmiş hesaplanır hesaplanmaz (limit==0), M5 ile AO'dan gelen veriler gelmeye başlar.

Yeni başlayanlar için, bunun gibi girişler yapmanız gerekmez:

periodForWork=PeriodForWork;

İlk başta bir değişkene kendi değerini atadığınızı düşündüm.

Daha ileri:

size_ao= CopyBuffer (handle_ao, 0 , 0 ,count,array_ao);

Başlatma sırasında kopyalamanız gerekmez. Başlatma bunun için değil. Ayrıca, OnInit()'ten istek sırasında henüz hesaplanmamış olan eski TF'lerden veri istenirken bu kayıt bir anlam ifade etmeyecektir.

 ArraySetAsSeries (BufferAO, true );

Ancak bu giriş, başlatma aşamasında yalnızca bir kez yapılması yeterlidir.

Ayrıca... um... öznel olarak, yanlış yapardım.

Programı bölmeyi seviyorum:

1. İlk lansman (geçmiş analizi);

2. Sonraki lansmanlar:

2.1. Her kene;

2.2. Oluşan çubuk;

Onlar:

 if ( prev_calculated > 0 )             // Не первый запуск
{
 if ( rates_total <= prev_calculated ) // Новый бар не сформирован
  {
  }
 else                                  // Новый бар сформирован
  {
  }
}
else                                    // Первый запуск
{
}

Ve sadece sonra - hesaplamaların ana döngüsü (fonksiyonu).

Kopyalama işlevleri size bilgi vermeyen hatalar verir. Bu sadece kod - gerçekten değil.

Kıdemli TF'nin verilerinin senkronizasyon kontrolü yoktur.

Ve burada en önemli şey sırayı anlamaktır. İlk başlangıçta yalnızca eski zaman diliminin verilerini talep etmesi ve kopyalamanın nasıl gerçekleştiğini anlaması için bir test göstergesi oluşturmanızı tavsiye ederim. Onlar. bunu kodun başından kaldırın:

 ArraySetAsSeries (array_ao, true );

Ve dizinin ilk ve son elemanının çıktısını alın. Ve ancak o zaman gerekirse, indeksleme yönünü değiştirin.

 
Genel olarak, bununla başlayın:
 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input    ENUM_TIMEFRAMES inpTimeframe= PERIOD_M5 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int _handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   _handle= iAO ( _Symbol ,inpTimeframe);
   if (_handle== INVALID_HANDLE )
     {
       Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), "! Хэндл индикатора iAO ТФ " + EnumToString (inpTimeframe)+ " не получен!" );
       return ( INIT_FAILED );
     }
//---
   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[])
  {
//--- Массив-приемник значений индикатора
   double ao[];
//---
   if (prev_calculated> 0 )
     {

     }
   else                                          // Если первый запуск
     {
       //--- Количество просчитанных баров старшего ТФ
       int bars;
       if (( bars= BarsCalculated (_handle))< 0 || !( bool ) SeriesInfoInteger ( _Symbol ,inpTimeframe, SERIES_SYNCHRONIZED ))
         return ( 0 );
       //--- 
       int num= CopyBuffer (_handle, 0 , 0 ,bars,ao);
       //---
       if (num< 0 )
        {
         Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": Запрашиваемая таймсерия еще не построена!" );
         return ( 0 );
        }
       else if (num!=bars)
        {
         Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": Скопированы не все данные (" ,num, " из " ,bars, ")" );
         return ( 0 );
        }
       //---
       Print ( __FUNCTION__ , ": Успех! Скопировано " ,num, " из " ,bars, " значение индикатора АО ТФ " + EnumToString (inpTimeframe));
     }
//---
   return ( rates_total );
  }
//+------------------------------------------------------------------+
 
Alexey Kozitsyn :

Yeni başlayanlar için, bunun gibi girişler yapmanız gerekmez:

İlk başta bir değişkene kendi değerini atadığınızı düşündüm.

Daha ileri:

Başlatma sırasında kopyalamanız gerekmez. Başlatma bunun için değil. Ayrıca, OnInit()'ten istek sırasında henüz hesaplanmamış olan eski TF'lerden veri istenirken bu kayıt bir anlam ifade etmeyecektir.

Ancak bu giriş, başlatma aşamasında yalnızca bir kez yapılması yeterlidir.

Ayrıca... um... öznel olarak, yanlış yapardım.

Programı bölmeyi seviyorum:

1. İlk lansman (geçmiş analizi);

2. Sonraki lansmanlar:

2.1. Her kene;

2.2. Oluşan çubuk;

Onlar:

Ve sadece sonra - hesaplamaların ana döngüsü (fonksiyonu).

Kopyalama işlevleri size bilgi vermeyen hatalar verir. Bu sadece kod - gerçekten değil.

Kıdemli TF'nin verilerinin senkronizasyon kontrolü yoktur.

Ve burada en önemli şey sırayı anlamaktır. İlk başlangıçta yalnızca eski zaman diliminin verilerini talep etmesi ve kopyalamanın nasıl gerçekleştiğini anlaması için bir test göstergesi oluşturmanızı tavsiye ederim. Onlar. bunu kodun başından kaldırın:

Ve dizinin ilk ve son elemanının çıktısını alın. Ve ancak o zaman gerekirse, indeksleme yönünü değiştirin.

Değişkenleri bir bakışta anlayacağım şekilde yapıyorum. Anlamıyorsun - anlaman için onları yap;)

Genel olmayan değişkenleri her zaman küçük bir harfle yazmaya başlarım - nedeni basit: büyük/küçük harfe duyarlı zeka ...

Bu test kodudur, çünkü bir test kodu değildir, yeterince büyüktür ve tf'yi değiştirirken MT4'te uçar ve veri eksik hatası yoktur - her şey her zaman oradadır. MT5'te, tf'yi değiştirirken, geçmişi yalnızca yarım dakika yükler ve daha sonra kendi olmayan bir tf'nin verileriyle de çalışmaz - onların yokluğundan bahseder.

Bu yüzden neyi yanlış yaptığımı tartışmak için gündeme getirdim. İnternetteki tüm kullanılmış TF'ler hakkında veri istemeniz gerektiği ortaya çıktı. Tahmini kullanılan TF'lerin sayısı önceden bilinmiyorsa, hepsini talep etmeniz gerektiğini düşünüyorum. Yarım dakika için sadece bir tane sayılır. Sadece 21 tane var...

Yine düşündüğüm bir şey değil mi?

 
Artyom Trishkin :

MT5'te, tf'yi değiştirirken, geçmişi yalnızca yarım dakikalığına yükler


bunun hakkında yazdı

я правильно понимаю тогда, что подготовив кэш,терминал при последующих обращениях (начиная со 2 обращения) затрачивает на порядки меньше времени?

можно ли как-то уменьшить время первого обращения после перезагрузки терминала,чтобы было как в МТ 4 ?
Теперь выводы:

    Разница только в скорости начальной инициализации кеша чарта 0.6 мс МТ 4 против 113 мс у МТ 5

daha fazla ayrıntı burada

https://www.mql5.com/en/forum/1111/page1871#comment_4866969

https://www.mql5.com/ru/forum/1111/page1871#comment_4867939

öyle ve olacak. ne kadar fazla TF veya karakter istenirse, o kadar fazla fren başlangıcı olur.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus :


bunun hakkında yazdı

daha fazla ayrıntı burada

https://www.mql5.com/en/forum/1111/page1871#comment_4866969

https://www.mql5.com/ru/forum/1111/page1871#comment_4867939

öyle ve olacak. ne kadar fazla TF veya karakter istenirse, o kadar fazla fren başlangıcı olur.

Evet, göstergenin sadece ilk başlangıcında olsa iyi olurdu. Şimdilik, zaman dilimini her değiştirdiğimde, geçmiş yarım dakikalığına yükleniyor. Bunun olmaması gerektiğini anlıyorum, ama... Yanlış bir şey yapıyorum ya da başka bir şey... Ve sadece bir göstergede bu - yerel olmayan bir zaman dilimine erişmeye çalışıyorum.
 
Artyom Trishkin :
Evet, göstergenin sadece ilk başlangıcında olsa iyi olurdu. Şimdilik, zaman dilimini her değiştirdiğimde, geçmiş yarım dakikalığına yükleniyor. Bunun olmaması gerektiğini anlıyorum, ama... Yanlış bir şey yapıyorum ya da başka bir şey... Ve sadece bir göstergede bu - yerel olmayan bir zaman dilimine erişmeye çalışıyorum.

Peki, başka bir TF'den veri kopyalama hızını ölçün ve darboğazın nerede olduğunu görün.
 
Artyom Trishkin :

Hesaplamalar için farklı zaman dilimlerinden birkaç gösterge kullanmanız gerekiyorsa, her bir zaman dilimini ele almanız gerekir.

Her şeyin daha hızlı hesaplanmasını istiyorsanız, terminaldeki geçmişin boyutunu küçültün.

Test göstergemi çalıştırdın mı? Veriler toplanıyor mu?

 
Alexey Kozitsyn :

Hesaplamalar için farklı zaman dilimlerinden birkaç gösterge kullanmanız gerekiyorsa, her bir zaman dilimini ele almanız gerekir.

Her şeyin daha hızlı hesaplanmasını istiyorsanız - terminaldeki geçmişin boyutunu küçültün.

Test göstergemi çalıştırdın mı? Veriler toplanıyor mu?

Hayır, henüz başlamadı.

TÜM zaman dilimlerine ihtiyaç duyulursa, AO göstergesinin 21 tanıtıcısını oluşturmanız gerektiği ortaya çıktı. Bu israf değil mi?

 
Artyom Trishkin :

Hayır, henüz başlamadı.

TÜM zaman dilimlerine ihtiyaç duyulursa, AO göstergesinin 21 tanıtıcısını oluşturmanız gerektiği ortaya çıktı. Bu israf değil mi?

Ve istenen karakterden / TF'den başka nasıl veri alınır? CopyBuffer yalnızca tutamaçlarla çalışır.