MT5와 속도 - 페이지 4

 
하드웨어에 따라 다르다는 것을 이해합니다.
 
Alexsandr San :
하드웨어에 따라 다르다는 것을 이해합니다.

이런 건 없어!

 2020.05 . 29 15 : 08 : 44.938 Terminal        Windows 7 Service Pack 1 build 7601 , Intel Core i7- 6850 K  @ 3.60 GHz, 23 / 31 Gb memory, 43 / 226 Gb disk, IE 11 , UAC, Admin, GMT+ 3
 
Alexsandr San :
하드웨어에 따라 다르다는 것을 이해합니다.

그리고 나는 그렇게 생각합니다 - 아니요)))

그리고 컴퓨터의 작업 부하에서도 ...

 
prostotrader :

이런 건 없어!

예! 당신은 장치가 있고 이전 장치가 있습니다 - 결과가 다릅니다 - 그것은 내가 틀렸다는 것을 의미합니다. 그것은 권력이 아니라는 것을 의미합니다

 
Aleksey Mavrin :

온마인이란? 각 이벤트가 대기열을 처리하기 위해 온라인으로 호출하는 경우 어떻게 하나 이상의 이벤트가 온라인으로 대기열에 있을 수 있습니까?

OnMain은 함수입니다. 이것은 실제 코드가 아니라 특수한 경우 입니다. " OnMain 함수를 실행하는 동안 현재 실제 큐의 상태 를 알 수 있는 방법이 없습니다 ."라는 주장에 대한 답변입니다. 이것은 계산 자체에 대한 다른 접근 방식입니다.

 
A100 :

OnMain은 함수입니다. 이것은 실제 코드가 아니라 특수한 경우 입니다. " OnMain 함수를 실행하는 동안 현재 실제 큐의 상태 를 알 수 있는 방법이 없습니다 ."라는 주장에 대한 답변입니다. 이것은 계산 자체에 대한 다른 접근 방식입니다.

따라서 만일을 대비하여 OnMain...

:) ;)
 
fxsaber :


전투 고문에서는 의심스러운 모든 곳에서 _B(FuncName(...), AlertTime) 에 함수를 넣습니다. 다음은 가장 최근 항목에서 발췌한 짧은 로그입니다.

시간 열은 정지가 발생하는 빈도를 보여줍니다.

당신은 개념을 바꾸고 있습니다.

귀하의 원래 진술은 다음과 같습니다.

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

터미널에서도 호출당 평균 0.2ms의 시간은 원래 설명에 지정된 값보다 훨씬 적습니다.

이제 당신은 때때로 함수의 실행 시간이 평균보다 눈에 띄게 길어질 수 있다고 말하고 있습니다. 이것은 다른 문제입니다.

모든 HistorySelect() 요청은 동기화 장치 아래의 터미널 베이스에 대한 본격적인 호출입니다. 불가피하다. 예, 액세스 동기화의 가용성을 고려할 때 이 기능에 대한 매우 짧은 실행 시간을 보장하는 것은 불가능합니다.

HistoryDealsSelect() 및 HistoryOrdersSelect() 함수를 추가하여 제안된 솔루션은 이러한 의미에서 아무 것도 변경하지 않습니다.

최대 및 평균 시간을 확인하는 스크립트:

 void OnStart ()
  {
   MqlTick Tick;
   SymbolInfoTick ( _Symbol , Tick);
//---
   ulong start,end,max_time= 0 ,avr_time= 0 ;
   int    count= 100000 ;
   for ( int i= 0 ; i<count; i++)
     {
      start= GetMicrosecondCount ();
       HistorySelect (Tick.time, INT_MAX );
      end= GetMicrosecondCount ()-start;
       //--- >1 ms
       if (end> 1000 )
         Print ( " > 1 ms for one HistorySelect: " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
       //---
       if (end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print ( "Last tick time. Selected orders: " , HistoryOrdersTotal (), "; max time: " , DoubleToString (max_time/ 1000.0 , 3 ), " ms; avr time: " , DoubleToString (avr_time/ 1000.0 /count, 3 ), " ms; " ,count, " iterations" );
//---
   Tick.time=(Tick.time/ 86400 )* 86400 ;
   max_time= 0 ;
   for ( int i= 0 ; i<count; i++)
     {
      start= GetMicrosecondCount ();
       HistorySelect (Tick.time, INT_MAX );
      end= GetMicrosecondCount ()-start;
       //--- >1 ms
       if (end> 1000 )
         Print ( " > 1 ms for one last day HistorySelect: " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
       //---
       if (end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print ( "Last day. Selected orders: " , HistoryOrdersTotal (), "; max time: " , DoubleToString (max_time/ 1000.0 , 3 ), " ms; avr time: " , DoubleToString (avr_time/ 1000.0 /count, 3 ), " ms; " ,count, " iterations" );
//---
   HistorySelect ( 0 , INT_MAX );
   Print ( "Orders total: " , HistoryOrdersTotal ());
  }
 2020.05 . 29 17 : 22 : 04.195 TestHistorySelect (EURJPY,H1)   Last tick time. Selected orders: 0 ; max time: 0.034 ms; avr time: 0.001 ms; 100000 iterations
2020.05 . 29 17 : 22 : 06.771 TestHistorySelect (EURJPY,H1)   Last day. Selected orders: 141 ; max time: 0.101 ms; avr time: 0.027 ms; 100000 iterations
2020.05 . 29 17 : 22 : 08.039 TestHistorySelect (EURJPY,H1)   Orders total: 31448
 
Anton :

최대 및 평균 시간을 확인하는 스크립트:

인용된 의견 전에 귀하의 의견에 대해 언급하지 않겠습니다. 다음은 스크립트를 실행한 결과입니다.

더 정확하게는 끝날 때까지 기다릴 수 없어 반복 횟수를 100K에서 1K로 변경했습니다.

        Last tick time. Selected orders: 0 ; max time: 3.880 ms; avr time: 1.315 ms; 1000 iterations
        Last day. Selected orders: 2061 ; max time: 7.131 ms; avr time: 4.309 ms; 1000 iterations
        Orders total: 50113

만족스러운 평가를 받을 만한 가치가 있습니까?

당신은 상황의 부조리를 봅니다. 어리석게도 거래 수를 알아내려면HistorySelect를 호출 해야 합니다! 이것은 냉정하게 말해서 합리적이지 않습니다.


위협 각 틱에서 기껏해야 HistorySelect 때문에 총 수십 밀리초를 소비합니다.

 
A100 :

가장 간단한 형태:

계산 자체에 대한 접근 방식을 변경하기만 하면 됩니다(작업에 필요한 만큼 자주 중간 반환). 그러나 그것이 어렵다면 첫 번째 단계에서 OnMain이 당신을 위한 것이 아님을 고려하십시오(메인 코드를 OnMain이 아닌 OnTrade2XX로 전송). 따라서 OnMain에서 아무 것도 배울 필요가 없습니다.

감사합니다. 처음에 정확히 그렇게 이해했기 때문에 완전히 이해하지 못했다고 표현했습니다. 간단한 시나리오를 예로 들어 보겠습니다.


주문 보내기를 하고 있습니다. OrderSend 종료 직후 특정 포지션이 테이크에 의해 청산되지 않은 경우, 다른 OrderSend를 만듭니다. 이것은 프로그래밍해야 하는 모든 논리입니다. 비동기는 사용되지 않습니다.


이제 우리 로봇에게 일어난 상황입니다. 당신은 OrderSend를 보냈고, 그것이 실행되는 동안 제한 한도가 트리거되었고, 그 이후에 위에서 언급한 우리의 포지션 인수가 트리거되었습니다.


로봇의 구현은 개략적으로 무엇입니까? 나는 브레이크 HistorySelect나 OnTradeTransaction 스파이 버팀목 없이 이것을 구현하는 방법을 모릅니다. 이것은 코드의 어느 곳에서나 전체 거래 내역에 대한 액세스를 제공합니다. 이벤트 큐에 액세스하는 메커니즘이 구현된 경우 위의 예는 기본적으로 해결됩니다.


개발자를 포함하여 MT5의 모든 강력한 사람들은 이(위의 굵은 두 줄) 간단한(복잡한 것은 언급하기조차 꺼려지는) 거래 논리를 구현하는 방법을 보여주세요.

 
A100 :

OnMain은 함수입니다. 이것은 실제 코드가 아니라 특수한 경우 입니다. " OnMain 함수 실행 중에 현재 실제 큐의 상태 알 수 있는 방법이 없습니다 . "라는 주장에 대한 답변입니다. 이것은 계산 자체에 대한 다른 접근 방식입니다.

글쎄, 그것은 방법입니다. 그리고 남자들은 그것에 대해 이야기하고있었습니다. 이를 구현하려면 MQL 프로그램의 실행 구조를 변경해야 합니다. a) 최소한 2개 스레드로 또는 b) 큐에 액세스하고 처리를 관리하기 위한 메커니즘을 추가합니다.

현재 구조로는 제안된 계획을 사용자가 구현할 수 없습니다.