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

 

주문 전송 함수가 참을 반환하고 결과 주문 티켓이 있는 경우 (결과 주문!=0), 브로커가 주문을 수락하고 거래 탭에 있는지 아니면 이 단계에서 요청이 브로커 서버에서만 수락되고 거래소에서는 수락되지 않는지 알려주세요.

그리고 두 번째 질문은 OrderSend가 참을 반환하고 result.order==0인 상황이 있을 수 있나요?

 
Aleksey Gunin:

주문 전송 함수가 참을 반환하고 결과 주문에 주문 티켓(result.order!=0)이 있는 경우 브로커가 주문을 수락하고 거래 탭에 있는 것을 보장하는지 아니면 이 단계에서 요청이 브로커 서버에서만 수락되고 거래소에서는 수락되지 않는지 알려주실 수 있나요?

보장합니다.

두 번째 질문은 OrderSend가 참을 반환하고 result.order==0인 상황이 있을 수 있나요?

아니요.

 
fxsaber:

보증.

아니요.

얼마 전에 주문 보내기 기능에 대한 설명이 추가되었습니다(온라인 도움말 참조).

 
Rashid Umarov:

얼마 전 주문 보내기 기능에 대한 설명이 추가되었으니 온라인 도움말을 확인하세요.

시장가 주문에도 적용되나요?

수락된 각 주문은 거래 서버에 저장되어 체결 조건 중 하나가 발생할 때까지 처리를 기다립니다:

  • 만료,
  • 카운터 요청 발생
  • 체결 가격 수령 시 주문 체결,
  • 주문 취소 요청 수신.
터미널 자체가 항상 OrderSendAsync보다 먼저 OrderCheck를 호출한다는 사양은 없으며, OrderSend는 OrderSendAsync에 대한 애드온입니다.

트레이딩, 자동매매 시스템 및 트레이딩 전략 테스트에 관한 포럼

트레이딩 환경 작업 시 일반적인 오류와 이를 제거하는 방법

fxsaber, 2018.02.20 12:23 오후.

표준 주문 전송의 조건부 구현 방식 (타임아웃 없음)
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// 표준 주문 보내기 구현을 위한 조건부 알고리즘
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // 회로도 호출
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


이 체계에서 동일한 MetaQuotes-Demo에서 OrderSendAsync를 통해 시장가 주문을 할 때 주문이 체결되거나 거부될 때까지 해당 주문의 이벤트 포착을 보장할 수 없다는 것을 분명히 알 수 있습니다. 즉, MT5에는 OrderSendAsync의 중간 결과를 평가하는 간단한 메커니즘이 없습니다.


OrderSend는 Result.request_id가 OnTradeTransaction에서 OrderSendAsync의 동일한 값과 같을 때까지 실행됩니다. 또는 시간 초과로 종료됩니다. 따라서 OrderSend의 결과는 해당 요청_id가 있는 OnTradeTransaction의 메시지 유형에만 의존합니다.

요청_id 자체의 형성에 대해 듣는 것이 유용 할 것입니다. 제가 올바르게 이해했다면 터미널/계좌를 시작/연결한 순간부터 거래 서버로 전송된 주문의 카운터입니다. 터미널 자체는 거래 서버에서 들어오는 메시지를 분석하고 필요한 요청_id를 하나만 할당하거나 (의심스러운) 특정 메시지로 요청_id를 재설정합니다 (가장 가능성이 높음). 이 동작으로 얼마 전에는 입찰 내역을 주문 전송 출력과 일치시키는 것이 가능했습니다. 하지만 온트레이드 트랜잭션에서 올바른 요청_id를 가진 메시지는 하나만 표시되기 때문에 위 인용문에서와 같은 불쾌한 비동기 상황이 발생하게 됩니다.

 

안녕하세요, MqlTradeResult.deal 및 MqlTradeResult.order의 불일치를 발견했습니다.

1) 설명 (MQL5 참조 매뉴얼)


2) 실시간 거래

시장가 주문(TRADE_ACTION_DEAL)을 합니다. 인쇄 기능을 사용하여 MqlTradeResult 값을 출력합니다:


거래가 로그에 나타납니다:

몇 초 동안 잠자기 기능을 사용하여 "잠자기"를 시도하고 데이터를 다시 출력하려고했는데 (거래가 이미 정확히 이루어지고 포지션이 열려있는 경우) 거래 번호가 나타나지 않았습니다.


3) 전략 테스터

모든 필드가 여기에 채워져 있습니다:



이러한 차이의 원인은 무엇인가요?

 
Konstantin Kulikov:

안녕하세요, MqlTradeResult.deal 및 MqlTradeResult.order의 불일치를 발견했습니다.




https://www.mql5.com/ko/docs/trading/ordersend

시장가 주문(MqlTradeRequest.action=TRADE_ACTION_DEAL)을 전송할 때 OrderSend() 함수의 성공적인 결과는 주문이 실행되었음을 의미하지 않습니다(해당 거래가 체결됨): 이 경우 true는 추가 체결을 위해 거래 시스템에 성공적으로 주문이 접수되었음을 의미합니다. 거래 서버는 OrderSend() 호출에 대한 응답을 형성하는 시점에 이러한 데이터를 알 수 있는 경우 반환된 결과 구조에 거래 또는 주문 필드의 값을 채울 수 있습니다. 일반적으로 주문에 해당하는 거래 체결 이벤트는 OrderSend() 호출에 대한 응답이 전송된 후에 발생할 수 있습니다. 따라서 모든 유형의 거래 요청에 대해 OrderSend() 실행 결과를 수신할 때, 먼저 반환된 결과 구조에서확인할 수 있는 거래 서버 retcode의반환 코드와 외부 거래 시스템 retcode_external의 응답 코드 (필요한 경우)를 확인해야 합니다 .


Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
 

유익한 정보를 제공해 주셔서 감사합니다. @MetaQuotes

쿼리: 단일 for() 루프에서 미체결 주문과 개설된 포지션을 모두 일괄적으로 반복하려면 어떻게 해야 하나요(MQL4에서 모든 주문을 반복한 다음 주문이 이미 체결되었는지 또는 보류 중인 주문인지 확인하는 것과 비슷한 방식)?

 
Rahul Dhangar :

유익한 정보를 제공해 주셔서 감사합니다. @MetaQuotes

쿼리: 단일 for() 루프에서 미체결 주문과 개설된 포지션을 모두 일괄적으로 반복하려면 어떻게 해야 하나요(MQL4에서 모든 주문을 반복한 다음 주문이 이미 체결되었는지 또는 보류 중인 주문인지 확인하는 것과 비슷한 방식)?

포지션과 지정가 주문을 계산하려면 두 개의 독립적인 사이클을 사용해야 합니다. 한 사이클은 포지션을 열거하고 두 번째 사이클은 지정가 주문을 열거합니다. 예: 포지션 및 지정가 주문 계산하기

How to start with MQL5
How to start with MQL5
  • 2020.12.19
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

많은 비판에도 불구하고 강력한 커뮤니티가 있기 때문에 mql5 언어로 시작하는 분들에 대해 걱정할 필요는 없다는 것을 알고 있지만, 여기에 한 가지 더 있습니다:

번역과 텍스트의 문구가 이해를 방해합니다... 문서 자체가 텍스트에서 모순되기 때문에 누가 먼저 와야하는지 알아 내기 위해 땀을 흘려야했습니다:

  • 주문 내역

    주문 내역에서 주문에 대한 정보를 얻으려면 먼저 다음 세 가지 함수 중 하나를 사용하여 주문 내역 캐시를 만들어야 합니다: HistorySelect(start, end), HistorySelectByPosition() 또는 HistoryOrderSelect(ticket). 실행이 성공하면 캐시에 주문 수가 저장되며, 이 주문 수는HistoryOrdersTotal() 함수에 의해 반환됩니다. 이러한 주문의 속성에 대한 액세스는 티켓의 각 요소에서 적절한 함수를 사용하여 수행됩니다:

    1. HistoryOrderGetDouble(ticket_order, type_property)
    2. HistoryOrderGetInteger(ticket_order, type_property)
    3. 히스토리 주문 문자열 가져오기(티켓 주문, 유형 속성)


아래 https://www.mql5.com/ko/docs/trading/historyorderstotal 와 대조됩니다.



HistoryOrdersTotal

히스토리의 주문 수를 반환합니다. HistoryOrdersTotal()을 호출하기 전에 먼저HistorySelect() 함수 또는 HistorySelectByPosition() 함수를 사용하여 거래 및 주문 내역을 수신해야 합니다.

int HistoryOrdersTotal();

반환 값

double 타입의 값입니다.

참고

거래 내역의 주문을 도구 상자 표시줄의 "거래" 탭에 표시되는 대기 주문과 혼동하지 마세요. 취소되었거나 거래로 이어진 주문 목록은 클라이언트 단말의 도구상자의 "내역" 탭에서 확인할 수 있습니다.

또한 다음을 참조하세요.


첫 번째 구절은 자체적으로 모순되며 도움이 필요하지 않지만 두 번째 구절이 나타나서 일을 복잡하게 만듭니다....: 결국 누가 먼저 오는지, HistoryOrdersTotal 또는 세 가지 함수 중 하나 HistorySelect (시작, 끝) HistorySelectByPosition() 또는 HistoryOrderSelect(티켓) 또는 두 번째 텍스트에 언급 된 HistorySelectByPosition() 중 하나를 선택합니다.

어렵고, 더 쉬울 수도 있었지만... 가장 먼저 떠오르는 것은 세 가지 함수 중 하나인 HistorySelect(start, end) HistorySelectByPosition () 또는 HistoryOrderSelect(ticket), 심지어 두 번째 텍스트에서 언급된 HistorySelectByPosition() 인 것 같아요...

Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
  • www.mql5.com
HistoryOrdersTotal - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

안녕하세요,
개발자에게 질문 : 히스토리 캐시가 얼마나 많은 메모리를 사용하는지 대략적인 정보를 제공 할 수 있습니까? 하나의 거래와 하나의 주문에 대해 대략 kbytes입니다.

거래 내역이 적은 터미널에서 스크립트를 실행했는데 이 결과가 나왔습니다:

void OnStart()
  {
   Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
   if(HistorySelect(0, INT_MAX))
     {
      Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
      Print("HistoryDealsTotal  = ", HistoryDealsTotal());
      Print("HistoryOrdersTotal = ", HistoryOrdersTotal());
     }
  }

2021.05.14 14:46:41.265	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 488
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 489
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryDealsTotal  = 1928
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryOrdersTotal = 1116

즉, 200만 건의 거래와 백만 건의 주문 내역이 있는 경우 캐시에 약 1기가바이트가 소요된다는 뜻인가요?

그렇다면 각 mql 프로그램마다?