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

 
fxsaber :

Yazdır ve Uyarı eşzamansız değil mi?

Bu işlevleri eşzamansız hale getirmek istedim. Uygulamayı ChartEvent aracılığıyla denedim - işe yarıyor. Ama yavaşlıyor. Kazıldı.

 #include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnTick ()
{
  _B( EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL ), 1 );
}


 2020.10 . 07 12 : 38 : 04.579 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 100 mсs.
2020.10 . 07 12 : 38 : 06.842 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 170 mсs.
2020.10 . 07 12 : 38 : 07.924 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 765 mсs.
2020.10 . 07 12 : 38 : 08.359 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 377 mсs.
2020.10 . 07 12 : 38 : 09.246 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 66 mсs.
2020.10 . 07 12 : 38 : 14.645 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 692 mсs.
2020.10 . 07 12 : 38 : 14.729 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 6427 mсs.
2020.10 . 07 12 : 38 : 15.140 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 479 mсs.
2020.10 . 07 12 : 38 : 15.222 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 125 mсs.
2020.10 . 07 12 : 38 : 15.373 Alert : Time[Test9.mq5 5 in OnTick : EventChartCustom ( ChartFirst (), 123 , 0 , 0 , NULL )] = 606 mсs.


Kritik yerlerde böyle pahalı bir işlevi terk etti. EventChartCustom pahalıdır.


Uyarı Konusunda.

Şu ana kadar kesinlikle kritik yerlerde alarm vermenin imkansız olduğunu söyleyebiliriz. Eşzamansızlığa ihtiyacınız var.

 

Yeniden üretilen frenler SymbolInfoTick. Ve stres testi yok. Pratik zorunluluk beni böyle yazmaya zorluyor.

 #include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

// Возвращает время Обзора рынка в миллисекундах.
long TimeCurrentMsc()
{
   long Res = 0 ;
  
   MqlTick Tick;
  
   for ( int i = SymbolsTotal ( true ); i >= 0 ; i--) 
  {
     const string Symb = SymbolName (i, true );
    
     if ( _B( SymbolInfoTick (Symb, Tick), 10 ) && (Tick.time_msc > Res))
      Res = Tick.time_msc;
  }

   return (Res);
}

void OnTick ()
{ 
  TimeCurrentMsc();
}


Hızlı oynatma için bu kılavuzu izleyin.

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

Senkronize OrderSend, başarıyı ticaret sunucusuna ping göndermekten daha hızlı bildirir

fxsaber , 2020.09.30 20:36

  1. RannForex-Server'da bir demo hesabı açın.
  2. Piyasa saatinde Forex sembollerini açın ve otomatik ticareti etkinleştirin.
  3. Bu Expert Advisor'ı tek bir grafik üzerinde çalıştırın.
  4. Bu komut dosyasını aynı çizelgeye atın - danışmanı diğer sembollere klonlar. inAmount = 15 ile başlatıldı .
  5. Bu tür mesajları bekleyin ve günlüğü izleyin.


Hızlı bir makinede, Pazar İzlemede 30 karakterlik bir sonuç.

 2020.10 . 07 13 : 28 : 01.931 Test9 (NZDCHF,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 65 mсs.
2020.10 . 07 13 : 28 : 02.344 Test9 (EURAUD,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 11 mсs.
2020.10 . 07 13 : 28 : 02.730 Test9 (EURAUD,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 15 mсs.
2020.10 . 07 13 : 28 : 02.800 Test9 (AUDCHF,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 11 mсs.
2020.10 . 07 13 : 28 : 05.471 Test9 (GBPAUD,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 30 mсs.
2020.10 . 07 13 : 28 : 08.675 Test9 (NZDCHF,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 28 mсs.
2020.10 . 07 13 : 28 : 08.675 Test9 (GBPAUD,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 120 mсs.
2020.10 . 07 13 : 28 : 09.697 Test9 (CADCHF,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 13 mсs.
2020.10 . 07 13 : 28 : 10.063 Test9 (EURCAD,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 29 mсs.
2020.10 . 07 13 : 28 : 11.741 Test9 (CADJPY,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 32 mсs.
2020.10 . 07 13 : 28 : 12.597 Test9 (EURCAD,H1)       Alert : Bench_Stack = 0 , Time[Test9.mq5 14 in TimeCurrentMsc: SymbolInfoTick (Symb,Tick)] = 33 mсs.


Umarım çoğalan sadece ben değilimdir. Tabii ki, gecikme daha önce gösterildiği kadar büyük değil. Ancak burada nedenlerin dibine çok daha hızlı inmek mümkün olacak.


PS TimeCurrentMsc, tekrarlanan isteklere rağmen nedense MQL5'e dahil edilmedi.

 
fxsaber :

Kritik yerlerde böyle pahalı bir işlevi terk etti. EventChartCustom pahalıdır .

Bu önemli bir dezavantajdır. MQL olay modeli eksik olduğundan - boş olay yoktur, yani. kuyrukta başka olay olmadığında tetiklenen bir olay. Özel bir olay aracılığıyla öykünebilir. Ama bu eksiklik göz önüne alındığında hıza önem verenler için olay modeli anlamsızlaşıyor.

 
fxsaber :

EventChartCustom pahalıdır.

Ve eğer ChartFirst() yoksa?

 
Andrey Khatimlianskii :

Ve eğer ChartFirst() yoksa?

 #include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

long GetAnotherChart()
{
   long Chart = :: ChartFirst ();
  
   while (Chart == ChartID ())
    Chart = ChartNext (Chart);
 
   return (Chart);     
}


void OnTick ()
{  
   const long Chart = GetAnotherChart();
  
   if (Chart)
    _B( EventChartCustom (Chart, 123 , 0 , 0 , NULL ), 1 );
  
  _B( EventChartCustom ( 0 , 123 , 0 , 0 , NULL ), 1 );
}


 2020.10 . 07 14 : 49 : 09.786 Alert : Bench_Stack = 0 , Time[Test9.mq5 19 in OnTick : EventChartCustom (Chart, 123 , 0 , 0 , NULL )] = 349 mсs.
2020.10 . 07 14 : 49 : 09.786 Alert : Bench_Stack = 0 , Time[Test9.mq5 21 in OnTick : EventChartCustom ( 0 , 123 , 0 , 0 , NULL )] = 81 mсs.
2020.10 . 07 14 : 49 : 09.866 Alert : Bench_Stack = 0 , Time[Test9.mq5 19 in OnTick : EventChartCustom (Chart, 123 , 0 , 0 , NULL )] = 248 mсs.
2020.10 . 07 14 : 49 : 09.866 Alert : Bench_Stack = 0 , Time[Test9.mq5 21 in OnTick : EventChartCustom ( 0 , 123 , 0 , 0 , NULL )] = 24 mсs.
2020.10 . 07 14 : 49 : 10.095 Alert : Bench_Stack = 0 , Time[Test9.mq5 19 in OnTick : EventChartCustom (Chart, 123 , 0 , 0 , NULL )] = 163 mсs.
2020.10 . 07 14 : 49 : 10.095 Alert : Bench_Stack = 0 , Time[Test9.mq5 21 in OnTick : EventChartCustom ( 0 , 123 , 0 , 0 , NULL )] = 116 mсs.
2020.10 . 07 14 : 49 : 10.810 Alert : Bench_Stack = 0 , Time[Test9.mq5 19 in OnTick : EventChartCustom (Chart, 123 , 0 , 0 , NULL )] = 600 mсs.
2020.10 . 07 14 : 49 : 10.811 Alert : Bench_Stack = 0 , Time[Test9.mq5 21 in OnTick : EventChartCustom ( 0 , 123 , 0 , 0 , NULL )] = 53 mсs.
2020.10 . 07 14 : 49 : 10.870 Alert : Bench_Stack = 0 , Time[Test9.mq5 19 in OnTick : EventChartCustom (Chart, 123 , 0 , 0 , NULL )] = 137 mсs.
2020.10 . 07 14 : 49 : 10.870 Alert : Bench_Stack = 0 , Time[Test9.mq5 21 in OnTick : EventChartCustom ( 0 , 123 , 0 , 0 , NULL )] = 54 mсs.

Başka birinin çizelgesine göndermek, kendi çizelgesine göndermekten daha pahalıdır.

 
A100 :

Bu önemli bir dezavantajdır. MQL olay modeli eksik olduğundan - boş olay yoktur, yani. kuyrukta başka olay olmadığında tetiklenen bir olay. Özel bir olay aracılığıyla öykünebilir. Ama bu eksiklik göz önüne alındığında hıza önem verenler için olay modeli anlamsızlaşıyor.

OnTimer, 16 ms'ye kadar arka planda arama yapmanızı sağlar.
 
Renat Fatkhullin :
OnTimer, 16 ms'ye kadar frekansta arka planda arama yapmanızı sağlar.

Bu doğru, yani. sıfırdan kaybederiz (en erken geri dönemeyiz) en az 16 ms. Ve ücretsiz bir sıfır olayı veya ücretsiz kullanıcı olayları olsaydı onları kaybedemezlerdi. Ve şimdi aşağıdaki durumda olay modeli sınırlı bir ölçüde çalışıyor:

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

MT5 ve iş başında hız

fxsaber , 2020.10.06 01:27

Tamamen konu dışısın. Diyelim ki OnTick'te iki pozisyon açmamız gerekiyor. İlk OrderSend birkaç milisaniyedir. Bundan sonra, bir anlık görüntü almanız gerekir. Ve sonra ikinci OrderSend'i çağırın .

OnTick tek başına yüzlerce milisaniye sürebilir. Ve bir çeşit OnTimer'da anlık görüntü almayı teklif ediyorsunuz.

Ayrıca, OnTimer başka amaçlar için serbest bırakıldı.
 
Ayrıca, OnTimer, onunla tam olarak sıfır olayını aldığımızı güvenilir bir şekilde doğrulamamıza izin vermiyor, çünkü önceliği diğer işleyicilerinkinden görünüşte daha yüksek (ceteris paribus) ve bu muhtemelen ana karşı savdır.
 
fxsaber :

Uyarı Konusunda.

Şu ana kadar kesinlikle kritik yerlerde alarm vermenin imkansız olduğunu söyleyebiliriz. Eşzamansızlığa ihtiyacınız var.

Bir baskı ile uyarı, bir yerde hızlı bir kayıtla değiştirmeyi deneyebilirsiniz.
Hafızadaki yerel sql akla geliyor

 
Renat Fatkhullin :
Anlık görüntü almayı teklif etmedim, ancak milisaniye zamanlayıcıyla ilgili doğrudan bir soruyu yanıtladım.

Mevcut test cihazında hala 1 saniyelik bir frekansla çalışmasına rağmen öyle. Yazdığımız yeni test cihazında bunu değiştirmeye çalışacağız.

Test Cihazının ikinci değil, milisaniyelik bir zamanlayıcıya sahip olduğu gerçeğini sık sık kullanırım. Kanıt.

 // Демонстрация корректной работы миллисекундного таймера в Тестере.
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnTick ()
{
   static bool FirstRun = true ;
  
   if (FirstRun)
  {
     MqlTick Tick;
    
     if ( SymbolInfoTick ( _Symbol , Tick) && Tick.bid && Tick.ask)
      FirstRun = ! EventSetMillisecondTimer ( 29 ); // 29 мс таймер.
  }
}

void OnTimer ()
{
   static int Count = 0 ;
  
   if (Count < 10 )
  {
     if (( bool )((++Count) & 1 )) // Попеременно
       OrderSend ( _Symbol , OP_BUY, 0.1 , Ask, 0 , 0 , 0 ); // Открываем позицию
     else if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 ); // Закрываем позицию
  }
}

void OnDeinit ( const int )
{
   // Распечатали историю в конце бэктеста.
   for ( int i = OrdersHistoryTotal() - 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
      OrderPrint();
}


Sonuç.

 2020.10 . 07 19 : 17 : 59.232 Core 1    2020.10 . 06 23 : 59 : 57    # 11 2020.10 . 06 00 : 00 : 00.320 buy 0.10 EURUSD 1.17859 0.00000 0.00000 2020.10 . 06 00 : 00 : 00.349 1.17827 0.00 0.00 - 3.20 0
2020.10 . 07 19 : 17 : 59.232 Core 1    2020.10 . 06 23 : 59 : 57    # 9 2020.10 . 06 00 : 00 : 00.262 buy 0.10 EURUSD 1.17859 0.00000 0.00000 2020.10 . 06 00 : 00 : 00.291 1.17827 0.00 0.00 - 3.20 0
2020.10 . 07 19 : 17 : 59.232 Core 1    2020.10 . 06 23 : 59 : 57    # 7 2020.10 . 06 00 : 00 : 00.204 buy 0.10 EURUSD 1.17859 0.00000 0.00000 2020.10 . 06 00 : 00 : 00.233 1.17827 0.00 0.00 - 3.20 0
2020.10 . 07 19 : 17 : 59.232 Core 1    2020.10 . 06 23 : 59 : 57    # 5 2020.10 . 06 00 : 00 : 00.146 buy 0.10 EURUSD 1.17859 0.00000 0.00000 2020.10 . 06 00 : 00 : 00.175 1.17827 0.00 0.00 - 3.20 0
2020.10 . 07 19 : 17 : 59.232 Core 1    2020.10 . 06 23 : 59 : 57    # 3 2020.10 . 06 00 : 00 : 00.088 buy 0.10 EURUSD 1.17859 0.00000 0.00000 2020.10 . 06 00 : 00 : 00.117 1.17827 0.00 0.00 - 3.20 0
2020.10 . 07 19 : 17 : 59.232 Core 1    2020.10 . 06 23 : 59 : 57    # 1 2020.10 . 06 00 : 00 : 00.000 balance 0.00 0.00000 0.00000 0.00000 2020.10 . 06 00 : 00 : 00.000 0.00000 0.00 0.00 100000000.00 0

Pozisyonun açılış saati ile kapanış saati arasında tam olarak 29 ms bulunmaktadır.