MT5와 속도 - 페이지 2

 
fxsaber :

이 아이디어의 기본 체계 코드를 제공하십시오. 언뜻 보면 완전한 오해처럼 들립니다.

OnMain 함수를 실행하는 동안 현재 실제 큐의 상태 를 알 수 있는 방법이 없습니다 . 이 작업을 수행하는 유일한 해결 방법은 링크에서 언급한 것처럼 스파이 프로그램입니다.

가장 간단한 형태:

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

계산 자체에 대한 접근 방식을 변경하기만 하면 됩니다(작업에 필요한 만큼 자주 중간 반환). 하지만 어렵다면 1단계에서 OnMain이 존재하지 않는다는 점(메인 코드를 OnMain으로 옮기지 않고 On2XX으로 이동)에서 각각 OnMain에서 아무것도 배울 필요가 없다고 생각하십시오.

 
A100 :

잘못된 방향으로 목발을 만들고 있습니다.

OnXXX 함수는 대기열의 이벤트(매개변수)를 복사하고 기본 OnMain 함수를 호출하는 것만 남겨둡니다. 모든 코드를 중복 On2XX 기능으로 이동합니다. 그리고 필요한 순서대로 OnMain에서 이러한 중복 On2XX 함수를 호출하고, 차례로 대기열에서 데이터를 매개변수로 전달합니다.

다음으로 측정을 수행하여 속도의 이득을 보여주면 MQL을 적절한 기능으로 보완하는 것이 이미 가능합니다. 그러나 지금 여기에서 이미 모든 것을 스스로 했다면 왜 보충해야 합니까?!

당신은 그것에 대해 쓰지 않습니다.
문제는 "OntaredeTransaction" 함수의 입력 변수에 필드를 채우는 기능이 도움말에 제공된 설명과 일치하지 않는다는 것입니다.
저것들. 많은 필드가 호출로 채워지지 않으며 최종 호출 TRADE_TRANSACTION_HISTORY_ADD에서도 마찬가지입니다.
따라서 모든 거래자는 도착 시 누락된 매개변수를 어떻게든 결정하기 위해 여기에서 고통을 받습니다.
여기에서 많은 토론이 있었습니다. 포럼에서 검색을 하십시오. "OntaredeTransaction"의 비뚤어진 기능이 추가로 생성됩니다. 처리 비용. 시간과 "부담" 알고리즘 거래자는 적절하게 작동하는 코드를 개발하는 데 추가 시간을 소비합니다(즉, 전체 커뮤니티 수준에서 막대한 시간 손실과 엄청난 비효율).
현재 "심볼에 의한 시장 실행이 있는 경우 가격 값이 0이 될 것입니다. 그래야 합니다."와 같은 개발자의 구독을 취소합니다. ( 링크 ) - 이것은 정상이 아닙니다. 다시 -
마지막 함수 호출에 완전한 값이 없으면 많은 추가 작업이 발생합니다. 인건비.

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

이력선택.


이것은 엄청나게 비싼 기능입니다. 불행히도 캐싱은 현재 작업 속도를 허용할 수 없습니다.


예를 들어 전투 고문에서는 최신 데이터로 작업하는 것이 중요합니다. 특히 Market Watch 및 CopyTicks의 틱은 가능한 최신 상태여야 합니다.

이를 위해 현재 가격 데이터의 관련성을 확인하기 위한 매우 좋지는 않지만 강제적인 메커니즘이 있습니다. 이러한 메커니즘의 일부 중 하나는 마지막 틱 이후에 기호에 대한 거래가 통과된 상황을 감지하는 것입니다. 이것은 자주 발생하지 않으므로 현재 틱이 여전히 관련이 있는지 여부를 아는 것이 중요합니다.


이러한 탐지를 위해서는 최근 거래 내역에 접근할 수 있어야 합니다. 이것은 다음과 같은 개략적인 방식으로 HistorySelect를 통해 수행됩니다.


불행히도 HistorySelect에 대한 이러한 호출은 5-30밀리초 동안 지속됩니다(Release-EX5에서 직접 측정했습니다). OnTick의 Expert Advisor에서 이러한 업데이트가 여러 번 수행되면(좋은 방법으로 일시 중지 후에 수행해야 합니다. 예를 들어, 각 OrderSend 후에) 모든 것이 엄청나게 비싸고 길어집니다. HistorySelect는 하나의 OnTick에서 총 몇 초를 먹을 수 있습니다.


개발자 여러분, 왜 그렇게 비쌉니까? 이 기능은 제대로 구현되면 즉시 실행할 수 있습니다.

" HistorySelect에 대한 이러한 호출5-30밀리초 동안 지속됨"에 대한 증거가 있습니까?

귀하의 아이디어를 올바르게 이해했다면 테스트 코드는 다음과 같아야 합니다.

 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개의 요청이 처리되는 방식은 다음과 같습니다.

 100000 HistorySelect = 141.63 ms
 
Anton :

" HistorySelect에 대한 이러한 호출5-30밀리초 동안 지속됨"에 대한 증거가 있습니까?

귀하의 아이디어를 올바르게 이해했다면 테스트 코드는 다음과 같아야 합니다.

100,000개의 요청이 처리되는 방식은 다음과 같습니다.

하나의 요청은 어떻습니까? 컴파일러가 최적화할 때 그렇게 했다면 놀라지 않을 것입니다.)))
 
Anton :

"HistorySelect에 대한 이러한 호출5-30밀리초 동안 지속됨"에 대한 증거가 있습니까?

귀하의 아이디어를 올바르게 이해했다면 테스트 코드는 다음과 같아야 합니다.

100,000개의 요청이 처리되는 방식은 다음과 같습니다.

스크립트를 실행합니다.

         100000 HistorySelect = 19493.96 ms


다른 스크립트를 실행합니다.

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

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


 HistoryDealsTotal () = 17828
HistoryOrdersTotal () = 22142


일반 전투 점수. HFT가 아닙니다.


추신: 그런데 스크립트에서 HistorySelect가 매번 모든 것을 새로 계산하는 것으로 나타났습니다. 그러나 입력 매개변수는 변경되지 않았고 기록 테이블은 업데이트되지 않았으며 다른 HistorySelect 함수는 호출되지 않았습니다.

 
fxsaber :

스크립트를 실행합니다.

그래서 세부 사항이 필요합니다.

내 테스트는 백그라운드에서 실행 중인 많은 다른 프로세스와 함께 느린 "Intel Xeon E5-2630 v4 @ 2.20GHz"에서 실행되었습니다.

2009년 이후 지금까지 8개의 주문을 포함하여 역사상 거의 균등하게 테스트 계정에 31315개의 주문이 있었습니다.

아마도 일부 스크립트 또는 Expert Advisor가 동시에 실행되어 터미널 기반을 크게 로드했을 수 있습니다. "깨끗한"터미널에서 시도하십시오.

더 유익한 테스트:

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

세 가지 출시:

 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 :

그래서 세부 사항이 필요합니다.

내 테스트는 백그라운드에서 실행 중인 많은 다른 프로세스와 함께 느린 "Intel Xeon E5-2630 v4 @ 2.20GHz"에서 실행되었습니다.

2009년 이후 지금까지 8개의 주문을 포함하여 역사상 거의 균등하게 테스트 계정에 31315개의 주문이 있었습니다.

아마도 일부 스크립트 또는 Expert Advisor가 동시에 실행되어 터미널 기반을 크게 로드했을 수 있습니다. "깨끗한"터미널에서 시도하십시오.

동일한 계정 및 컴퓨터에서 터미널을 비우십시오.

         100000 HistorySelect = 19367.01 ms


그림은 다른 계정과 터미널에서도 비슷합니다. 구성.

 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


독자는 이 스크립트의 결과를 제공해야 합니다.

 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 :

더 유익한 테스트:

세 가지 출시:

         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

빈 터미널 2460.


위협은 빈 계정에서 실행됩니다.

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


주문이 아니라 거래 건수가 속도에 큰 영향을 미치는 것 같습니다.

 
fxsaber :

동일한 계정 및 컴퓨터에서 터미널을 비우십시오.


그림은 다른 계정과 터미널에서도 비슷합니다. 구성.


독자는 이 스크립트의 결과를 제공해야 합니다.

이것은 아무 것도 증명하지 않지만 (다른 기호에서) 새로운 출시마다 시간이 증가한다는 사실은 놀랍습니다 ...

 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
 
Сергей Таболин :

거래 내역이 긴 계정으로 실행해야 합니다.