Özel semboller. Hatalar, hatalar, sorular, öneriler. - sayfa 27

 
Stanislav Korotky :

Boş bir yeni özel sembole bire bir keneler eklemek (özellikle, MQ Demo'daki EURUSD'den) 5310 hatası verir (hemen değil, rastgele bir tarihten itibaren geçiş döngüsünde).

Sorun nedir? Hangi kenelere yemin ettiğini nasıl öğrenebilirim? Günlükte görüntülenen diziler - kronoloji ihlali yoktur.

Keneleri kopyalamak için bir çek eklemeyi deneyin.
Kene işlemedeki gerçek zamanlı veriler için göstergemde, CopyClose kopyalanırken bazen bir kopyalama hatası oluşur.
Sebebinin ne olabileceğini anlayana kadar. Belki sizin durumunuzda bir kopyalama hatası vardır.

Yine de CopyTicks'te birçok Limit işareti kopyalarsınız ve sonra bunu while döngüsünde çalıştırırsınız, yani her yinelemede çok sayıda işaret kopyalarsınız.
Ve CustomTicksAdd'de aynı sayıda dizi işaretini iletirsiniz.
Bir onay işareti kopyalamayı ve bir onay işareti iletmeyi deneyin.
Bir süre döngüsünde koşuyorsun.

 input int Limit = 10000 ;
input datetime Start = D'2020.06.01' ;

int fillArray( ulong &_start)
{
   MqlTick array[];
   int size = CopyTicks ( _Symbol , array, COPY_TICKS_ALL , _start, Limit );

   if (size <= 0 ) 
  {
     Print ( "Ошибка копирования ценовых данных " + _Symbol + " " +( string )size+ " " , GetLastError ());
     return (size);
  }

   if (size > 0 )
  {
    _start = array[size - 1 ].time_msc + 1 ;
     if ( CustomTicksAdd (symbolName, array ) == - 1 )
    {
       Print ( "Error:" , GetLastError ());
       return (- 1 );
    }
  }
   return (size);
}

...
{
   ulong startMsc = ( ulong )Start * 1000 ;
   while (fillArray(startMsc) > 0 );
}
Katma. Özel semboller için geçerli değildir.
Az önce göstergede, gerçek zamanlı olarak, CopyClose işlevi tarafından M5 periyoduyla kopyalama hatasının nedenini yakaladım.
İnternet bağlantısı birkaç saniyeliğine kesildi ve bağlantı göründükten sonra 4401 kopya hatası çıktı İstenen geçmiş bulunamadı
Biraz garip, iletişim yokken, M5 dönemi henüz yeni bir çubuğa geçmedi ve bir hata ortaya çıktı.
 
Roman :

Keneleri kopyalamak için bir çek eklemeyi deneyin.
Kene işlemedeki gerçek zamanlı veriler için göstergemde, CopyClose kopyalanırken bazen bir kopyalama hatası oluşur.
Sebebinin ne olabileceğini anlayana kadar. Belki sizin durumunuzda bir kopyalama hatası vardır.

Yine de CopyTicks'te birçok Limit işareti kopyalarsınız ve sonra bunu while döngüsünde çalıştırırsınız, yani her yinelemede çok sayıda işaret kopyalarsınız.
Ve CustomTicksAdd'de aynı sayıda dizi işaretini iletirsiniz.
Bir onay işareti kopyalamayı ve bir onay işareti iletmeyi deneyin.

Kopyalama hatası yoktur, kod kopyalanan onay sayısı (boyut) için normal bir değer verir, dizi her zaman normal verilerle doldurulur. Limit değiştirilebilir, ancak bir ile birkaç bin arasında herhangi bir anlamlı değer için bir hata oluşur. Tüm keneleri bir kerede kopyalamak (bazı kodlarda olduğu gibi) açıkça yanlıştır, çünkü bu bir bellek ayırma hatasına neden olabilir ve kullanıcıya ilerlemeyi gösteremeden diziyi uzun süre bloke edebilir. Kenelerin 10'luk küçük gruplar halinde kopyalanması (1'den bahsetmiyorum bile) - tüm süreci çok yavaşlatır - kabul edilemez.

Önerilen seçenek en iyisidir. Ve bu birisi için tartışmalı bir nokta olsa bile, kod resmi olarak doğrudur (veya bana hatamın ne olduğunu söyleyin) ve mevcut davranış bir hatadır, yani. keneler 5310 kodu olmadan eklenmelidir.

Ayrıca, kene veritabanının temizlenmesiyle ilgili uzun süredir devam eden bir sorun var. CustomTicksDelete(symbolName, 0, LONG_MAX); tüm keneleri silmek istemez ve birkaç tane bırakır (sürekli değil, yaklaşık olarak her seferinde gözlenir). Expert Advisor'ı yeniden başlatırsanız özel sembol tamamen temizlenir. CopyTicks örneğinde olduğu gibi - hata yok.

 
Daha fazla OnTick olayı oluşturmadan tik yazmanız gerekiyorsa, farklı bir işlev kullanmak daha iyi olabilir.
 
Stanislav Korotky :

Belki paketlerin kavşağında aynı ms'ye sahip keneler vardır ve bu bir hata olarak kabul edilir?

Sadece bir tahmin

 
Andrey Khatimlianskii :

Belki paketlerin kavşağında aynı ms'ye sahip keneler vardır ve bu bir hata olarak kabul edilir?

Sadece bir tahmin

Kod , yinelenen keneler olduğunu gösterir. Bu durumda, temel onay işaretleri eşleşmeyebilir.

 
fxsaber :
Daha fazla OnTick olayı oluşturmadan tik yazmanız gerekiyorsa, farklı bir işlev kullanmak daha iyi olabilir.

Kabul ediyorum. Deneyeceğim. Ancak şu anki yolun çalışmaması için hiçbir neden göremiyorum.

 
Stanislav Korotky :

Kopyalama hatası yoktur, kod kopyalanan onay sayısı (boyut) için normal bir değer verir, dizi her zaman normal verilerle doldurulur. Limit değiştirilebilir, ancak bir ile birkaç bin arasında herhangi bir anlamlı değer için bir hata oluşur. Tüm keneleri bir kerede kopyalamak (bazı kodlarda olduğu gibi) açıkça yanlıştır, çünkü bu bir bellek ayırma hatasına neden olabilir ve kullanıcıya ilerlemeyi gösteremeden diziyi uzun süre bloke edebilir. Kenelerin 10'luk küçük gruplar halinde kopyalanması (1'den bahsetmiyorum bile) tüm süreci çok yavaşlatır.

Önerilen seçenek en iyisidir. Ve bu birisi için tartışmalı bir nokta olsa bile, kod resmi olarak doğrudur (veya bana hatamın ne olduğunu söyleyin) ve mevcut davranış bir hatadır, yani. keneler 5310 kodu olmadan eklenmelidir.

Ayrıca, kene veritabanının temizlenmesiyle ilgili uzun süredir devam eden bir sorun var. CustomTicksDelete(symbolName, 0, LONG_MAX); tüm keneleri silmek istemez ve birkaç tane bırakır (sürekli değil, yaklaşık olarak her seferinde gözlenir). Expert Advisor'ı yeniden başlatırsanız özel sembol tamamen temizlenir. CopyTicks örneğinde olduğu gibi - hata yok.

ERR_CUSTOM_TICKS_WRONG_ORDER

5310

Sipariş edilmemiş   zaman dizisine göre   keneler


Onayların büyük gruplar halinde zamanında kaldırılmama olasılığı vardır, ancak bir sonraki yinelemede zaten mevcut olanların üzerine yazıyorsunuz.
Yani, bir dizide birbirlerinin üzerine bindirilirler, gecikmeden uçarken, görünüşe göre başka bir paket gelmeden önce belleğin temizlenmesi için zaman yok.
Bu nedenle, her seferinde bir onay işareti eklemeyi önerdi, her seferinde bir onay işareti kopyaladım, sorun olmadı.

Onay tabanını temizlemeye gelince, bu durumda LONG_MAX sabitini sevmiyorum.
CustomTicksDelete işlevinin yardımı, silinecek belirtilen aralıktaki fiyat geçmişindeki son tik zamanı diyor. 01/01/1970 tarihinden itibaren milisaniye cinsinden süre.
Ve LONG_MAX bu kapasiteden çok daha büyük. Yani, bu parametrenin tasarlanmamış olduğu daha büyük bir değer iletilir.
Milisaniyeye karşılık gelen bir sayı yani 13 değer kullanmaya çalışın.

 
fxsaber :

Kod , yinelenen keneler olduğunu gösterir. Bu durumda, temel onay işaretleri eşleşmeyebilir.

CopyTicks alma dizisinde çift keneler mi var? Bunların aynı keneler değil, yinelenen keneler olduğu nasıl anlaşılır (kenelerin benzersiz tanımlayıcıları yoktur)? Kopyalar olsa bile, fikir, eşit kesimlere sahip kenelerin diziyi bozmamasıdır. Son olarak, soru ortaya çıkıyor - kopyalar nasıl oluşuyor?

 
Roman :

ERR_CUSTOM_TICKS_WRONG_ORDER

5310

Sipariş edilmemiş   zaman dizisine göre   keneler


Onayların büyük gruplar halinde zamanında kaldırılmama olasılığı vardır, ancak bir sonraki yinelemede zaten mevcut olanların üzerine yazıyorsunuz.
Yani, bir dizide birbirlerinin üzerine bindirilirler, gecikmeden uçarken, görünüşe göre başka bir paket gelmeden önce belleğin temizlenmesi için zaman yok.
Bu nedenle, her seferinde bir onay işareti eklemeyi önerdi, her seferinde bir onay işareti kopyaladım, sorun olmadı.

Silme sorunu yoktur, hiçbir şeyin üzerine yazılmaz. Yinelemeler, kesişmeler olmadan zamanda ilerler. Her zaman boş bir özel sembolde - ya yeni ya da tüm onayların başarıyla silinmesinden sonra.

 
Stanislav Korotky :

CopyTicks alma dizisinde çift keneler mi var? Bunların aynı keneler değil, yinelenen keneler olduğu nasıl anlaşılır (kenelerin benzersiz tanımlayıcıları yoktur)? Kopyalar olsa bile, fikir, eşit kesimlere sahip kenelerin diziyi bozmamasıdır. Son olarak, soru ortaya çıkıyor - kopyalar nasıl oluşuyor?

Koda daha dikkatli baktım. Parçaları alırken keneleri atlarsınız. Durum olası Ticks[Limit - 1].time_msc == Ticks[Limit + k], k >= 0 .

Buna göre boşluk bırakarak eklediğinizde bayraklar eşleşmeyebilir.


Bölümün sonunda aynı zamana sahip tüm geçmiş kenelerin bulunduğundan emin olun. Onlar. böylece bir sonraki bölümün başlangıcı farklı bir zamanla oldu. Aksi takdirde, custom'a yazarken bile kayıplar olacaktır.

CopyTicks'i kullanmak istiyorsanız, o zaman en kolay yol, alınan paketten en uzun süreye sahip en aşırı keneleri atmaktır. Ve _start'ı bu zamana eşit yapın.