MT5와 속도 - 페이지 35

 
fxsaber :

Zadol 디버깅 스냅샷에 지쳤습니다. 결국 그는 완벽하게 해냈습니다. 한 명의 고문 - 평화롭고 조용합니다. 2개는 훌륭합니다. 20 - 재앙: CPU가 100% 미만입니다. HistorySelect는 몇 밀리초 동안 지연됩니다.

MT5는 많은 수의 로봇이 동시에 작동하도록 설계되지 않은 것 같습니다.

스트레스 테스트를 작성하고 있습니까 아니면 전문가의 일상적인 작업을 작성하고 있습니까?

하나의 데이터베이스에서 다중 스레드 스트레스 테스트일 가능성이 큽니다. 그래서 나는 반복한다:

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

MT5와 속도

레나트 팻쿨린 , 2020.09.16 12:47

내가 올바르게 이해하면 어드바이저가 아니라 각 기호에 스트레스 테스터가 있습니다 . 이것은 상황을 완전히 바꿉니다. 그리고 초기 조건의 은폐를 보여줍니다.

즉, 8(4+HT) 코어 프로세서에서 논스톱 모드로 지연 없이 16개의 스레드(병렬로 +N 터미널 작업자 스레드)가 하나의 동기화된 기호 기본 개체로 나뉩니다. 틱이 지속적으로 기록되기 때문에 읽기/쓰기 잠금이 뒤섞입니다.

일반적으로 이러한 프로필에서 프로세서 및 스레드 스케줄러의 성능에 따라 각 스레드는 시간의 60%에서 80%까지 대기할 수 있습니다.

그리고 작업 유형에 관계없이.

실제로 20 스레드에서 하나의 리소스에 대한 논스톱 전투를 준비하면 몇 가지 옵션이 있습니다.

  1. 논리적으로 액세스를 해제하고 스트레스 테스트를 처리하지 마십시오.
  2. 자신의 캐시로 이동(단락 1의 옵션)
  3. 하드웨어 업그레이드(i7 2600k가 좋은 것이라고 속지 마십시오. 나쁜 것입니다)


삽입물을 주의 깊게 읽으십시오. N 개의 스레드가 하나의 동기화 개체로 충돌하는 경우 빈 대기는 60-80% 수준이 됩니다.

그리고 다중 스레드 효율성의 한계는 8-12 스레드 수준 어딘가에 있을 것입니다. 스레드 수가 증가하면 샘플링 속도가 감소합니다. 2600k에서는 효율성 한계가 훨씬 더 낮습니다.

 
Renat Fatkhullin :

스트레스 테스트를 작성하고 있습니까 아니면 전문가의 일상적인 작업을 작성하고 있습니까?

보통의

하나의 데이터베이스에서 다중 스레드 스트레스 테스트일 가능성이 큽니다. 그래서 나는 반복한다:

실제로 20 스레드에서 하나의 리소스에 대한 논스톱 전투를 준비하면 몇 가지 옵션이 있습니다.

  1. 논리적으로 액세스를 해제하고 스트레스 테스트를 처리하지 마십시오.
  2. 자신의 캐시로 이동(포인트 1의 옵션)
  3. 하드웨어 업그레이드(i7 2600k가 좋은 것이라고 속지 마십시오. 나쁜 것입니다)


삽입물을 주의 깊게 읽으십시오. N 개의 스레드가 하나의 동기화 개체로 충돌하는 경우 빈 대기는 60-80% 수준이 됩니다.

그리고 다중 스레드 효율성의 한계는 8-12 스레드 수준 어딘가에 있을 것입니다. 스레드 수가 증가하면 샘플링 속도가 감소합니다. 2600k에서는 효율성 한계가 훨씬 더 낮습니다.

전체 캐시 기록. 그러나 그마저도 HistorySelect(0, INT_MAX)를 호출해야 합니다.

실험으로 거래 논리에 필요한 기록에 대한 모든 참조를 잘라냈습니다. CPU의 부하가 크게 줄었습니다.


일반적으로 로봇이 20대라면 그 안에서 역사를 되돌리는 것은 단 하나의 터미널로 재앙을 일으키게 된다. 여러 터미널에 대해 말할 필요도 없습니다.

그리고 싱크로오브젝트가 역사만이 아니라는 느낌이 있습니다. SymbolInfoTick, CopyTicks 및 다른 것 같습니다.

일반적으로 각각에 10개의 로봇이 있는 5개의 터미널도 시작할 수 없습니다.

제동 프로파일러 보기 - .

 
fxsaber :

보통의

전체 캐시 기록. 그러나 그마저도 HistorySelect(0, INT_MAX)를 호출해야 합니다.

실험으로 거래 논리에 필요한 기록에 대한 모든 참조를 잘라냈습니다. CPU의 부하가 크게 줄었습니다.


일반적으로 로봇이 20대라면 그 안에서 역사를 되돌리는 것은 단 하나의 터미널로 재앙을 일으키게 된다. 여러 터미널에 대해 말할 필요도 없습니다.

그리고 싱크로오브젝트가 역사만이 아니라는 느낌이 있습니다. SymbolInfoTick, CopyTicks 및 다른 것 같습니다.

일반적으로 각각에 10개의 로봇이 있는 5개의 터미널도 시작할 수 없습니다.

제동 프로파일러 보기 - .

수치 데이터뿐만 아니라 증거도 없습니다.

1) 각 Expert Advisor는 초당 몇 번이나 HistorySelect 쿼리를 수행합니까?

2) 어떤 기능이 느려집니까?

3) 로그?

4) 로봇의 작동 원리는 무엇입니까?

 
fxsaber :

일반적으로 로봇이 20대라면 그 안에서 역사를 되돌리는 것은 단 하나의 터미널로 재앙을 일으키게 된다. 여러 터미널에 대해 말할 필요도 없습니다.

반대로 각 터미널은 자체 동기화 개체를 지원하고 이에 대한 20명의 Expert Advisors 대기열은 없을 것입니까?

1개의 터미널에서 1개의 로봇을 실행해 보십시오. 결과를 보는 것이 재미있습니다.

 
Andrey Khatimlianskii :

반대로 각 터미널은 자체 동기화 개체를 지원하고 이에 대한 20명의 Expert Advisors 대기열은 없을 것입니까?

1개의 터미널에서 1개의 로봇을 실행해 보십시오. 결과를 보는 것이 재미있습니다.

불행히도, 이 실험의 결과는 무엇을 해야 할까요?

 
fxsaber :

불행히도, 이 실험의 결과는 무엇을 해야 할까요?

거래 로봇의 개념을 재고하십시오

추가됨

나는 3개의 터미널 + 1개의 데모를 가지고 있습니다.

각 터미널에는 3~4자의 OnBoorEvent를 사용하는 42개의 로봇이 있으며,

0.5초마다 추가합니다. 타이머가 트리거됨 + 각 로봇은 터미널의 전역 변수에 액세스합니다.

32GB RAM 중 8.34GB를 사용하고 CPU는 6.7%

그리고 거래 세션이 시작될 때 TM5 서버를 제외하고는 속도가 느려지지 않습니다.

 
Renat Fatkhullin :

수치 데이터뿐만 아니라 증거도 없습니다.

1) 각 Expert Advisor는 초당 몇 번이나 HistorySelect를 요청합니까?

2) 어떤 기능이 느려집니까?

3) 로그?

4) 로봇의 작동 원리는 무엇입니까?

이 질문에 대답하는 것이 매우 어렵습니다. 나 자신도 알아낼 수 없기 때문에 속도가 느려집니다. 프로파일러도 실행되지 않습니다. 지연은 CPU에서 발생하기 때문에 측정값을 속입니다. 불행히도 스냅샷과 캐싱을 통해 환경 기능에 대한 액세스를 줄이는 것은 예상한 효과를 내지 못했습니다. EA를 컴파일할 수 있는 프로파일러를 기다리고 있습니다.


그동안 만지작거리다가 트레이딩 이력이 있는 테스터에서 이런 쓰레기를 발견했습니다.

 void OnTick ()
{
   static bool FirstRun = true ;
    
   if (FirstRun)
  {
     MqlTick Tick;

     if ( SymbolInfoTick ( _Symbol , Tick) && Tick.ask)
    {
       MqlTradeRequest Request = { 0 };
       MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_PENDING ;
      Request.type = ORDER_TYPE_BUY_LIMIT ;
      Request.symbol = _Symbol ;
      Request.volume = 1 ;
      Request.price = Tick.ask - 10000 * _Point ;

       if ( OrderSend (Request, Result)) // Выставили отложку.
      {
        Request.action = TRADE_ACTION_DEAL ;      
        Request.type = ORDER_TYPE_BUY ;
        Request.price = Tick.ask;
        
        FirstRun = ! OrderSend (Request, Result); // Открыли позицию.
      }
    }
  }

   HistorySelect ( 0 , INT_MAX ); // Результат зависит от этой строки.  
}

// Проверяет наличие ордера в истории торгов.
bool CheckTicket( const long Ticket )
{
   return ( HistoryOrderGetInteger (Ticket, ORDER_TICKET ) == Ticket);
}

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

void OnDeinit ( const int )
{
   if ( HistorySelect ( 0 , INT_MAX ))
  {
    PRINT(CheckTicket( 4 )); // true
    PRINT(CheckTicket( 3 )); // true
    PRINT(CheckTicket( 2 )); // false
  }  
}


결과

        AUDCAD : real ticks begin from 2020.07 . 15 00 : 00 : 00
         2020.07 . 15 00 : 01 : 09    buy limit 1 AUDCAD at 0.84993 ( 0.94914 / 0.94993 )
         2020.07 . 15 00 : 01 : 09    market buy 1 AUDCAD ( 0.94914 / 0.94993 )
         2020.07 . 15 00 : 01 : 09    deal # 2 buy 1 AUDCAD at 0.94993 done (based on order # 3 )
         2020.07 . 15 00 : 01 : 09    deal performed [ # 2 buy 1 AUDCAD at 0.94993 ]
         2020.07 . 15 00 : 01 : 09    order performed buy 1 at 0.94993 [ # 3 buy 1 AUDCAD at 0.94993 ]
         2020.07 . 15 23 : 59 : 58    position closed due end of test at 0.94646 [ # 3 buy 1 AUDCAD 0.94993 ]
         2020.07 . 15 23 : 59 : 58    deal # 3 sell 1 AUDCAD at 0.94646 done (based on order # 4 )
         2020.07 . 15 23 : 59 : 58    deal performed [ # 3 sell 1 AUDCAD at 0.94646 ]
         2020.07 . 15 23 : 59 : 58    order performed sell 1 at 0.94646 [ # 4 sell 1 AUDCAD at 0.94646 ]
         2020.07 . 15 23 : 59 : 58    order canceled due end of test [ # 2 buy limit 1 AUDCAD at 0.84993 ]
         final balance 99999653.00 pips
         2020.07 . 15 23 : 59 : 58    CheckTicket( 4 ) = true
         2020.07 . 15 23 : 59 : 58    CheckTicket( 3 ) = true
         2020.07 . 15 23 : 59 : 58    CheckTicket( 2 ) = false


나는 이 버그를 거의 눈치채지 못했고 재생산을 작성하는 데 한 시간 이상을 보냈습니다. 코드는 멍청하지만 문제를 보여줍니다. 테스터가 아닌 터미널에 비슷한 것이 있는지 - 모르겠습니다.

검색 문자열 : Osibka 013.


PS b2626 - 수정되었습니다.

 
prostotrader :

트레이딩 로봇의 개념을 재고하다

모든 기호를 거래하는 단 하나의 로봇?

 
fxsaber :

모든 기호를 거래하는 단 하나의 로봇?

다른 로봇이지만 모두 거의 같은 방식으로 제작되었습니다.

동시에 하나의 터미널에 42개의 작업이 들어가고, 3-126개에서는 400자 정도입니다.

추가됨

나는 반복한다 (나를 위해)

각 로봇은 3~4자의 OnBoorEvent를 사용하며,

0.5초마다 추가합니다. 타이머가 트리거됨 + 각 로봇이 호출   전역 변수   단말기,

32GB RAM 중 8.34GB를 사용하고 CPU - 6.7%

그리고 거래 세션이 시작될 때 TM5 서버(또는 Opener의 하드웨어)를 제외하고는 속도가 느려지지 않습니다.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
prostotrader :

다른 로봇이지만 모두 거의 같은 방식으로 제작되었습니다.

동시에 하나의 터미널에 42개의 작업이 들어가고, 3-126개에서는 400자 정도입니다.

추가됨

나는 반복한다 (나를 위해)

각 로봇은 3~4자의 OnBoorEvent를 사용하며,

0.5초마다 추가합니다. 타이머가 트리거됨 + 각 로봇이 호출   전역 변수   단말기,

32GB RAM 중 8.34GB를 사용하고 CPU - 6.7%

그리고 거래 세션이 시작될 때 TM5 서버(또는 Opener의 하드웨어)를 제외하고는 속도가 느려지지 않습니다.

이상해요, 저와는 반대에요.

터미널 4개, Expert Advisors 수를 약 200명 정도로 줄이고, OnBook은 모든 것을 버리고, OnTick으로 다시 전환하고, 하드웨어를 업데이트했지만 문제는 여전히 fxsaber와 동일합니다.

하지만 오크리티에는 오랜만에 아침 브레이크가 없다. 그리고 그들이 무엇이었습니까! 때때로 최대 75초에 도달했습니다. :)