기고글 토론 "MetaTrader 5의 주문, 포지션 및 거래" - 페이지 5

 

문제에 대한 fxsaber의 정보는 다음과 같습니다: https://www.mql5.com/ru/forum/366029/page3#comment_22547881 https://www.mql5.com/ru/forum/366029/page3#comment_22547881


라시드우마로프

개발자에게 답변을 요청해 주세요.

Библиотеки: TradesID
Библиотеки: TradesID
  • 2021.05.21
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: TradesID
 

역사에 대한 작업의 제동이 발표된 후 개발자들은 캐시를 만들기 위해 많은 작업을 수행했습니다. 브레이크가 사라졌습니다.

아마도 더 경제적 인 캐싱 메커니즘이있을 수 있습니다. 그러나 브레이크를 허용하는 것은 확실히 불가능합니다.


ZY 가장 빠른 방법으로 역사를 다루는 방법에 대한 의견은 없습니다. 현재 100% 빠른 방법은 모든 곳에서 HistorySelect만 호출하는 것입니다.

HistorySelect(0, INT_MAX)
 
fxsaber:

역사에 대한 작업의 브레이크가 게시된 후 개발자들은 캐시를 만들기 위해 많은 작업을 수행했습니다. 브레이크가 사라졌습니다.

아마도 더 경제적 인 캐싱 메커니즘이있을 수 있습니다. 그러나 브레이크를 허용하는 것은 확실히 불가능합니다.


ZY 가장 빠른 히스토리 작업 방법에 대한 의견은 없습니다. 현재 100 % 빠른 방법은 모든 곳에서 HistorySelect 만 호출하는 것입니다.


HistorySelect(t, INT_MAX)

여기서 t는 그리 오래되지 않은 임의의 날짜이며 호출마다 변경되지 않습니다(전체 프로그램에 대해 통일된 상수).

 
mktr8591:

여기서 t는 그리 오래되지 않고 통화마다 변경되지 않는 임의의 날짜(전체 프로그램에 대해 일정하고 균일한 상수)입니다.

이렇게 하면 캐시가 더 작아질지 모르겠습니다.

 
fxsaber:

그렇게 하면 캐시가 더 작아질지 잘 모르겠습니다.

소비량이 줄어듭니다. 처음에는 처방했었습니다.

bool HistorySelect2( const datetime From, const datetime To )
{
  static const datetime NewFrom = ::TimeCurrent() - 24 * 3600 & 30; // -월.
  
  return(::HistorySelect(From ? From : NewFrom, To));
}

#define HistorySelect HistorySelect2

하지만 심각한 문제가 발생해서 포기해야 했습니다.

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

void OnStart()
{
  PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
    
    PRINT(MQLInfoInteger(MQL_MEMORY_USED));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
  }
}

터미널에서 M1 차트 1개, 막대 5000개, 기호 1개, 리소스 없음, 그래픽 없음으로 결과를 실행합니다.

TerminalInfoInteger(TERMINAL_MEMORY_USED) = 426
HistoryDealsTotal() = 134502
HistoryOrdersTotal() = 218740
MQLInfoInteger(MQL_MEMORY_USED) = 1
TerminalInfoInteger(TERMINAL_MEMORY_USED) = 789

엄청나게 많은 양입니다. 10개의 동기식(OrderSend) EA는 4기가를 먹습니다. 두 가지 옵션:

  1. 새 계좌를 개설하고 자금을 이체한 후 거래를 계속합니다. 안타깝게도 항상 가능한 것은 아닙니다.
  2. 모든 봇을 비동기(OrderSendAsync)를 통해 하나로 결합합니다. 이것은 매우 활동적인 거래의 경우 버그를 잡는 매우 어려운 변형입니다.
두 번째는 단일 Expert Advisor에 내장된 봇의 관리자(GUI 등)를 작성해야 한다는 점입니다.
 
fxsaber:



  1. 모든 봇을 비동기화(OrderSendAsync)를 통해 하나로 결합합니다. 매우 활발한 거래에서 버그를 잡는 매우 무거운 변형입니다.

다른 방법은 없습니다. (물론 이전 기록을 잘라내고 기록 작업의 전체 알고리즘을 다시 실행하지 않는 한, MQ가 이전 정렬을 반환하지 않는 경우에만 해당됩니다).

 

안녕하세요, 여러분!

메타쿼츠가 이 문서를 트레이딩 클래스(CAccountInfo, CSymbolInfo, COrderInfo, CHistoryOrderInfo, CPositionInfo, CDealInfo, CTrade, CTerminalInfo)로 업그레이드하면 도움이 될 것입니다. 객체 지향 패러다임으로 EA를 개발하면 이 캐시 동기화 작업을 수정(및 단순화)하고 기호, 주문, 포지션, 거래, 거래 등에 대한 데이터를 가져올 수 있습니다.

제 말이 맞나요?

Documentation on MQL5: Standard Library / Trade Classes / CAccountInfo
Documentation on MQL5: Standard Library / Trade Classes / CAccountInfo
  • www.mql5.com
CAccountInfo - Trade Classes - Standard Library - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 

수익으로 주문 수수료를 계산하는 방법은 다음과 같습니다.

" 수익 += 수익 + 스왑 + 커미션 "

 

질문에 대한 답변을 도와주세요!

MT5 터미널의 플로팅 포지션 인디케이터 "시장가" 및 "수익"은 번역된 시세 및 심볼 사양을 기준으로 터미널 자체에서 계산합니까, 아니면 MT5 서버에서 번역하여 디스크에 캐시합니까?

캐시된 경우 수신된 시세와 현재 "시장가" 및 "수익" 지표 간의 동기화 불일치가 발생할 가능성이 있습니까?