Hatalar, hatalar, sorular - sayfa 2963

 
fxsaber :

Gösterge1 ve Gösterge2, her iki sayıyı tek bir ortak satırda yazabilmek için bir şekilde senkronize olmalıdır.

Bu çok zor bir karar olacak.

neden senkronize etsinler? user32.dll onlar için yapacak.
Onlar için asıl mesele, her birinin benzersiz bir numarası olacak şekilde doğru şekilde numaralandırılmaktır ve bu sayı veri dizisinin indeksidir.
Bu, son çare olarak manuel olarak yapılabilir. Ve belki otomatik. Bu arada, yakın zamanda KB'de benzer bir şey yayınladım ( Gösterge Kopyalar ), bir pencere için olsa da, onu tüm terminal için yeniden yapmak zor değil.
Kaynaklar hakkında sevilmeyen şey nedir? Bence, optimal olarak bir terminalin sınırları içinde. user32.dll üzerinden önerdiğim versiyonda (bu seçeneği 10 yıl önce, gençliğimde tahkim ile uğraşırken uygulamıştım), erişim ve veri ayrıştırma süresi yaklaşık 50 mikrosaniyedir (sanırım bunu 1.5 hızlandırabilirsiniz). -2 kez). Gerçekten kaynaklarla daha yavaş mı?

 
Nikolai Semko :

neden senkronize etsinler? user32.dll onlar için yapacak.

Yazmaya çalışın. Belki de sorunu tam olarak anlamadınız.

Kaynaklar hakkında sevilmeyen şey nedir? Bence, optimal olarak bir terminalin sınırları içinde. user32.dll üzerinden önerdiğim versiyonda (bu seçeneği 10 yıl önce, gençliğimde tahkim ile uğraşırken uygulamıştım), erişim ve veri ayrıştırma süresi yaklaşık 50 mikrosaniyedir (sanırım bunu 1.5 hızlandırabilirsiniz). -2 kez). Gerçekten kaynaklarla daha yavaş mı?

İdeal koşullar altında bir ev makinesinde okumak 100 mikrosaniye sürer. Bir Uzman Danışman, bir tıklamayı yüz kez okumayı tetikleyebilir. Yavaşça çıkar.

İdeal koşullar altında, GlobalVariableGet 10 µs'de tamamlanır. Ama bu bir gösterge değil, çünkü benim için yeni savaş koşullarında bu korkunç bir fren.

 
fxsaber :

Bu, HistoryTicks - Uzman Danışmanlar için tüm onay işaretlerini yakalıyor. Bu nedenle EventChartCustom uygun değil, kuyruk var. Tampon ile aynı.

EventChartCustom'da benim için çalışıyor. Onayların %99,8'i 0,15 ms içinde gelir

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

EventChartCustom => gösterge çok yavaş

Andrey Khatimliansky , 2019.12.12 09:27

İşte 5 araç üzerinde 9 saatlik çalışmanın istatistikleri:

Windows 8.1 (build 9600 ) x64, IE 11 , UAC, Intel Core i5- 3570   @ 3.40 GHz, Memory: 6979 / 16346 Mb, Disk: 341 / 499 Gb, GMT+ 2
[USDCHF]: 22784 of 22833 ( 99.8 %) ticks were processed ( 0.14 ms delay in average), 49 ( 0.2 %) ticks were skipped ( 103.4 ms delay in average)
[EURUSD]: 22944 of 22974 ( 99.9 %) ticks were processed ( 0.16 ms delay in average), 30 ( 0.1 %) ticks were skipped ( 115.6 ms delay in average)
[USDCAD]: 15331 of 15347 ( 99.9 %) ticks were processed ( 0.13 ms delay in average), 16 ( 0.1 %) ticks were skipped ( 104.6 ms delay in average)
[EURCHF]: 22516 of 22571 ( 99.8 %) ticks were processed ( 0.13 ms delay in average), 55 ( 0.2 %) ticks were skipped ( 127.8 ms delay in average)
[EURAUD]: 66842 of 66924 ( 99.9 %) ticks were processed ( 0.13 ms delay in average), 82 ( 0.1 %) ticks were skipped ( 117.8 ms delay in average)
[GBPUSD]: 41393 of 41393 ( 100.0 %) ticks were processed ( 0.00 ms delay in average)
Total trade requests time: 4.280 sec

EA, GBPUSD'ye dayanıyordu, bu nedenle yerel OnTick bunun için çalıştı.

"Gösterge çok yavaş" hatası yoktu.


Ancak MQ'nun VPS'sinde , hem kaçırılan kenelerin yüzdesi hem de ortalama gecikme çok daha yüksektir (istatistikleri biraz sonra yayınlayacağım).
Ve birçok "gösterge çok yavaş" hatası var.

EA birikmiş olayları anında işlediğinden (sadece geri döner) kuyruk taşmasının doğası net değildir.
Üzerinde çalışan başka biri var mı?


 
Andrey Khatimlianskii :

EventChartCustom'da benim için çalışıyor. Onayların %99,8'i 0,15 ms içinde gelir

Bunun aracılığıyla göstergeden keneler gönderirim: sparam MqlTick, lparam - kene numarası içerir.

OnChartEvent'teki Uzman Danışman bu işaretleri yakalar. Ve şimdi yakalanan kenenin en alakalı olup olmadığını anlaması gerekiyor mu? Onlar. tik sırası var mı yoksa boş mu?

Bunu yapmak için, gösterge tarafından gönderilen en son tick'in numarasını (görev bu numarayı okumaktır) okur. Yakalanan kene aynı numaraya sahipse sıra boştur ve bir grup kene devreye alınabilir.


OnTick işlemi sırasında, herhangi bir OrderSend freninden sonra, göstergenin daha fazla tick göndermediğinden emin olmanız gerekir. Bunu yapmak için, göstergedeki sayıyı tekrar okumanız gerekir. Ve bir OnTick'in yürütülmesi için bu tür yüzlerce kontrol olabilir. Bu yüzden hızlı okumanız gerekiyor.

 

1 terminal içinde, winpipe'daki en hızlı bellek ayırma (işlem içinde küresel) olacak ve https://docs.microsoft.com/ru-ru/windows/win32/api/winnt/nf-winnt- gibi birbirine bağlı işlevler aracılığıyla çalışacak. birbirine kenetlenmiş değiş tokuş

Bloke edici değildirler, atomiktirler ve esasen birkaç asm talimatında çalışırlar.

InterlockedExchange function (winnt.h) - Win32 apps
InterlockedExchange function (winnt.h) - Win32 apps
  • 2018.12.05
  • lastnameholiu
  • docs.microsoft.com
Sets a 32-bit variable to the specified value as an atomic operation.
 
traveller00 :

1 terminal içinde, winpipe'daki en hızlı bellek ayırma (işlem içinde küresel) olacak ve https://docs.microsoft.com/ru-ru/windows/win32/api/winnt/nf-winnt- gibi birbirine bağlı işlevler aracılığıyla çalışacak. birbirine kenetlenmiş değiş tokuş

Bloke edici değildirler, atomiktirler ve esasen birkaç asm talimatında çalışırlar.

Örneksiz yapmayacağım.

 
fxsaber :

Bunu yapmak için, gösterge tarafından gönderilen en son tick'in numarasını (görev bu numarayı okumaktır) okur. Yakalanan kene aynı numaraya sahipse sıra boştur ve bir grup kene devreye alınabilir.

OnTick işlemi sırasında, herhangi bir OrderSend freninden sonra, göstergenin daha fazla tick göndermediğinden emin olmanız gerekir. Bunu yapmak için, göstergedeki sayıyı tekrar okumanız gerekir. Ve bir OnTick'in yürütülmesi için bu tür yüzlerce kontrol olabilir. Bu yüzden hızlı okumanız gerekiyor.

Başlatma.

1. 1 iş parçacığında (büyük olasılıkla yazma), istenen boyutta bir değişken için herhangi bir şekilde bellek ayırın.

2. Bu belleğin adresini gerekli iş parçacıklarına (okuyuculara) gönderin.

Asıl iş.

3. Yazma dizisi, kendisine yazılacak değişkenin boyutuna bağlı olarak InterlockedExchange veya InterlockedExchange64'ü çeker.

4. Okuma akışı, örneğin okuma için InterlockedCompareExchange'i çeker.

tamamlama.

5. Ayrılan belleği , tercihen onu tahsis eden aynı iş parçacığında serbest bırakın.


Gerekirse, birkaç sayacın kurulması için tekrarlayabilirsiniz. Eksilerden bir WinAPI bağlantısı gereklidir. Özelliklerden, ayrılan belleğin adresi hizalanmalıdır, ancak varsayılan olarak bu genellikle böyledir.


1 işlem içinde çalışacaktır, bellek 1 işlemin iş parçacıkları tarafından paylaşılır. Gerekirse, InterlockedDecrement, InterlockedAdd ve benzeri gibi diğer kilitli işlevler vardır.

Fonksiyonlar bloke edici değildir, hiçbir şey beklemezler, otonomdurlar ve birkaç asm komutunda yürütülürler.


PS Genel olarak, hatırladığım kadarıyla, mov in assembler üzerinden olağan okuma ve yazma işlemleri zaten atomiktir. Ve derleyici bahçeyi çitlemiyorsa (ve teoride yapmaması gerekir), o zaman aptalca bir şekilde tahsis edilmiş bellekteki bir değişkeni okuyup yazmayı deneyebilirsiniz ve bu atomik olacaktır.

Görevin şartlarına uyuyorsa 1 işlemde daha hızlı yapılması pek olası değildir. İşlemler arası için en hızlısı benzer olacaktır, ancak paylaşılan hafıza ile bu durumda WinAPI vazgeçilmezdir.

 
fxsaber :

Bu şema çalışmıyor gibi görünüyor. Basit bir örnek gösterin lütfen.

Neden çalışmıyor? Bana sadece görevin altında görünüyor. Settor alıcı ilkesi.
Bir fonksiyon aracılığıyla gizli bir değişkenin değerini almak.
MqlTick yapısını geçerseniz, yapınızı MqlTick'in sahip olduğu gibi bir dizi alanla tanımlayın ve yapıya sayaç alanınızı ekleyin.
Ve bu yapıyı dışa aktarma işlevinden döndürün.
Bir gösterge için temel bir örnek. Senaryoda örneğin verilmiş olmasına dikkat etmeyin.

 struct myMqlTick 
{ 
   datetime      time;           // Время последнего обновления цен 
   double        bid;           // Текущая цена Bid 
   double        ask;           // Текущая цена Ask 
   double        last;           // Текущая цена последней сделки (Last) 
   ulong         volume;         // Объем для текущей цены Last 
   ulong         count;   //Свой счётчик
   
}myStruct;

//--------------------------------------------------
myMqlTick GetTickStruct() export
{
   
   return (myStruct);
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   myStruct.time   = 0.0 ;
   myStruct.bid    = 0.0 ;
   myStruct.ask    = 0.0 ;
   myStruct.last   = 0.0 ;
   myStruct.volume = 0 ;
   myStruct.count  = 1 ;   //свой счётчик  
  
}
//+------------------------------------------------------------------+

Expert Advisor'da GetTickStruct'u çağırıyorsunuz ve tüm yapıyı kendi sayacı ile elde ediyorsunuz.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура для получения текущих цен
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура для получения текущих цен
  • www.mql5.com
Структура для получения текущих цен - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman :

Expert Advisor'da GetTickStruct'u çağırıyorsunuz, tüm yapıyı kendi sayacı ile elde ediyorsunuz.

Lütfen bir göstergeden bir danışmana bir sayının temel transferini yazın.

 
fxsaber :

Lütfen bir göstergeden bir danışmana bir sayının temel transferini yazın.

Yapıyı bir değişkenle değiştirin))