MT5와 속도 - 페이지 60

 
Anton :

테스트 코드:

이 코드는 작성자가 문제를 이해하지 못한다는 것을 보여줍니다.

입증하다.
 // Классический SYMBOL_BID vs Альтернативный SYMBOL_BID.
// Запускать только на демо-счетах.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

bool GetPosition( const int Type = OP_BUY )
{
   bool Res = false ;
  
   for ( int i = PositionsTotal () - 1 ; (i >= 0 ) && !Res; i--)
    Res = PositionGetTicket (i) && ( PositionGetInteger ( POSITION_TYPE ) == Type) && 
                                  ( PositionGetString ( POSITION_SYMBOL ) == _Symbol );
                                  
   return (Res);
}

// Альтернативный способ получения Bid-цены текущего символа.
// Запускать только на демо-счетах.
double GetBid()
{
   static const TICKET_TYPE Ticket = GetPosition() ? PositionGetInteger ( POSITION_TICKET ) : OrderSend ( _Symbol , OP_BUY, 0.1 , Ask, 0 , 0 , 0 );
  
   return ( PositionSelectByTicket (Ticket) ? PositionGetDouble ( POSITION_PRICE_CURRENT ) : 0 );
}

#define TOSTRING(A) ", " #A + " = " + ( string )(A)

#define MACROS(A, B)                                              \
   const ulong StartTime ##A = GetMicrosecondCount ();               \
   const double A = B;                                             \
   const ulong Interval ##A = GetMicrosecondCount () - StartTime ##A; \
                                                                  \
   if (Interval ##A > 100 )                                          \
    Time ##A += ( long )Interval ##A;  

long TimeBid1 = 0 ; // Суммарное время на длительный SYMBOL_BID
long TimeBid2 = 0 ; // Суммарное время на длительный GetBid()

const bool Init = EventSetTimer ( 10 ) && GetBid(); // Будем выводить статистику каждый 10 секунд.

void OnTimer ()
{
   // На сколько отстает один вариант от другого по времени выполнения.
   Alert (TOSTRING(TimeBid1 - TimeBid2) + " mcs." + TOSTRING(TimeBid1) + TOSTRING(TimeBid2));
}

void OnTick ()
{  
   const uint StartTime = GetTickCount ();
  
//  return;
  
   while (! IsStopped () && ( GetTickCount () - StartTime < 10000 ))
  {
    MACROS(Bid1, SymbolInfoDouble ( _Symbol , SYMBOL_BID ))
    MACROS(Bid2, GetBid())
      
//    if (Bid1 != Bid2)
//      Alert("Error!" + TOSTRING(Bid1) + TOSTRING(Bid2));
    
//    Sleep(0); // Специально убрал.
  }
}

이 EA는 두 가지 방법으로 현재 기호의 입찰가를 얻습니다. 각각에 대해 그는 장기 실행 케이스의 실행 시간을 요약합니다. 그리고 그들 사이의 차이점을 보여줍니다.


6/8 에이전트를 업로드했습니다. 그리고 나는 RannForex-Server 데모 서버에서 6개의 차트(다른 기호)에 대해 이 Expert Advisor를 시작했습니다. 결과.

 2020.10 . 26 16 : 10 : 40.596 Test9 (EURNZD,H1)       Alert : , TimeBid1-TimeBid2 = 236507295 mcs. , TimeBid1 = 246491044 , TimeBid2 = 9983749
2020.10 . 26 16 : 10 : 42.596 Test9 (CAC40,H1)         Alert : , TimeBid1-TimeBid2 = 235249710 mcs. , TimeBid1 = 241768964 , TimeBid2 = 6519254
2020.10 . 26 16 : 10 : 44.267 Test9 (DAX30,H1)         Alert : , TimeBid1-TimeBid2 = 243552816 mcs. , TimeBid1 = 253424672 , TimeBid2 = 9871856
2020.10 . 26 16 : 10 : 44.382 Test9 (DJI30,H1)         Alert : , TimeBid1-TimeBid2 = 265778370 mcs. , TimeBid1 = 272279313 , TimeBid2 = 6500943
2020.10 . 26 16 : 10 : 44.623 Test9 (ASX200,H1)       Alert : , TimeBid1-TimeBid2 = 210921561 mcs. , TimeBid1 = 219901110 , TimeBid2 = 8979549
2020.10 . 26 16 : 10 : 44.732 Test9 (FTSE100,H1)       Alert : , TimeBid1-TimeBid2 = 226824499 mcs. , TimeBid1 = 235809635 , TimeBid2 = 8985136

우리는 SYMBOL_BID를 실행하기 위한 총 시간( TimeBid1 )이 Bid 가격의 대체 수신에 치명적으로 손실(TimeBid2)되었다는 완전한 증거를 가지고 있습니다.


현재 가격을 얻기 위한 이러한 목발 솔루션은 성능 면에서 MQL5의 가장 중요한 기능입니다. 이 증거에 동의하십니까?


이 웅변적인 목발이 더 일찍 마음에 떠오르지 않은 것은 유감입니다.


추신: 어드바이저가 작동하려면 알고 거래를 허용해야 합니다. 따라서 데모 계정에서만 실행하십시오.

 
fxsaber :

이 EA는 두 가지 방법으로 현재 기호의 입찰가를 얻습니다.

POSITION_PRICE_CURRENT 스냅샷?

그래서 우리는 무엇과 무엇을 비교하고 있습니까? 터미널에 알려진 마지막 가격을 가져 와서 마지막으로 저장된 (언제?) 가격을 얻습니까?

글쎄요, 8개 중 6개 정도가 직접 말하더군요. 왜 그런 테스트를 합니까?

 
fxsaber :

이 코드는 작성자가 문제를 이해하지 못한다는 것을 보여줍니다.

당신의 진술은 당신이 명백한 것을보고 싶지 않다는 것을 증명합니다.

이 코드는 "SymbolInfoTick 브레이크"가 없음을 보여줍니다.

다소 현대적인 하드웨어에서 SymbolInfoTick의 실행 시간은 1마이크로초를 초과하지 않습니다.

이 EA는 두 가지 방법으로 현재 기호의 입찰가를 얻습니다. 각각에 대해 그는 장기 실행 케이스의 실행 시간을 요약합니다. 그리고 그들 사이의 차이점을 보여줍니다.

6/8 에이전트를 업로드했습니다. 그리고 나는 RannForex-Server 데모 서버에서 6개의 차트(다른 기호)에 대해 이 Expert Advisor를 시작했습니다. 결과.

우리는 SYMBOL_BID를 실행하기 위한 총 시간( TimeBid1 )이 Bid 가격의 대체 수신에 치명적으로 손실(TimeBid2)되었다는 완전한 증거를 가지고 있습니다.

현재 가격을 얻기 위한 이러한 목발 솔루션은 성능 면에서 MQL5의 가장 중요한 기능입니다. 이 증거에 동의하십니까?

이 웅변적인 목발이 더 일찍 마음에 떠오르지 않은 것은 유감입니다.

추신: 어드바이저가 작동하려면 알고 거래를 허용해야 합니다. 따라서 데모 계정에서만 실행하십시오.

아니요, 이것은 증거가 아닙니다. 심각하게 받아들일 수 없는 절대적으로 더러운 테스트.

자세히 분석하지는 않겠습니다. GetMicrosecondCount()를 통해 단일 호출 시간을 다시 측정하고 4코어 CPU에서 "Loaded 6/8 Agents"를 배경으로 다시 측정하면 충분합니다.

나는 이미 위에서 "x++"의 실행에서 가상의 브레이크를 찾는 것이 가능하다는 것을 분명히 보여주었다.

"SymbolInfoTick 브레이크"에 대한 귀하의 주장은 매우 간단하고 명백한 내 코드에 의해 단순히 확인되고 반박됩니다.

SymbolInfoTick의 원래 구현은 충분히 빠르지만 스트레스가 많은 다중 스레드 로드에서 개별 스레드에서 단일 실행 시간 스파이크 를 실제로 허용했습니다.

최신 빌드에서는 이러한 단점도 없습니다.

그가 말하는 내용을 정확히 알고 있는 사람과 계속 논쟁을 벌이는 것은 놀라운 일입니다. 구현을 보고 다양한 모드에서 프로파일링할 수 있습니다.

"굴과 코코넛의 맛을 먹어본 사람들과 논쟁을 벌이자."

 
Andrey Khatimlianskii :

POSITION_PRICE_CURRENT 스냅샷?

아니요. MT4Orders는 위치를 지정하는 데만 사용됩니다.

그래서 우리는 무엇과 무엇을 비교하고 있습니까? 터미널에 알려진 마지막 가격을 가져 와서 마지막으로 저장된 (언제?) 가격을 얻습니까?

Market Watch에서 가격을 받는 기간과 위치를 비교하십시오. 가격은 물론 일치합니다.

글쎄요, 8개 중 6개 정도가 직접 말했습니다. 왜 그런 테스트를 합니까?

눈먼 사람도 문제가 있음을 알 수 있도록 하기 위해서입니다. 글쎄, 이것은 입찰 가격이 위치를 통해 느려지지 않고 SymbolInfoTick이 끔찍한 방식으로 뒤처지는 경우 넌센스입니다.


포럼 회원들의 도움이 없이는 이 MQ-wall을 뚫을 수 없다고 생각합니다. 코드가 짧습니다. 전문가들은 빨리 움직여야 합니다. 거기에는 결함이 없습니다. 포지션을 통한 가격은 Market Watch보다 훨씬 빠르게 획득된다는 것이 분명합니다. MQ가 명백한 것을 보지 못하는 방법 - 나는 이해하지 못한다.

 
Anton :

당신의 진술은 당신이 명백한 것을보고 싶지 않다는 것을 증명합니다.

이 코드는 "SymbolInfoTick 브레이크"가 없음을 보여줍니다.

다소 현대적인 하드웨어에서 SymbolInfoTick의 실행 시간은 1마이크로초를 초과하지 않습니다.

아니요, 이것은 증거가 아닙니다. 심각하게 받아들일 수 없는 절대적으로 더러운 테스트.

자세히 분석하지는 않겠습니다. GetMicrosecondCount()를 통해 단일 호출 시간을 다시 측정하고 4코어 CPU에서 "Loaded 6/8 Agents"를 배경으로 다시 측정하면 충분합니다.

나는 이미 위에서 "x++"의 실행에서 가상의 브레이크를 찾는 것이 가능하다는 것을 분명히 보여주었다.

"SymbolInfoTick 브레이크"에 대한 귀하의 주장은 매우 간단하고 명백한 내 코드에 의해 단순히 확인되고 반박됩니다.

SymbolInfoTick의 원래 구현은 충분히 빠르지만 스트레스가 많은 다중 스레드 로드에서 개별 스레드에서 단일 실행 시간 스파이크 를 실제로 허용했습니다.

최신 빌드에서는 이러한 단점도 없습니다.

그가 말하는 내용을 정확히 알고 있는 사람과 계속 논쟁하는 것은 놀라운 일입니다. 구현을 보고 다양한 모드에서 프로파일링할 수 있습니다.

"굴과 코코넛의 맛을 먹어본 사람들과 논쟁을 벌이자."

당신은 코드를 보지 않았습니다. 나는 무능함을 믿지 않는다.

   if ( Interval ##A > 100 )                                          \
    Time ##A += ( long )Interval ##A;

이것은 실행이 100 µs 이상 지속된 경우에만 고려되는 조건입니다. 이것이 작은 값이라고 생각되면 더 많은 작업을 수행하십시오. 효과는 동일합니다.

비교된 두 함수는 절대적으로 동일한 조건에 있습니다. 하나는 느려지고 다른 하나는 그렇지 않습니다. 코드가 무엇을 측정하는지 다시 한 번 살펴보세요.


현재 전투 고문의 SymbolInfoTick을 제안된 목발로 교체하면 현재 가격 획득과 관련된 거의 모든 브레이크가 제거됩니다. 황당하지만 불행히도 사실입니다.


ZY OnTick에서 주목합니다. OnTick이 승인된 후 오는 진드기를 잡기 위해 특별히 제작되었습니다. 코드는 갑자기 작성된 것이 아닙니다. 이것은 이상적인 조건에서 병원의 평균 온도를 측정하는 완전히 인공적인 for-loop가 아닙니다.

 
fxsaber :

포럼 회원들의 도움이 없이는 이 MQ-wall을 뚫을 수 없다고 생각합니다. 코드가 짧습니다. 전문가는 빨리 움직여야 합니다. 거기에는 결함이 없습니다. 포지션을 통한 가격은 Market Watch보다 훨씬 빠르게 획득된다는 것이 분명합니다. MQ가 명백한 것을 보지 못하는 방법 - 나는 이해하지 못한다.

코드에 실제로 오류가 없으므로 SymbolInfoTick은 열린 위치 의 가격을 얻는 것에 비해 속도가 느려집니다.

위치에서 가격을 얻는 멋진 해킹
 
fxsaber :

눈먼 자도 문제가 있음을 알 수 있도록 하기 위함입니다. 글쎄, 이것은 입찰 가격이 위치를 통해 느려지지 않고 SymbolInfoTick이 끔찍한 방식으로 뒤처지는 경우 넌센스입니다.

시장 감시에 하나의 기호가 있고 수십 개의 기호가 있을 때 SymbolInfoTick 을 테스트해 보십시오. 그러나 귀하의 예에서와 같이 하나의 도구를 요청하십시오.

압축된 트래픽이 서버에서 올 가능성이 높고 데이터 압축을 풀 때 이러한 주기적 SymbolInfoTick 브레이크가 나타납니다.

저것들. 많은 문자가 있는 경우 테스트 시간이 훨씬 더 자주 또는 딥딥됩니다.


따라서 이것이 확인되면 전체 아키텍처를 다시 수행합니다 .... 모호한 즐거움

 
Igor Makanu :

시장 감시에 하나의 기호가 있고 수십 개의 기호가 있을 때 SymbolInfoTick을 테스트해 보십시오. 그러나 귀하의 예에서와 같이 하나의 도구를 요청하십시오.

압축된 트래픽이 서버에서 올 가능성이 높고 데이터 압축을 풀 때 이러한 주기적 SymbolInfoTick 브레이크가 나타납니다.

저것들. 많은 문자가 있는 경우 테스트 시간이 훨씬 더 자주 또는 딥딥됩니다.

이 가설은 Market Watch의 가격이 오더북의 가격보다 뒤처지는 경우(또는 그 반대의 경우 )에 적용됩니다. 그러나 지금은 가격 관련성 문제를 다루지 않고 터미널 내부의 SymbolInfoTick 자체의 브레이크에 대해서만 이야기하고 있습니다.

 
fxsaber :

비교된 두 함수는 절대적으로 동일한 조건에 있습니다.

최소한 GetBid는 SymbolInfoDouble 다음에 호출됩니다. 교환하면 결과가 바뀌지 않습니까?

뭔가 POSITION_PRICE_CURRENT 가 저장된 가격을 취하고 새로운 가격을 얻으려고 시도하지 않는다고 말합니다.

반복해서 말씀드리지만 80% 로드된 프로세서에서 테스트하는 것은 의미가 없습니다. 우리는 필요한 기능이 아닌 프로세서의 성능과 Windows에 의한 리소스 분배를 테스트합니다.

 
Andrey Khatimlianskii :

최소한 GetBid는 SymbolInfoDouble 다음에 호출됩니다. 교환하면 결과가 바뀌지 않습니까?

출판 전에도 이것을 실험했습니다. 결과에 영향이 없습니다.

뭔가 POSITION_PRICE_CURRENT 가 저장된 가격을 취하고 새로운 가격을 얻으려고 시도하지 않는다고 말합니다.

문제의 사실은 MQL 프로그램이 터미널에 온 마지막 가격이 아니라 다른 가격이 필요하다는 것입니다. 틱이 터미널에 도착하면 위치/주문이 있는 모든 테이블을 자동으로 업데이트합니다.

반복해서 말씀드리지만 80% 로드된 프로세서에서 테스트하는 것은 의미가 없습니다. 우리는 필요한 기능이 아닌 프로세서의 성능과 Windows에 의한 리소스 분배를 테스트합니다.

주요 조건은 두 기능 모두에 대한 환경의 ID입니다. CPU 로드는 불일치의 가시성에서 더 두드러진 요소입니다.

동시에 20명의 Expert Advisors가 때때로 SymbolInfoTick을 동시에 호출할 수 있습니다. 그러면 밀리초의 로드 버스트가 발생하고 지연이 나타납니다. 문제가 즉시 눈에 띄도록 명시적으로 제안했습니다.


반복합니다. 테스트 조건은 두 기능 모두 동일합니다. 사실.

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

MT5와 속도

fxsaber , 2020.10.26 17:53

현재 전투 고문의 SymbolInfoTick을 제안된 목발로 교체하면 현재 가격 획득과 관련된 거의 모든 브레이크가 제거 됩니다. 황당하지만 불행히도 사실입니다.