MT5와 속도 - 페이지 48

 
fxsaber :

인쇄와 경고가 비동기적이지 않습니까?

이러한 기능을 비동기식으로 만들고 싶었습니다. ChartEvent를 통해 구현을 시도했습니다. 작동합니다. 하지만 속도가 느려집니다. 팠다.

 #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.


중요한 장소에서 그런 값비싼 기능을 포기했습니다. EventChartCustom은 비쌉니다.


경고 주제에.

지금까지는 중요한 장소에 경보를 보내는 것이 불가능하다고 확실히 말할 수 있습니다. 비동기가 필요합니다.

 

재현된 브레이크 SymbolInfoTick. 그리고 스트레스 테스트가 없습니다. 현실적 필요성 때문에 이렇게 글을 쓰게 되었습니다.

 #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();
}


빠른 재생을 위해 이 가이드를 따르십시오.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

동기식 OrderSend는 ping to trade server보다 더 빠르게 성공을 보고합니다.

fxsaber , 2020.09.30 20:36

  1. RannForex-Server 에서 데모 계정을 엽니다.
  2. 시장 감시에서 Forex 기호를 열고 자동 거래를 활성화하십시오.
  3. 하나의 차트에서 이 Expert Advisor를 실행하십시오.
  4. 이 스크립트 를 동일한 차트에 던지십시오 - 어드바이저를 다른 기호로 복제합니다. inAmount = 15 로 시작했습니다 .
  5. 그러한 메시지를 기다리고 로그를 보십시오.


빠른 기계에서 Market Watch의 30자 결과.

 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.


저만 번식하는 것이 아니길 바랍니다. 물론 지연은 이전에 표시된 것처럼 크지 않습니다. 그러나 여기에서 훨씬 더 빨리 이유의 바닥에 도달하는 것이 가능할 것입니다.


PS TimeCurrentMsc는 반복되는 요청에도 불구하고 어떤 이유로 MQL5에 포함되지 않습니다.

 
fxsaber :

중요한 장소에서 그런 값비싼 기능을 포기했습니다. EventChartCustom은 비쌉니다 .

이것은 중요한 단점입니다. MQL 이벤트 모델이 불완전하기 때문에 null 이벤트가 없습니다. 큐에 다른 이벤트가 없을 때 발생하는 이벤트입니다. 사용자 지정 이벤트 를 통해 에뮬레이트할 수 있습니다. 그러나 이러한 단점을 감안할 때 속도를 중시하는 사람들에게는 이벤트 모델이 무의미해진다.

 
fxsaber :

EventChartCustom은 비쌉니다.

그리고 ChartFirst() 가 없다면?

 
Andrey Khatimlianskii :

그리고 ChartFirst()가 없다면?

 #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.

다른 사람의 차트로 보내는 것은 자신의 차트로 보내는 것보다 비용이 더 많이 듭니다.

 
A100 :

이것은 중요한 단점입니다. MQL 이벤트 모델이 불완전하기 때문에 null 이벤트가 없습니다. 큐에 다른 이벤트가 없을 때 발생하는 이벤트입니다. 사용자 지정 이벤트 를 통해 에뮬레이트할 수 있습니다. 그러나 이러한 단점을 감안할 때 속도를 중시하는 사람들에게는 이벤트 모델이 무의미해진다.

OnTimer를 사용하면 최대 16ms의 빈도로 백그라운드 호출을 할 수 있습니다.
 
Renat Fatkhullin :
OnTimer를 사용하면 최대 16ms의 빈도로 백그라운드 호출을 할 수 있습니다.

맞아요. 우리는 최소한 16ms를 처음부터 잃습니다. 그리고 무료 제로 이벤트나 무료 사용자 이벤트가 있어도 잃어버릴 수 없었습니다. 이제 다음 경우의 이벤트 모델은 제한된 범위에서 작동합니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MT5와 속도

fxsaber , 2020.10.06 01:27

당신은 주제에서 완전히 벗어났습니다. OnTick에서 두 개의 위치를 열어야 한다고 가정해 보겠습니다. 첫 번째 OrderSend는 몇 밀리초입니다. 그 후에는 스냅샷을 찍어야 합니다. 그런 다음 두 번째 OrderSend 를 호출합니다 .

OnTick만으로도 수백 밀리초가 걸릴 수 있습니다. 그리고 일종의 OnTimer에서 스냅샷을 찍겠다고 제안합니다.

또한 OnTimer는 다른 용도로 해제되었습니다.
 
게다가 OnTimer는 우선 순위가 다른 처리기의 우선 순위보다 분명히 높기 때문에(ceteris paribus) 이 이벤트와 함께 정확히 0 이벤트를 수신했는지 안정적으로 확인할 수 없으며 이것이 아마도 주요 반론입니다.
 
fxsaber :

경고 주제에.

지금까지는 중요한 장소에 경보를 보내는 것이 불가능하다고 확실히 말할 수 있습니다. 비동기가 필요합니다.

프린트로 경고하면 어딘가에 빠른 녹음으로 대체하려고 할 수 있습니다.
메모리의 네이티브 SQL이 떠오릅니다.

 
Renat Fatkhullin :
나는 스냅 샷을 제안하지 않았지만 밀리 초 타이머에 대한 직접적인 질문에 대답했습니다.

현재 테스터에서는 여전히 1초의 빈도로 작동하지만 그렇습니다. 우리가 작성하는 새 테스터에서 이것을 변경하려고 합니다.

나는 테스터에 두 번째 타이머가 아닌 밀리초 타이머가 있다는 사실을 자주 사용합니다. 증거.

 // Демонстрация корректной работы миллисекундного таймера в Тестере.
#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();
}


결과.

 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

포지션 의 개시 시간과 종료 시간 사이에는 정확히 29ms 가 있습니다.