MT5 ve iş başında hız - sayfa 2

 
fxsaber :

Lütfen bu fikrin temel bir şema kodunu sağlayın. İlk bakışta, tam bir yanlış anlama gibi geliyor.

OnMain işlevinin yürütülmesi sırasında, mevcut gerçek kuyruğun durumunu bilmenin bir yolu yoktur . Bunu yapmak için tek geçici çözüm, bağlantıda bahsettiğim gibi bir casus programdır.

En basit haliyle:

OnXXX( параметры )
{
        запомнить параметры (поместить в очередь)
        OnMain();
}
On2XX( параметры )
{
/*вычисления*/
        поменять приоритет обработки событий (если нужно)
/*вычисления*/
        промежуточный return (если нужно) 
/*вычисления*/
}
void OnMain()
{
        прочитать приоритет обработки событий
        для каждой группы событий
                извлечь параметры из очереди
                OnTradeXXX( параметры )
                удалить событие из очереди
}

Sadece hesaplamalara yönelik yaklaşımı değiştirmeniz gerekir (görev gerektirdiği sıklıkta bir ara dönüş yapın). Ama eğer zorsa, 1. aşamada OnMain'in sizin için olmadığını düşünün (ana kodu sırasıyla OnMain'e değil, On2XX'e aktarırsınız), OnMain'de hiçbir şey öğrenmenize gerek yoktur.

 
A100 :

Koltuk değneklerini yanlış yönde yapıyorsun:

OnXXX işlevlerinde yalnızca kuyruktaki olayları (parametreleri) kopyalayarak ve ana OnMain işlevini çağırarak bırakın. Tüm kodlarını yinelenen On2XX işlevlerine taşıyın. Ve bu yinelenen On2XX işlevlerini OnMain'den ihtiyacınız olan sırayla çağırın, sırayla bunları kuyruklardan parametre olarak iletin

Ardından, ölçümler yapın - hızdaki kazancı gösterin ve ardından MQL'yi uygun işlevsellik ile desteklemeyi önermek zaten mümkün olacaktır. Ama her şeyi burada ve şimdi zaten yaptıysanız neden ek?!

Bunun hakkında yazmıyorsun.
Sorun, "OntaredeTransaction" işlevinin giriş değişkenlerindeki alanları doldurma işlevselliğinin, daha kötüsü için, Yardım'da verilen açıklamaya karşılık gelmemesidir:
onlar. aramalarda ve son aramada bile TRADE_TRANSACTION_HISTORY_ADD'de birçok alan doldurulmaz.
Buna göre, tüm tüccarlar, varış anında bu eksik parametreleri bir şekilde belirlemek için burada sıkıntı çekiyor.
Burada pek çok tartışma vardı, sadece forumda bir arama yapın - "OntaredeTransaction"ın çarpık işlevselliği ek üretir. işleme maliyetleri. hem zaman hem de "yükler" açısından algoritmik tüccarlar, yeterince çalışan bir kod geliştirmeye harcanan ekstra zamana sahiptir (yani, tüm topluluk düzeyinde büyük zaman kaybı ve devasa verimsizlik).
Şu anda geliştiricilerin abonelikten çıkmaları, "Simgeye göre Piyasa yürütmeniz varsa, o zaman sıfır fiyat değeri olacaktır; öyle olmalıdır." ( Bağlantı ) - bu yine NORMAL DEĞİL -
son fonksiyon çağrılarında ayrıntılı değerlerin olmaması bir çok ekstraya yol açar. işçilik maliyetleri.

Новая версия платформы MetaTrader 5 build 2450: Сервис "Подписки", улучшения в интерфейсе и удобные функции в MetaEditor
Новая версия платформы MetaTrader 5 build 2450: Сервис "Подписки", улучшения в интерфейсе и удобные функции в MetaEditor
  • 2020.05.18
  • www.mql5.com
В пятницу 22 мая 2020 года будет выпущена обновленная версия платформы MetaTrader 5...
 
fxsaber :

GeçmişSeçin.


Bu delicesine pahalı bir özellik. Ve ne yazık ki, hiçbir önbelleğe alma, çalışma hızını şu anda kabul edilebilir hale getiremez.


Örneğin, muharebe danışmanlarında güncel verilerle çalışmak önemlidir. Özellikle, Market Watch ve CopyTicks'teki işaretler mümkün olduğunca güncel olmalıdır.

Bunu yapmak için, mevcut fiyat verilerinin uygunluğunu kontrol etmek için çok iyi değil, zorunlu mekanizmalar vardır. Böyle bir mekanizmanın parçalarından biri, bir sembol üzerinde bir anlaşmanın son onay işaretinden sonra geçtiği durumların tespitidir. Bu nadiren olmaz, bu nedenle mevcut tik işaretinin hala alakalı olup olmadığını bilmek önemlidir.


Bu tür bir tespit için, son işlemlerin geçmişine erişebilmeniz gerekir. Bu, aşağıdaki şematik şekilde HistorySelect aracılığıyla yapılır.


Ne yazık ki, böyle bir HistorySelect çağrısı 5-30 milisaniye sürer (Bunu Release-EX5'te kendim ölçtüm). OnTick'teki Expert Advisor'da bu tür birkaç güncelleme yapıldığında (iyi bir şekilde, herhangi bir duraklamadan sonra yapılmalıdır. Örneğin, her OrderSend'den sonra), o zaman her şey delicesine pahalı / uzun olur. HistorySelect, bir OnTick'te toplamda birkaç saniye yiyebilir.


Sevgili geliştiriciler, neden bu kadar pahalı? Bu işlev, düzgün bir şekilde uygulanırsa anlık olabilir.

" HistorySelect'e yapılan böyle bir çağrının 5-30 milisaniye sürdüğüne" dair kanıtınız var mı?

Fikrinizi doğru anlarsam, test kodu şöyle görünmelidir:

 void OnStart ()
  {
   MqlTick Tick;
   SymbolInfoTick ( _Symbol , Tick);
   ulong start= GetMicrosecondCount ();
   for ( int i= 0 ; i< 100000 ; i++)
     {
       HistorySelect (Tick.time, INT_MAX );
     }
   ulong end= GetMicrosecondCount ()-start;
   Print (" 100000 HistorySelect = ", DoubleToString (end/ 1000.0 , 2 )," ms");
  }

100.000 istek şu şekilde işlenir:

 100000 HistorySelect = 141.63 ms
 
Anton :

" HistorySelect'e yapılan böyle bir çağrının 5-30 milisaniye sürdüğüne" dair kanıtınız var mı?

Fikrinizi doğru anlarsam, test kodu şöyle görünmelidir:

100.000 istek şu şekilde işlenir:

Peki ya bir istek? Derleyici optimize ederken tam da bunu yaparsa şaşırmam)))
 
Anton :

" HistorySelect'e yapılan böyle bir çağrının 5-30 milisaniye sürdüğüne" dair kanıtınız var mı?

Fikrinizi doğru anlarsam, test kodu şöyle görünmelidir:

100.000 istek şu şekilde işlenir:

Komut dosyanızı çalıştırma.

         100000 HistorySelect = 19493.96 ms


Başka bir komut dosyası çalıştırın.

 #define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{
   if ( HistorySelect ( 0 , INT_MAX ))
  {
    PRINT( HistoryDealsTotal ());
    PRINT( HistoryOrdersTotal ());
  }
}


 HistoryDealsTotal () = 17828
HistoryOrdersTotal () = 22142


Normal savaş puanı. HFT değil.


Not Bu arada, komut dosyanız HistorySelect'in her seferinde her şeyi yeniden hesapladığını gösterdi. Ancak giriş parametreleri değişmedi, geçmiş tablosu güncellenmedi, diğer HistorySelect işlevleri çağrılmadı.

 
fxsaber :

Komut dosyanızı çalıştırma.

O yüzden detaylara ihtiyaç var.

Testim, arka planda çalışan birçok başka işlemle yavaş bir "Intel Xeon E5-2630 v4 @ 2.20GHz" üzerinde gerçekleştirildi.

Test hesabında, 2009'dan bu yana, bugün 8 sipariş de dahil olmak üzere, aşağı yukarı eşit olarak geçmişte 31315 sipariş vardı.

Belki de aynı anda terminalin temellerini büyük ölçüde yükleyen bir komut dosyası veya Uzman Danışman çalışıyordu. "Temiz" bir terminalde deneyin.

Daha bilgilendirici test:

 void OnStart ()
  {
   MqlTick Tick;
   SymbolInfoTick ( _Symbol , Tick);
//---   
   ulong start= GetMicrosecondCount ();
   int count= 100000 ;
   for ( int i= 0 ; i<count; i++)
     {
       HistorySelect (Tick.time, INT_MAX );
     }
   ulong end= GetMicrosecondCount ()-start;

   Print (count, " HistorySelect = " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
   Print ( "Selected = " , HistoryOrdersTotal ());
//---   
   Tick.time=(Tick.time/ 86400 )* 86400 ;
   
   start= GetMicrosecondCount ();
   count= 1000 ;
   for ( int i= 0 ; i<count; i++)
     {
       HistorySelect (Tick.time, INT_MAX );
     }
   end= GetMicrosecondCount ()-start;

   Print (count, " HistorySelect = " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
   Print ( "Selected = " , HistoryOrdersTotal ());
//---   
   HistorySelect ( 0 , INT_MAX );
   Print ( "Selected = " , HistoryOrdersTotal ());
  }

Üç lansman:

 2020.05 . 29 13 : 53 : 14.281 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 141.76 ms
2020.05 . 29 13 : 53 : 14.281 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05 . 29 13 : 53 : 14.284 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.82 ms
2020.05 . 29 13 : 53 : 14.284 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05 . 29 13 : 53 : 15.566 TestHistorySelect (EURUSD,H1)   Selected = 31315
2020.05 . 29 13 : 53 : 16.930 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 138.30 ms
2020.05 . 29 13 : 53 : 16.930 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05 . 29 13 : 53 : 16.933 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.61 ms
2020.05 . 29 13 : 53 : 16.933 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05 . 29 13 : 53 : 18.176 TestHistorySelect (EURUSD,H1)   Selected = 31315
2020.05 . 29 13 : 53 : 22.217 TestHistorySelect (EURUSD,H1)   100000 HistorySelect = 142.94 ms
2020.05 . 29 13 : 53 : 22.217 TestHistorySelect (EURUSD,H1)   Selected = 0
2020.05 . 29 13 : 53 : 22.220 TestHistorySelect (EURUSD,H1)   1000 HistorySelect = 2.57 ms
2020.05 . 29 13 : 53 : 22.220 TestHistorySelect (EURUSD,H1)   Selected = 8
2020.05 . 29 13 : 53 : 23.498 TestHistorySelect (EURUSD,H1)   Selected = 31315
 
Anton :

O yüzden detaylara ihtiyaç var.

Testim, arka planda çalışan birçok başka işlemle yavaş bir "Intel Xeon E5-2630 v4 @ 2.20GHz" üzerinde gerçekleştirildi.

Test hesabında, 2009'dan bu yana, bugün 8 sipariş de dahil olmak üzere, aşağı yukarı eşit olarak geçmişte 31315 sipariş vardı.

Belki de aynı anda terminalin temellerini büyük ölçüde yükleyen bir komut dosyası veya Uzman Danışman çalışıyordu. "Temiz" bir terminalde deneyin.

Aynı hesap ve makinede Boş Terminal.

         100000 HistorySelect = 19367.01 ms


Resim diğer hesaplarda ve Terminallerde benzer. Yapılandırma.

 2020.05 . 29 13 : 53 : 44.766 Terminal        ICMarkets - MetaTrader 5 x64 build 2453 started for International Capital Markets Pty Ltd.
2020.05 . 29 13 : 53 : 44.766 Terminal        Windows 7 Service Pack 1 build 7601 , Intel Core i7- 2700 K  @ 3.50 GHz, 6 / 15 Gb memory, 4 / 29 Gb disk, IE 11 , Admin, GMT+ 2


Okuyuculardan bu betiğin sonuçlarını sağlamaları istenir.

 void OnStart ()
{
   // https://www.mql5.com/ru/forum/342090/page2#comment_16607997
#define PRINT(A) Print ( #A + " = " + ( string )(A))
  
   if ( HistorySelect ( 0 , INT_MAX ))
  {
    PRINT( HistoryDealsTotal ());
    PRINT( HistoryOrdersTotal ());
  }

   // https://www.mql5.com/ru/forum/342090/page2#comment_16607922
   MqlTick Tick;
   SymbolInfoTick ( _Symbol , Tick);
   ulong start= GetMicrosecondCount ();
   for ( int i= 0 ; i< 100000 ; i++)
     {
       HistorySelect (Tick.time, INT_MAX );
     }
   ulong end= GetMicrosecondCount ()-start;
   Print ( "100000 HistorySelect = " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
}
 
Anton :

Daha bilgilendirici test:

Üç lansman:

         100000 HistorySelect = 18344.01 ms
        Selected = 0
         1000 HistorySelect = 602.77 ms
        Selected = 1169
        Selected = 22142
         100000 HistorySelect = 18331.15 ms
        Selected = 0
         1000 HistorySelect = 446.45 ms
        Selected = 1169
        Selected = 22142
         100000 HistorySelect = 18495.35 ms
        Selected = 0
         1000 HistorySelect = 549.40 ms
        Selected = 1169
        Selected = 22142

Boş Terminal 2460.


Tehdit Boş bir hesapta çalıştırın.

         100000 HistorySelect = 28.30 ms
        Selected = 0
         1000 HistorySelect = 0.28 ms
        Selected = 0
        Selected = 0


Siparişlerin değil , işlem sayısının hızı büyük ölçüde etkilediği görülüyor.

 
fxsaber :

Aynı hesap ve makinede Boş Terminal.


Resim diğer hesaplarda ve Terminallerde benzer. Yapılandırma.


Okuyuculardan bu betiğin sonuçlarını sağlamaları istenir.

Bu hiçbir şeyi kanıtlamaz, ancak her yeni lansmanda (farklı bir sembolde) sürenin artması endişe vericidir ...

 2020.05 . 29 13 : 59 : 36.625 test1 (USDJPY,H1)       HistoryDealsTotal () = 1
2020.05 . 29 13 : 59 : 36.626 test1 (USDJPY,H1)       HistoryOrdersTotal () = 0
2020.05 . 29 13 : 59 : 36.642 test1 (USDJPY,H1)       100000 HistorySelect = 16.00 ms
2020.05 . 29 13 : 59 : 53.522 test1 (EURUSD,H1)       HistoryDealsTotal () = 1
2020.05 . 29 13 : 59 : 53.522 test1 (EURUSD,H1)       HistoryOrdersTotal () = 0
2020.05 . 29 13 : 59 : 53.546 test1 (EURUSD,H1)       100000 HistorySelect = 24.36 ms
2020.05 . 29 14 : 00 : 03.640 test1 (USDCHF,H1)       HistoryDealsTotal () = 1
2020.05 . 29 14 : 00 : 03.640 test1 (USDCHF,H1)       HistoryOrdersTotal () = 0
2020.05 . 29 14 : 00 : 03.669 test1 (USDCHF,H1)       100000 HistorySelect = 29.25 ms
2020.05 . 29 14 : 00 : 14.994 test1 (GBPUSD,H1)       HistoryDealsTotal () = 1
2020.05 . 29 14 : 00 : 14.994 test1 (GBPUSD,H1)       HistoryOrdersTotal () = 0
2020.05 . 29 14 : 00 : 15.026 test1 (GBPUSD,H1)       100000 HistorySelect = 31.76 ms
 
Сергей Таболин :

Uzun bir ticaret geçmişine sahip bir hesapta çalışmanız gerekir.