CPU'yu yüklerken bu gecikmeleri atlamanın neden imkansız olduğunu tam olarak anlamıyorum. Büyük olasılıkla bu konuda beceriksiz.
Bununla birlikte, aşağıda MT5'teki fiyat verisi güncelliği sorununu gösteren temiz bir test bulunmaktadır. Kod yorumlandı. Kısacası, keneler SymbolInfoTick/DOM üzerinden alınır ve birbirleriyle kontrol edilir. Özellikle, boşluk olmaması ve farklı kaynaklardan gelen aynı tikler arasında büyük gecikmeler olmaması için.
// Демонстрация лагов OnTick и OnBookEvent.inputuint inMinInterval = 1000 ; // Минимальное время (в мкс.) лага// Структура тика, которую удобно будет выводить в ArrayPrint.struct PRICE
{
double bid;
double ask;
bool onTick; // true - источник OnTick+SymbolInfoTick, false - источник OnBookEvent+MarketBookGetulong Interval; // Временной интервал между соседними записями.void Set( constdouble &dBid, constdouble &dAsk, constbool bTick )
{
staticulong PrevTime = :: GetMicrosecondCount ();
constulong NewTime = :: GetMicrosecondCount ();
this .bid = dBid;
this .ask = dAsk;
this .onTick = bTick;
this .Interval = NewTime - PrevTime;
PrevTime = NewTime;
}
// Записи одинаковые, если обе соответствующие цены совпадают.booloperator ==( const PRICE &Price ) const
{
return (( this .bid == Price.bid) && ( this .ask == Price.ask));
}
};
PRICE Prices[ 1000 ]; // Массив для записи тиков из разных источников.int Amount = 0 ; // Количество записанных тиков// Возвращает bid/ask-цены из стакана.bool GetCurrentPrices( double &bid, double &ask )
{
MqlBookInfo Bands[];
constbool Res = MarketBookGet ( _Symbol , Bands);
if (Res)
for ( int i = ArraySize (Bands) - 2 ; i >= 0 ; i--)
if (Bands[i].type == BOOK_TYPE_SELL )
{
ask = Bands[i].price;
bid = Bands[i + 1 ].price;
break ;
}
return (Res);
}
// Если bid или ask стакана поменялся - записываем их.bool SaveNewTick_Book()
{
staticdouble PrevBid = 0 ;
staticdouble PrevAsk = 0 ;
double bid;
double ask;
constbool Res = ! IsStopped () && GetCurrentPrices(bid, ask) && ((PrevBid != bid) || (PrevAsk != ask));
if (Res)
{
PrevBid = bid;
PrevAsk = ask;
Prices[Amount++].Set(bid, ask, false );
if (Amount == ArraySize (Prices)) // Если достигли конца массива - выходим.ExpertRemove ();
}
return (Res);
}
// Записываем bid и askbool SaveNewTick_Tick()
{
MqlTick Tick;
constbool Res = ! IsStopped () && SymbolInfoTick ( _Symbol , Tick);
if (Res)
{
Prices[Amount++].Set(Tick.bid, Tick.ask, true );
if (Amount == ArraySize (Prices)) // Если достигли конца массива - выходим.ExpertRemove ();
}
return (Res);
}
// Проверка на наличие багов и задержек.void Check()
{
if (Amount > 3 )
{
if ((Prices[Amount - 1 ].onTick == Prices[Amount - 2 ].onTick) && // Три подряд записи из одного источника - баг.
(Prices[Amount - 2 ].onTick == Prices[Amount - 3 ].onTick))
Alert ( "BUG!" );
elseif ((Prices[Amount - 1 ] == Prices[Amount - 2 ]) && // Если цены подряд идущих записей совпадают
(Prices[Amount - 1 ].Interval > inMinInterval)) // И временной интервал между ними большой - информируем.
{
Alert ((Prices[Amount - 1 ].onTick ? "OnTick-lag! - " : "OnBook-lag! - " ) + ( string )Prices[Amount - 1 ].Interval + " mcs." );
ArrayPrint (Prices, _Digits , NULL , Amount - 4 , 4 ); // Выводим подробно проблему.
}
}
}
intOnInit ()
{
return (! MarketBookAdd ( _Symbol )); // Подписались на стакан.
}
voidOnBookEvent ( conststring &Symb )
{
if ((Symb == _Symbol ) && SaveNewTick_Book()) // Если записали новые цены из стакана,
Check(); // проверяем.
}
voidOnTick ()
{
if (SaveNewTick_Tick()) // Если записали цены тика,
Check(); // проверяем.
}
voidOnDeinit ( constint )
{
MarketBookRelease ( _Symbol ); // Отписались от стакана.ArrayPrint (Prices, _Digits , NULL , 0 , Amount); // Вывод всех записей.
}
Sonuç (makinede yalnızca bir MT5-b2656 çalışıyor, CPU yükü yaklaşık sıfır, bir tablo, Test Cihazı kullanılmıyor).
SymbolInfoTick frenler konusunu kapatıyorum. Sonuç şudur.
CPU yüklüyse (örneğin, optimizasyon tüm çekirdeklerde bile değilse), SymbolInfoTick birkaç on milisaniyeye kadar yürütülebilir. Terminalde neden bu en çok talep edilen işlev düzenli olarak anlık görüntülenmez - cevap yok. Mümkünse fotoğrafını çekin. Ve sıfır CPU yüküyle bile OnTick işlevinin Terminale gelen tick'ten onlarca milisaniye sonra çalışabileceğini unutmayın.
Genel olarak, oldukça üzücü, ancak ilkel ticaret yapanları endişelendiremez.
SymbolInfoTick frenler konusunu kapatıyorum. Sonuç şudur.
CPU yüklüyse (örneğin, optimizasyon tüm çekirdeklerde bile değilse), SymbolInfoTick birkaç on milisaniyeye kadar yürütülebilir. Terminalde neden bu en çok talep edilen işlev düzenli olarak anlık görüntülenmez - cevap yok. Mümkünse fotoğrafını çekin. Ve sıfır CPU yüküyle bile OnTick işlevinin Terminale gelen tick'ten onlarca milisaniye sonra çalışabileceğini unutmayın.
Genel olarak, oldukça üzücü, ancak ilkel ticaret yapanları endişelendiremez.
"İlkel olmayan" ticaret yapanlar için: demir, görevlere uygun olmalıdır.
"tüm çekirdeklerde bile değil" - "6/8" den mi bahsediyorsunuz? Onlar. 6 işlem ve her biri testin tamamı boyunca bir CPU çekirdeğinin %100'ünü kullanıyor mu? Ve sadece 4 fiziksel çekirdek mi var? Ve böyle bir arka plana karşı testin "yavaşlaması" konusunda samimi bir sürpriz mi?
Bu gerçekten sizin anlama seviyenizse, o zaman: "Çalışın, çalışın ve tekrar çalışın."
CPU'ya 16-20 iş parçacığında tecavüz etmek istiyorsunuz - en az 20 fiziksel çekirdekli bir CPU satın alın.
"İlkel olmayan" ticaret yapanlar için: demir, görevlere uygun olmalıdır.
"tüm çekirdeklerde bile değil" - "6/8" den mi bahsediyorsunuz? Onlar. 6 işlem ve her biri testin tamamı boyunca bir CPU çekirdeğini %100 kullanıyor mu? Ve sadece 4 fiziksel çekirdek mi var? Ve böyle bir arka plana karşı testin "yavaşlaması" konusunda samimi bir sürpriz mi?
Bu gerçekten sizin anlama seviyenizse, o zaman: "Çalışın, çalışın ve tekrar çalışın."
CPU'ya 16-20 iş parçacığında tecavüz etmek istiyorsunuz - en az 20 fiziksel çekirdekli bir CPU satın alın.
Uygulamanızda mevcut fiyatları almanın çok yavaş olduğunu kanıtlayabileceğime eminim. Ve CPU yükü, yalnızca MQL5'teki en önemli işlevi yanlış uygulamanız nedeniyle bu tür frenler yaratır.
Uygulamanızda mevcut fiyatları almanın çok yavaş olduğunu kanıtlayabileceğime eminim. Ve CPU yükü, yalnızca MQL5'teki en önemli işlevi yanlış uygulamanız nedeniyle bu tür frenler yaratır.
Bunu nasıl yapıyorsun?
Sadece 6/8 Ajan çalışırken frenleri yeniden ürettim.
Sadece 6/8 Ajan çalışırken frenleri yeniden ürettim.
Onlar. sorun, CPU yüklendiğinde.
MQ-Demo, 20 çizelge, b2656. Makinede sadece Terminal çalışıyor, Test Cihazı çalışmıyor.
Sadece 6/8 Ajan çalışırken frenleri yeniden ürettim.
Onlar. sorun, CPU yüklendiğinde.
Bu yeni bilgi sizin için mi?
Bu yeni bilgi sizin için mi?
CPU'yu yüklerken bu gecikmeleri atlamanın neden imkansız olduğunu tam olarak anlamıyorum. Büyük olasılıkla bu konuda beceriksiz.
Bununla birlikte, aşağıda MT5'teki fiyat verisi güncelliği sorununu gösteren temiz bir test bulunmaktadır. Kod yorumlandı. Kısacası, keneler SymbolInfoTick/DOM üzerinden alınır ve birbirleriyle kontrol edilir. Özellikle, boşluk olmaması ve farklı kaynaklardan gelen aynı tikler arasında büyük gecikmeler olmaması için.
Sonuç (makinede yalnızca bir MT5-b2656 çalışıyor, CPU yükü yaklaşık sıfır, bir tablo, Test Cihazı kullanılmıyor).
Lütfen oynatmayı onaylayın.
Hızlı boşaltılan bir makine için ara toplam.
Geliştiriciler için soru.
Diyelim ki SymbolInfoTick 5 ms sürdü. Kene geçerli saatle mi yoksa 5ms öncesiyle mi eşleşecek?
SymbolInfoTick frenler konusunu kapatıyorum. Sonuç şudur.
CPU yüklüyse (örneğin, optimizasyon tüm çekirdeklerde bile değilse), SymbolInfoTick birkaç on milisaniyeye kadar yürütülebilir. Terminalde neden bu en çok talep edilen işlev düzenli olarak anlık görüntülenmez - cevap yok. Mümkünse fotoğrafını çekin. Ve sıfır CPU yüküyle bile OnTick işlevinin Terminale gelen tick'ten onlarca milisaniye sonra çalışabileceğini unutmayın.
Genel olarak, oldukça üzücü, ancak ilkel ticaret yapanları endişelendiremez.
SymbolInfoTick frenler konusunu kapatıyorum. Sonuç şudur.
CPU yüklüyse (örneğin, optimizasyon tüm çekirdeklerde bile değilse), SymbolInfoTick birkaç on milisaniyeye kadar yürütülebilir. Terminalde neden bu en çok talep edilen işlev düzenli olarak anlık görüntülenmez - cevap yok. Mümkünse fotoğrafını çekin. Ve sıfır CPU yüküyle bile OnTick işlevinin Terminale gelen tick'ten onlarca milisaniye sonra çalışabileceğini unutmayın.
Genel olarak, oldukça üzücü, ancak ilkel ticaret yapanları endişelendiremez.
"İlkel olmayan" ticaret yapanlar için: demir, görevlere uygun olmalıdır.
"tüm çekirdeklerde bile değil" - "6/8" den mi bahsediyorsunuz? Onlar. 6 işlem ve her biri testin tamamı boyunca bir CPU çekirdeğinin %100'ünü kullanıyor mu? Ve sadece 4 fiziksel çekirdek mi var? Ve böyle bir arka plana karşı testin "yavaşlaması" konusunda samimi bir sürpriz mi?
Bu gerçekten sizin anlama seviyenizse, o zaman: "Çalışın, çalışın ve tekrar çalışın."
CPU'ya 16-20 iş parçacığında tecavüz etmek istiyorsunuz - en az 20 fiziksel çekirdekli bir CPU satın alın.
"İlkel olmayan" ticaret yapanlar için: demir, görevlere uygun olmalıdır.
"tüm çekirdeklerde bile değil" - "6/8" den mi bahsediyorsunuz? Onlar. 6 işlem ve her biri testin tamamı boyunca bir CPU çekirdeğini %100 kullanıyor mu? Ve sadece 4 fiziksel çekirdek mi var? Ve böyle bir arka plana karşı testin "yavaşlaması" konusunda samimi bir sürpriz mi?
Bu gerçekten sizin anlama seviyenizse, o zaman: "Çalışın, çalışın ve tekrar çalışın."
CPU'ya 16-20 iş parçacığında tecavüz etmek istiyorsunuz - en az 20 fiziksel çekirdekli bir CPU satın alın.
Uygulamanızda mevcut fiyatları almanın çok yavaş olduğunu kanıtlayabileceğime eminim. Ve CPU yükü, yalnızca MQL5'teki en önemli işlevi yanlış uygulamanız nedeniyle bu tür frenler yaratır.
Uygulamanızda mevcut fiyatları almanın çok yavaş olduğunu kanıtlayabileceğime eminim. Ve CPU yükü, yalnızca MQL5'teki en önemli işlevi yanlış uygulamanız nedeniyle bu tür frenler yaratır.
Test kodu:
İspat et.