MT5와 속도 - 페이지 30

 
Renat Fatkhullin :

하나의 동기화된 기호 기본 개체. 틱이 지속적으로 기록되기 때문에 읽기/쓰기 잠금이 뒤섞입니다.

한 번에 모든 캐릭터에 대해 하나의 캐릭터 기본 개체를 사용하시겠습니까? 그렇다면 EURUSD 틱 요청이 잠재적으로 GBPUSD 틱 요청을 늦추는 것으로 나타났습니다.


일반적으로 데이터베이스에서 요청되지 않도록 OnTick이 호출될 때까지 MqlTick 을 준비할 수 있습니까?

 
fxsaber :

OnTick이 호출될 때까지 MqlTick 을 준비하여 공통적으로 데이터베이스에서 요청하지 않도록 할 수 있습니까?

그러면 4 - Ask and Bid에서와 같이 미리 정의된 변수가 MQL5에 나타날 것입니다.

 

대부분의 경우 많은 Expert Advisors가 실행 중일 때 MT5의 높은 CPU 소비로 인해 브레이크가 발생합니다. MT4는 어떨지 모르겠네요. 그렇지 않으면 병렬로 실행되는 빈 터미널에 지연이 나타나는 이유를 설명하기 어렵습니다.

확실히 거래 환경 API의 사용을 최소화하면 문제가 해결됩니다. 탬버린으로 춤을 추고 나서 결과에 대해 글을 쓰겠습니다.

 
fxsaber :

제대로 이해하지 못했습니다. 각 Expert Advisor는 독점적으로 거래되며(실제 틱에 대해 테스터에서 느려지지 않음) 다른 사람에게 의존하지 않습니다. 모든 거래 로직은 OnTick에서만 실행되며, 재귀 없이 글로벌 및 리소스 없이 거래 주문을 스팸하지 않습니다.

OnTrade*, OnBook - 사용되지 않습니다. 특정 키가 눌려진 경우 두 번째 타이머 및 OnChartEvent.


나는 스냅샷의 유능한 구현(귀하 또는 내 편에서)이 표준 환경 기능에 대한 호출 수를 크게 줄이는 데 도움이 될 것이라고 확신합니다. 따라서 지연이 크게 줄어 듭니다.

스냅샷 트릭이 올 거라고는 생각도 못했습니다. 문제를 연구하고 있기 때문에 MT5 Expert Advisor의 표준 구현은 불행히도 절름발이입니다.

나는 당신의 경우를 전혀 믿지 않습니다.

우리는 우리의 계산을 보여주었다
 
Renat Fatkhullin :
나는 당신의 경우를 전혀 믿지 않습니다.

TeamViewer 등을 통해 시연할 준비가 되었습니다.

 
:: TerminalInfoInteger ( TERMINAL_BUILD ) = 2605
( bool ):: TerminalInfoInteger ( TERMINAL_X64 ) = true
( bool ):: TerminalInfoInteger ( TERMINAL_VPS ) = false
:: HistoryDealsTotal () = 13973
:: HistoryOrdersTotal () = 18606
:: TerminalInfoInteger ( TERMINAL_MAXBARS ) = 5000
:: TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = 1464
:: MQLInfoInteger ( MQL_MEMORY_USED ) = 5
:: ObjectsTotal ( 0 ) = 462
ChartsTotal = 16
:: SymbolsTotal ( true ) = 19 ( 16 + 3 )

터미널의 메모리 사용량을 줄이는 방법을 추천해 달라고 부탁합니다. 16자에 대해 CopyTicks의 신선한 틱을 사용합니다. 각 CopyTicks는 메모리에 128K 틱을 유지하는 것 같습니다. 나는 그것들이 전혀 필요하지 않지만 그것들은 내 기억 속에 놓여 있습니다. 거의 1.5GB는 무엇으로 이동합니까? 개발자는 메모리의 어느 부분이 무엇에 소비되는지 스스로 확인할 수 있습니다. 일부 원시 작업 관리자.

 
fxsaber :

대부분의 경우 많은 Expert Advisors가 실행 중일 때 MT5의 높은 CPU 소비로 인해 브레이크가 발생합니다. MT4는 어떨지 모르겠네요. 그렇지 않으면 병렬로 실행되는 빈 터미널에 지연이 나타나는 이유를 설명하기 어렵습니다.

확실히 거래 환경 API의 사용을 최소화하면 문제가 해결됩니다. 탬버린으로 춤을 추고 나서 결과에 대해 글을 쓰겠습니다.

그것이 내가 몇 페이지 전에 이야기했던 것입니다. 더욱이 Expert Advisors는 매우 단순하고 비유동적인 기호일 수 있습니다. 즉, 각 Expert Advisors의 코드 내에서 발생하는 수학적 연산 수의 문제가 아닙니다. 문제는 터미널 자체에 있으며 코드를 개선하여 이를 극복할 수 없습니다. 안타깝게도 :(

PS 내 Expert Advisors의 절반에 사용된 로직을 OnBook에서 OnTick 으로 다시 작성하고 Core i5를 Xeon E5-2678로 교체했습니다. 속도가 증가해야 할 것 같지만 아아, 기적은 일어나지 않았습니다 :(

 
OnTrade 기능의 브레이크 HistorySelect.
 // Демонстрация лага HistorySelect в OnTrade*-функциях.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inAlertTime = 1 ; // Нижний порог в миллисекундах

#define _B2(A) _B(A, inAlertTime)

const bool Init = EventSetTimer ( 1 );

void OnTimer ()
{
   static MqlTradeRequest Request = { 0 };
   static MqlTradeResult Result = { 0 };

   if ( PositionSelectByTicket (Result.order)) // Если позиция открыта - закрываем.
  {
    Request.type = ORDER_TYPE_SELL ;
    Request.price = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
    Request.position = Result.order;
  }
   else // Иначе - открываем.
  {
    Request.action = TRADE_ACTION_DEAL ;
    Request.type = ORDER_TYPE_BUY ;
    Request.symbol = _Symbol ;
    Request.volume = 0.1 ;
    Request.price = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
    Request.position = 0 ;
  }

   const bool AntiWarning = OrderSendAsync (Request, Result); // Асинхронный приказ не случайно
}

void OnTrade ()
{
  _B2( HistorySelect ( 0 , INT_MAX ));  
}


거의 모든 단계.

 2020.09 . 23 11 : 59 : 46.351 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 3 ms.
2020.09 . 23 11 : 59 : 46.354 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 2 ms.
2020.09 . 23 11 : 59 : 48.294 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 4 ms.
2020.09 . 23 11 : 59 : 48.296 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 2 ms.
2020.09 . 23 11 : 59 : 49.283 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 4 ms.
2020.09 . 23 11 : 59 : 49.285 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 2 ms.
2020.09 . 23 11 : 59 : 50.296 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 4 ms.
2020.09 . 23 11 : 59 : 50.302 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 5 ms.
2020.09 . 23 11 : 59 : 51.275 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 4 ms.
2020.09 . 23 11 : 59 : 51.277 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 2 ms.
2020.09 . 23 11 : 59 : 52.267 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 4 ms.
2020.09 . 23 11 : 59 : 52.269 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 2 ms.
2020.09 . 23 11 : 59 : 54.277 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 3 ms.
2020.09 . 23 11 : 59 : 54.282 Alert : Time[Test6.mq5 437 : HistorySelect ( 0 , INT_MAX )] = 5 ms.


캐시 빌드가 그렇게 오래 걸리지 않기를 바랍니다. 이 지연은 업데이트 중에 데이터베이스에 액세스하는 것과 관련이 있습니다.

[삭제]  

mt5에 '커미션' 탭이 없는 이유를 아십니까? 거래가 종료된 후에만 나타납니다.

mt5에 "커미션" 탭이 없는 이유를 아십니까? 거래가 완료된 후에만 나타납니다.

 

현재 포지션과 주문이 없는 계정에서 이 Expert Advisor를 실행하는 경우.

 // Создает маркет-ордер в случае, если нет текущих позиций и ордеров.
bool PositionOpen()
{
   bool Res = (! PositionsTotal () && ! OrdersTotal ());
  
   if (Res)
  {
     MqlTradeRequest Request = { 0 };
     MqlTradeResult Result;
    
    Request.action = TRADE_ACTION_DEAL ;
    Request.symbol = _Symbol ;
    Request.volume = 0.1 ;
    Request.price = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
    
    Res = OrderSendAsync (Request, Result);    
  }
  
   return (Res);
}

void OnInit ()
{
  PositionOpen();
}

void OnTrade ()
{
  PositionOpen();
}

그런 다음 Expert Advisor가 오픈한 포지션을 손으로 닫으면 헤지에서 3개의 오픈 포지션 이 나타납니다(트리플 볼륨의 네팅 포지션에서).


이것이 올바른 행동입니까? 아마도 터미널이 어떻게 작동하는지 오해하고 있습니다. 그럼 설명 부탁드립니다.