Eklenen geçmiş gerçek olanla karşılaştırılırsa, COPY_TICKS_ALL modunda tutarsızlıklar var (TİCARET ve BİLGİ - sorun değil). danışman
Sonuç
Yukarıdaki kodu yoğun bir şekilde günlüğe kaydetti ve nedenlerini çözdü. CopyTicks (> 0'dan) en sonuncusundan önce işaretler alırsa, bazılarını atlayabilir.
Misal.
= 2016.09.29 11:05:55.564 ile istenen onay işaretleri. Yanıt olarak üç onay aldı
Kene geçmişini parçalar halinde toplarsanız, gerçek tarihle örtüşmeyebileceği ortaya çıkıyor. Danışman onu gösteriyor.
#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280long LastTime = 0 ; // time_msc-время последнего тика (самого свежего), полученного из историиint Count = 0 ; // Количество тиков в последенем запросе, у которых time_msc == LastTime// Возвращает следующие тики (после предыдущего вызова)int GetFreshTicks( MqlTick &Ticks[], constuint flags = COPY_TICKS_TRADE , constuint count = 100000 )
{
int Res = 0 ;
MqlTick NewTicks[];
constint NewAmount = CopyTicks ( Symbol (), NewTicks, flags, LastTime, count);
if ((NewAmount > 0 ) && (Count < NewAmount))
{
Res = ArrayCopy (Ticks, NewTicks, 0 , Count);
// Взяли крайнее время из текущей истории
LastTime = Ticks[Res - 1 ].time_msc;
Count = 1 ;
// Находим (Count) в текущей истории количество тиков со временем LastTimefor ( int i = Res - 2 ; i >= 0 ; i--)
{
if (Ticks[i].time_msc < LastTime)
break ;
Count++;
}
}
return ( ArrayResize (Ticks, Res));
}
// Сравнение двух массивовtemplate < typename T>
bool ArrayEqual( const T &Array1[], const T &Array2[] )
{
constint Amount = MathMin ( ArraySize (Array1), ArraySize (Array2));
bool Res = (Amount > 0 );
if (Res)
for ( int i = 0 ; i < Amount; i++)
if (_R(Array1[i]) != Array2[i]) // https://www.mql5.com/ru/code/16280
{
Res = false ;
ExpertRemove ();
break ;
}
return (Res);
}
voidOnTick ()
{
// возьмем тики с начала утренней сессии
Count = 0 ;
LastTime = ( TimeCurrent () - ( TimeCurrent () % ( 24 * 3600 ))) * 1000 ;
MqlTick Ticks[]; // История, собранная по частямMqlTick NewTicks[]; // массив для следующей части тиков// Собираем историю по частям while (GetFreshTicks(NewTicks, COPY_TICKS_TRADE , 100000 ) > 0 )
ArrayCopy (Ticks, NewTicks, ArraySize (Ticks));
if ( ArraySize (Ticks) > 0 )
{
// Взяли ВСЮ историю тиковPrint ( CopyTicks ( _Symbol , NewTicks, COPY_TICKS_TRADE , Ticks[ 0 ].time_msc, 10000000 )); // 10000000 - большое число, чтобы все выкачать.// Проверка на совпадение собранной по частям истории с самой историейPrint (ArrayEqual(NewTicks, Ticks) ? "Equal" : "Not Equal" );
}
}
Sonuç
2016.09 . 3016 : 02 : 54.661 Test (Si- 12.16 ,M1) Not Equal
2016.09 . 3016 : 02 : 54.661 Test (Si- 12.16 ,M1) ExpertRemove () function called2016.09 . 3016 : 02 : 54.621 Test (Si- 12.16 ,M1) 3337402016.09 . 3016 : 02 : 54.121 Test (Si- 12.16 ,M1) Equal
2016.09 . 3016 : 02 : 54.071 Test (Si- 12.16 ,M1) 3337362016.09 . 3016 : 02 : 53.791 Test (Si- 12.16 ,M1) Equal
2016.09 . 3016 : 02 : 53.741 Test (Si- 12.16 ,M1) 333723
Bu EA hala zayıf bir hata gösteriyor. Parçalar halinde toplanan tarihte, parçaların eksik olabileceğini ve birkaç dakika sürebileceğini öğrendim. Kod şeklinde sadece özlü ve anlaşılır bir çoğaltma ile gelmedim. Ve zor olanı ortaya koymak - mantıklı değil çünkü. kimse bakmayacak bile.
Genel olarak, CopyTicks hatalarını yenmenin bir yolu yoktur. Ve EA'nın bant modunda (COPY_TICKS_TRADE) çalıştığını unutmayın. Onlar. Bir bantla bile çalışmak imkansızdır.
Bugün demoda yeni bir yapı vaat ediyorlar. Yani beklerken.
Umarım CopyTicks() düzeltilir.
Bu arada, CopyTicks()'in ortaya çıkışından bu yana, geliştiriciler geliştiricilerden diğer Copy...() işlevleri gibi işlev aşırı yüklemeleri eklemelerini istiyor. Ekleyeceklerini söylediler. Ve sessizlik...
Bu arada, CopyTicks()'in ortaya çıkışından bu yana geliştiriciler, geliştiricilerden diğer Copy...() işlevleri gibi aşırı işlev yüklemeleri eklemelerini istiyor. Ekleyeceklerini söylediler. Ve sessizlik...
Herhangi bir aşırı yükü kendiniz ekleyebilirsiniz.
YALNIZCA bant gerekliyse (COPY_TICKS_TRADE - time_msc, last, volume ve flags), bu çözüm tamamen uygundur - hiçbir hata bulunamadı.
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
Gizemli hisse senedi göstergesi
fxsaber , 2016.09.27 18:32
Görünüşe göre, CopyTicks'teki girdi sıfır olmadığında tüm frenler.
Son çağrıdan bu yana onaylar istense bile, bu modda CopyTicks'in çok çarpık bir uygulaması gibi görünüyor. Uçması gerekiyor gibi görünüyor, ama hayır.
Onaylar ve DOM güncellemelerinde bir dizi iyileştirme yaptığımız bu hafta betayı bekleyin.
1432 - birçok hata çözüldü. Teşekkür ederim!
Fakat hepsi değil.
Eklenen geçmiş, gerçek olanla karşılaştırılırsa, COPY_TICKS_ALL modunda tutarsızlıklar var (TİCARET ve BİLGİ - sorun değil). danışman
Sonuç
Fakat hepsi değil.
Eklenen geçmiş gerçek olanla karşılaştırılırsa, COPY_TICKS_ALL modunda tutarsızlıklar var (TİCARET ve BİLGİ - sorun değil). danışman
Sonuç
Yukarıdaki kodu yoğun bir şekilde günlüğe kaydetti ve nedenlerini çözdü. CopyTicks (> 0'dan) en sonuncusundan önce işaretler alırsa, bazılarını atlayabilir.
Misal.
= 2016.09.29 11:05:55.564 ile istenen onay işaretleri. Yanıt olarak üç onay aldı
Bir süre sonra, uzaktan bir onay geçmişi talep ediyorum ve CopyTicks'in daha önce kaçırdığı bir onay işareti görüyorum
İşte böyle bir hata!
Kene veritabanına paralel yazma ve ondan okuma bir tür çatışma gibi görünüyor.
Kene geçmişini parçalar halinde toplarsanız, gerçek tarihle örtüşmeyebileceği ortaya çıkıyor. Danışman onu gösteriyor.
Sonuç
Bu EA hala zayıf bir hata gösteriyor. Parçalar halinde toplanan tarihte, parçaların eksik olabileceğini ve birkaç dakika sürebileceğini öğrendim. Kod şeklinde sadece özlü ve anlaşılır bir çoğaltma ile gelmedim. Ve zor olanı ortaya koymak - mantıklı değil çünkü. kimse bakmayacak bile.
Genel olarak, CopyTicks hatalarını yenmenin bir yolu yoktur. Ve EA'nın bant modunda (COPY_TICKS_TRADE) çalıştığını unutmayın. Onlar. Bir bantla bile çalışmak imkansızdır.
Artık tüm COPY_TICKS_* modlarında başka bir hata
Hem belirli bir andan başlayarak hem de belirli, örneğin sabit bir miktarda kene almaya çalıştınız mı?
Koddan, son andan itibaren belirli bir miktar (100000) gibi görünüyor. Ve eğer sadece N kene alırsanız. Geçişler olacak mı?
Hemen söylemeliyim ki, kendim şimdiye kadar tiklerle fazla denemedim ...
Hem belirli bir andan başlayarak hem de belirli, örneğin sabit bir miktarda kene almaya çalıştınız mı?
Koddan, son andan itibaren belirli bir miktar (100000) gibi görünüyor. Ve eğer sadece N tik alırsanız. Geçişler olacak mı?
Hemen söylemeliyim ki, kendim şimdiye kadar tiklerle fazla denemedim ...
Sınanmış.
Bugün demoda yeni bir yapı vaat ediyorlar. Yani beklerken.
Sınanmış.
Bugün demoda yeni bir yapı vaat ediyorlar. Yani beklerken.
Umarım CopyTicks() düzeltilir.
Bu arada, CopyTicks()'in ortaya çıkışından bu yana, geliştiriciler geliştiricilerden diğer Copy...() işlevleri gibi işlev aşırı yüklemeleri eklemelerini istiyor. Ekleyeceklerini söylediler. Ve sessizlik...
Bu arada, CopyTicks()'in ortaya çıkışından bu yana geliştiriciler, geliştiricilerden diğer Copy...() işlevleri gibi aşırı işlev yüklemeleri eklemelerini istiyor. Ekleyeceklerini söylediler. Ve sessizlik...