MT5와 속도

 

MT5는 민첩한 플랫폼입니다. 그러나 빠른 거래의 모든 노력을 무효화하는 병목 현상이 있습니다.

여기에서 문제를 수집하고 개발자의 도움으로 어딘가에서 혼자 토론하고 해결하고 싶습니다.

 

이력선택.


이것은 엄청나게 비싼 기능입니다. 불행히도 캐싱은 현재 작업 속도를 허용할 수 없습니다.


예를 들어 전투 고문에서는 최신 데이터로 작업하는 것이 중요합니다. 특히 Market Watch 및 CopyTicks의 틱은 가능한 최신 상태여야 합니다.

이를 위해 현재 가격 데이터의 관련성을 확인하기 위한 매우 좋지는 않지만 강제적인 메커니즘이 있습니다. 이러한 메커니즘의 일부 중 하나는 마지막 틱 이후에 기호에 대한 거래가 통과된 상황을 감지하는 것입니다. 이것은 자주 발생하지 않으므로 현재 틱이 여전히 관련이 있는지 여부를 아는 것이 중요합니다.


이러한 탐지를 위해서는 최근 거래 내역에 접근할 수 있어야 합니다. 이것은 다음과 같은 개략적인 방식으로 HistorySelect를 통해 수행됩니다.

 void OnTick ()
{
   MqlTick Tick;

   if (SymbolInfo( _Symbol , Tick) && HistorySelect (Tick.time, INT_MAX ) ) // Взяли история торгов со времени текущего тика.
     // Проверяем актуальность тика через сравнение Tick.time_msc и DEAL_TIME_MSC.
}


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


개발자 여러분, 왜 그렇게 비쌉니까? 이 기능은 제대로 구현되면 즉시 실행할 수 있습니다.


히스토리 작업을 위해 이러한 기능을 도입하는 것을 고려하십시오.

HistoryDealsSelect( const int Index, const int Count = WHOLE_ARRAY );  // Из внутренней таблицы сделок взять сделки, начиная с заданного индекса в таблице.
HistoryOrdersSelect( const int Index, const int Count = WHOLE_ARRAY ); // Из внутренней таблицы ордеров взять ордера, начиная с заданного индекса в таблице.

그들은 HistorySelect 브레이크를 완전히 덮을 것입니다. 최신 트랜잭션을 얻는 문제를 해결하는 것이 매우 저렴하기 때문입니다. 이제 전투 성능에 한 가지 고통이 있습니다.


OnTradeTransaction 을 통해 최신 거래를 제어하는 것이 항상 가능한 것은 아닙니다. 따라서 역사에 대한 빠른 작업이 적합합니다.

 

ChartEvent 및 TradeTransaction 이벤트에 대한 액세스.


가능한 구현을 위한 아이디어와 옵션 중 하나가 제안되었습니다. 그래서 그냥 여기에 복사합니다.

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

오류, 버그, 질문

Sergey Dzyublik , 2020.05.20 00:47

개발자를 위한 제안.
사용자가 사용자 코드에서 OnChartEvent의 누적 "메시지" 처리를 독립적으로 호출할 수 있도록 MQL에 기능을 추가하는 것을 고려하십시오.
1) 이것은 시간 소모적인 계산의 반복 사이에 OnChartEvent 처리를 호출할 수 있게 하여 사용자의 그래픽 패널을 작업 풀, 데이터 전송, 상태 동기화, 컨텍스트 저장 및 복원에서 정원을 구축하지 않고도 최소한 어떻게든 반응하게 만듭니다.
2) 스크립트에서 OnChartEvent를 사용할 수 있습니다.

고맙습니다.

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

오류, 버그, 질문

일리아스 , 2020.05.20 09:09

GetNextEvent 기능을 추가할 것을 제안합니까?

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

오류, 버그, 질문

Sergey Dzyublik , 2020.05.20 13:39

실제로는 이 함수의 이름을 가능한 서명인 HandleNextEvent로 지정하고 싶습니다.

 bool HandleNextEvent (ENUM_EVENT_TYPE);


호출되면 GetNextEvent와 유사하게 대기열에 지정된 ENUM_EVENT_TYPE이 있는지 확인합니다.
이 이벤트가 있으면 해당 핸들러(OnChartEvent, OnTrade, OnTradeTransaction, ...(추가를 위한 fxsaber 덕분)의 사용자 코드로 제어를 자동으로 넘깁니다.
대기열에 이벤트가 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.


가능한 사용 사례:

 //....
for ( int i = 0 ; i < 10 ^ 6 ; ++i){
   // .... Data Calculations

   if ((i % 10 ^ 3) == 0 ){
       while (HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//.... 

유형의 이벤트 만 처리할 수 있는 기능을 제공하는 것이 좋습니다.
3) 처리 중에 다시 HandleNextEvent에 대한 호출이 있는 경우 - 호출 및 처리. 가능한 것은 스택 오버플로뿐이지만 이것은 개발자가 아니라 사용자와 코드의 문제입니다.
4) 필터에 해당하지 않는 이벤트는 동일한 순서로 유지되며 평소와 같이 사용자가 시스템에 제어를 반환할 때 호출됩니다.


이제 실행 코드 내에서 동일한 TradeTransaction 이벤트에 도달하려면 목발 을 사용해야 합니다.

전투 사용을 위해 고문은이 기회가 정말로 필요합니다.

 
fxsaber :

OnTradeTransaction 을 통해 최신 거래를 제어하는 것이 항상 가능한 것은 아닙니다 . 따라서 역사에 대한 빠른 작업이 적합합니다.

제어할 방법이 없을 때의 예를 들어 주십시오.

 
prostotrader :

제어할 방법이 없을 때의 예를 들어 주십시오.

OnTradeTransaction 에 의존할 수 없습니다. OrderSendAsync 작업을 위한 신뢰할 수 있는 공개 메커니즘이 없다는 것은 유감입니다.


또한 코드 내에서 여러 OrderSend를 설정할 때. 하나의 OrderSend가 이전 것에 의존하는 경우.

 
fxsaber :

또한 코드 내에서 여러 OrderSend를 설정할 때. 하나의 OrderSend가 이전에 의존하는 경우.

연결이 끊어지면 기록에 아무것도 추가되지 않습니다!

나는 OrderSendAsync를 5년 이상 사용하고 있습니다(그때 OrderSend에 문제가 있었습니다) + OnTradeTransaction() 전투 모드에서 - 문제 없습니다!

통신이 단절되면 각 주문에 할당된 마법에 따라 설명이 수행됩니다(FOREX에서는 기호 이름이 표준화되지 않았기 때문에 수행하기 어렵습니다).

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

연결이 끊어지면 기록에 아무것도 추가되지 않습니다!

나는 OrderSendAsync를 5년 이상 사용하고 있습니다(그때 OrderSend에 문제가 있었습니다) + OnTradeTransaction() 전투 모드에서 - 문제 없습니다!

몇 년 동안 Async+OnTrade에 빠져 있었다는 사실을 눈치채지 못하는 것은 불가능합니다. 또한 문제가 없기 때문에 이 메커니즘과 다른 모든 것을 통해 데이터를 업데이트합니다.

여기에서 "당신은 요리하는 법을 모른다"고 말하지 마십시오.

 
fxsaber :

몇 년 동안 Async+OnTrade에 빠져 있었다는 사실을 눈치채지 못하는 것은 불가능합니다. 또한 문제가 없기 때문에 이 메커니즘과 다른 모든 것을 통해 데이터를 업데이트합니다.

여기에서 "당신은 요리하는 법을 모른다"고 말하지 마십시오.

당신은 시간을 잡아먹는 수많은 코드를 꼬집으면서 마이크로초 동안 "싸우고" 있습니다.

99%의 경우에는 필요하지 않습니다.

 
건설적으로만 말하라고 촉구합니다.
 
fxsaber :

ChartEvent 및 TradeTransaction 이벤트에 대한 액세스.

가능한 구현을 위한 아이디어와 옵션 중 하나가 제안되었습니다. 그래서 그냥 여기에 복사합니다.

이제 실행 코드 내에서 동일한 TradeTransaction 이벤트에 도달하려면 목발 을 사용해야 합니다.

잘못된 방향으로 목발을 만들고 있습니다.

OnXXX 함수는 대기열의 이벤트(매개변수)를 복사하고 기본 OnMain 함수를 호출하는 것만 남겨둡니다. 모든 코드를 중복 On2XX 기능으로 이동합니다. 그리고 필요한 순서대로 OnMain에서 이러한 중복 On2XX 함수를 호출하고, 차례로 대기열에서 데이터를 매개변수로 전달합니다.

다음으로 측정을 수행하여 속도의 이득을 보여주면 MQL을 적절한 기능으로 보완하는 것이 이미 가능합니다. 그러나 지금 여기에서 이미 모든 것을 스스로 했다면 왜 보충해야 합니까?!

 
A100 :

OnXXX 함수는 이벤트(매개변수)를 대기열에 복사하고 기본 OnMain 함수를 호출하는 것만 남겨둡니다. 모든 코드를 이동하여 On2XX 기능을 복제합니다. 그리고 필요한 순서대로 OnMain에서 이러한 중복 On2XX 함수를 호출하고, 차례로 대기열의 데이터를 매개변수로 전달합니다.

이 아이디어의 기본 체계 코드를 제공하십시오. 언뜻 보면 완전한 오해처럼 들립니다.

OnMain 함수를 실행하는 동안 현재 실제 큐의 상태를 알 수 있는 방법이 없습니다. 이 작업을 수행하는 유일한 해결 방법은 링크에서 언급한 것처럼 스파이 프로그램입니다.

사유: