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개의 오픈 포지션 이 나타납니다(트리플 볼륨의 네팅 포지션에서).


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