특정 브로커의 라이브 계정에 대한 다중 주문 입력 문제 - 페이지 2

 
Malacarne :

BlindMist님 , 계정이 브로커 서버와 동기화되었는지 확인하기 위해 로컬 데이터베이스를 확인하는 것이 좋습니다.

이 문제를 해결하려면 제안된 게시물 을 살펴보십시오.

방금 제안 된 게시물을 살펴 보았고 주문이 여러 번 실행되는 것을 방지하는 방법에 대해 언급하지 않았습니다 ...

Sleep() 함수를 사용하더라도 거래가 실패했음을 확인하려면 얼마나 기다려야합니까? ...

내 EA에서는 다시 시도하기 전에 10초 후에 주문 보내기 요청 시간 초과가 발생했습니다... 그러나 때로는 주문이 초기 요청 후 15-20초 후에 실행됩니다. 따라서 원치 않는 이중 거래가 발생합니다.

 
BlindMist :

방금 제안 된 게시물을 살펴 보았고 주문이 여러 번 실행되는 것을 방지하는 방법에 대해 언급하지 않았습니다 ...

Sleep() 함수를 사용하더라도 거래가 실패했음을 확인하려면 얼마나 기다려야합니까? ...

내 EA에서는 다시 시도하기 전에 10초 후에 주문 보내기 요청 시간 초과가 발생했습니다... 그러나 때로는 주문이 초기 요청 후 15-20초 후에 실행됩니다. 따라서 원치 않는 이중 거래가 발생합니다.

안녕하세요 BlindMist , 그 주제에 대한 제 생각은 여전히 확인하는 유일한 방법이라고 생각합니다(PositionSelect의 단 한 번의 테스트 또는 단 한 번의 Sleep 대신), 오랜 시간 기다린 후 치명적인 오류와 같은 것을 생성하거나 다음과 같이 점프합니다. 기호 위치(아래 코드)가 있는 즉시.

이 문제에 대한 유일한 좋은 점은 아마도 PositionSelect가 조만간 또는 늦게 서버에서 업데이트된 위치를 얻을 것이므로 우리가 해야 할 일은 치명적인 오류를 표시하기 위해 최대 시간(시간 초과)을 기다리고 작은 샘플을 만드는 것입니다. 괜찮은지 확인하십시오(제 예에서는 100ms).

 bool fatalError= false ; // atention: declare this as global

....

if (fatalError== false ) {
   if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , LotSize, Price, 0 , 0 )) {
     Print ( "Position opened in " , Symbol ());
     int maxTimeout= 0 ;
     while (! PositionSelect ( Symbol ())) {
       Sleep ( 100 );
       maxTimeout++;
       if (maxTimeout> 100 ) {
           Print ( "### PositionSelect fatal error!" );
          fatalError= true ;
           break ;
       }
    }
     Print ( "--> PositionSelect delay=" ,maxTimeout* 100 );
     break ;
  }
}

이것을 더 모듈화하는 또 다른 방법은 시간 초과를 제어하는 함수 를 만드는 것입니다. 예를 들면 다음과 같습니다.

 bool PositionSelectTimeout( string symbol, int timeout) 
  { // timeout in seconds
   int maxTimeout= 0 ;
   while (! PositionSelect (symbol)) 
     {
       Sleep ( 100 );
      maxTimeout++;
       if (maxTimeout>(timeout* 10 )) return ( false ); // fatal error (timeout)
     }
   return ( true ); // position selected
  }

여기서 주요 아이디어는 MQ만 정말 훌륭하고 결정적인 솔루션을 다룰 수 있기 때문에 해결 방법으로 원래 PositionSelect()를 내 PositionSelectTimeout()으로 대체한다는 것입니다.

예를 들어:

 if (PositionSelectTimeout( Symbol (),6 0 )) { // 60 seconds timeout
 ...
}

// instead of ...

if (PositionSelect( Symbol ())) {
 ...
}

따라서 내 생각에 FinanceEngineer 는 문제를 해결하기 위해 동일한 작업을 수행하고 이 테스트를 루프 내부에 삽입하여 휴식을 취하기에 위치가 괜찮은지 다시 확인해야 합니다.

 
figurelli :

안녕하세요 BlindMist , 그 주제에 대한 제 생각은 여전히 확인하는 유일한 방법이라고 생각합니다(PositionSelect의 단 한 번의 테스트 또는 단 한 번의 Sleep 대신), 오랜 시간 기다린 후 치명적인 오류와 같은 것을 생성하거나 다음과 같이 점프합니다. 기호 위치(아래 코드)가 있는 즉시.

이 문제에 대한 유일한 좋은 점은 아마도 PositionSelect가 조만간 또는 늦게 서버에서 업데이트된 위치를 얻을 것이므로 우리가 해야 할 일은 치명적인 오류를 표시하기 위해 최대 시간(시간 초과)을 기다리고 작은 샘플을 만드는 것입니다. 괜찮은지 확인하십시오(내 예에서는 100ms).

이것을 더 모듈화하는 또 다른 방법은 시간 초과를 제어하는 함수를 만드는 것입니다. 예를 들면 다음과 같습니다.

여기서 주요 아이디어는 MQ만 정말 훌륭하고 결정적인 솔루션을 다룰 수 있기 때문에 해결 방법으로 원래 PositionSelect()를 내 PositionSelectTimeout()으로 대체한다는 것입니다.

예를 들어:

따라서 내 생각에 FinanceEngineer 는 문제를 해결하기 위해 동일한 작업을 수행하고 이 테스트를 루프 내부에 삽입하여 휴식을 취하기에 위치가 괜찮은지 다시 확인해야 합니다.

감사합니다 figurelli, 매우 상세한 답변. 한 번 시도해 보고 시스템이 개선되는지 확인하겠습니다.
 
BlindMist :
감사합니다 figurelli, 매우 상세한 답변. 한 번 시도해 보고 시스템이 개선되는지 확인하겠습니다.
고마워, 천만에.
 
BlindMist :

방금 제안 된 게시물을 살펴 보았고 주문이 여러 번 실행되는 것을 방지하는 방법에 대해 언급하지 않았습니다 ...

Sleep() 함수를 사용하더라도 거래가 실패했음을 확인하려면 얼마나 기다려야합니까? ...

내 EA에서는 다시 시도하기 전에 10초 후에 주문 보내기 요청 시간 초과가 발생했습니다... 그러나 때로는 주문이 초기 요청 후 15-20초 후에 실행됩니다. 따라서 원치 않는 이중 거래가 발생합니다.

주문 실행 에 15초. 이것은 정말 나쁘다. 여기서 문제는 브로커의 서버에서 아무것도 얻을 수 없다는 것입니다(예를 들어, 간단한 상태 확인 코드 조각 등).
 
FinanceEngineer :
주문 실행 에 15초. 이것은 정말 나쁘다. 여기서 문제는 브로커의 서버에서 아무것도 얻을 수 없다는 것입니다(예를 들어, 간단한 상태 확인 코드 조각 등).

안녕하세요 FinanceEngineer 님, 맞습니다. 그러나 가장 먼저 관리해야 할 것은 대기 시간이 짧은 브로커를 선택하는 것입니다. 시장이 매번 더 빠르고 일반적으로 그러한 문제가 발생하기 때문입니다.

또한 지연 시간이 짧은 브로커를 가질 수 있지만 관련 뉴스가 있는 경우와 같이 하루 중 어떤 순간에는 큰 지연이 발생할 수 있으므로 항상 최악의 경우에 대해 생각하는 것이 좋습니다.

어쨌든 MT5의 OrderSend()는 MT4의 반환 값이 티켓이기 때문에 MT4만큼 관리하기 쉽지 않습니다. 브로커 OMS 프로토콜(예: FIX)과 통신할 수 있는 MQL5 아키텍처에서 도입된 주식 시장의 비동기 통신 때문에 MT5에서 이러한 변경이 필요했습니다.

그러나 이것이 오늘날 주문 관리를 위한 OMS의 큰 변화라고 생각합니다. 왜냐하면 실시간 티켓을 얻는 것이 매우 어렵고 MT5가 이 새로운 시나리오로 업데이트되기 때문입니다. 주로 우리가 더 많은 대기 시간이 있는 주식 시장을 사용하는 경우입니다.

이러한 의미에서 MT5에서 OrderSend() 후에 수행하는 더 관련성은 PositionSelect()를 확인하는 것이며 위의 모든 이유로 제안된 PositionSelectTimeout() 해결 방법을 사용하는 것이 좋습니다.

최악의 경우를 생각할 수 있는 유일한 방법은 시장에 주문을 보낸 후 모든 if { } else { } 조건을 모든 상황을 관리할 수 있는 방식으로 관리하는 것입니다.

catch { }도 갖고 싶지만 GetLastError()를 사용하여 이와 유사한 작업을 수행할 수 있습니다.

이는 위치를 확인하기 위해 티켓도 필요하고 MT5 OrderSend()가 MT4처럼 동기식으로 티켓을 반환하지 않기 때문입니다.

 
BlindMist :

방금 제안 된 게시물을 살펴 보았고 주문이 여러 번 실행되는 것을 방지하는 방법에 대해 언급하지 않았습니다 ...

Sleep() 함수를 사용하더라도 거래가 실패했음을 확인하려면 얼마나 기다려야합니까? ...

내 EA에서는 다시 시도하기 전에 10초 후에 주문 보내기 요청 시간 초과가 발생했습니다... 그러나 때로는 주문이 초기 요청 후 15-20초 후에 실행됩니다. 따라서 원치 않는 이중 거래가 발생합니다.

이것은 현재 사용하고 있는 내 코드입니다. 지금까지는 아무 문제가 없습니다. 이 코드를 시도해보고 해당 브로커에서 작동하는지 확인할 수 있습니다.

      bool checkOrderSend = OrderSend(request, result);
     
      if(result.retcode==10009 || result.retcode==10008)
      {
          Print("OrderSend was successful. Code: ",result.retcode);

          
          break;
      }
      else
      {
          Print(ResultRetcodeDescription(result.retcode));
      }
     

 
FinanceEngineer :

이것은 현재 사용하고 있는 내 코드입니다. 지금까지는 아무 문제가 없습니다. 이 코드를 시도하고 해당 브로커에서 작동하는지 확인할 수 있습니다.

      bool checkOrderSend = OrderSend(request, result);
     
      if(result.retcode==10009 || result.retcode==10008)
      {
          Print("OrderSend was successful. Code: ",result.retcode);

          
          break;
      }
      else
      {
          Print(ResultRetcodeDescription(result.retcode));
      }
     

checkOrderSend 변수로 무엇을 합니까?

서버 딜 완료를 확인하지 않고 여러 주문이 실행되는 것을 어떻게 방지합니까?

 
figurelli :

checkOrderSend 변수로 무엇을 합니까?

서버 딜 완료를 확인하지 않고 여러 주문이 실행되는 것을 어떻게 방지합니까?

안녕하세요 피겨리

내 요점은 OrderSend 함수 의 끝에서 10009 및 10008 코드를 모두 확인하는 것이 었습니다. 많은 사람들이 하나의 반환 코드(예: 10009 또는 10008) 중 하나만 확인하고 일반적으로 주문 상황을 피하기 위해 for 루프를 배치하므로 여러 주문을 받는 것을 발견했기 때문입니다.

제 경우에는 해당 브로커에게 주문을 받지 않으면 for 루프가 10번 시도합니다. 따라서 누군가가 여러 주문을 받는 경우 10009와 10008을 모두 확인하여 Ordersending 루프를 중지하는지 확인해야 합니다.

그러나 아이러니하게도 데모 계정에서는 하나의 반환 코드만 확인하는 것이 좋습니다. 그것은 당신에게 어떤 다중 주문 문제도 주지 않을 것입니다. 그래서 여기에서 라이브 계정과 데모 계정이 약간 다르게 동작하는 것을 발견했습니다.

감사합니다.

 
FinanceEngineer :

안녕하세요 피겨리

내 요점은 OrderSend 함수 의 끝에서 10009 및 10008 코드를 모두 확인하는 것이 었습니다. 많은 사람들이 하나의 반환 코드(예: 10009 또는 10008) 중 하나만 확인하고 일반적으로 주문 상황을 피하기 위해 for 루프를 배치하므로 여러 주문을 받는 것을 발견했기 때문입니다.

제 경우에는 해당 브로커에게 주문을 받지 않으면 for 루프가 10번 시도합니다. 따라서 누군가가 여러 주문을 받는 경우 10009와 10008을 모두 확인하여 Ordersending 루프를 중지하는지 확인해야 합니다.

그러나 아이러니하게도 데모 계정에서는 하나의 반환 코드만 확인하는 것이 좋습니다. 그것은 당신에게 어떤 다중 주문 문제도 주지 않을 것입니다. 그래서 여기에서 라이브 계정과 데모 계정이 약간 다르게 동작하는 것을 발견했습니다.

감사합니다.

안녕하세요 FinanceEngineer님 , 원래 코드의 다중 주문 문제를 확인하는 것이 더 나을 것입니다. 이렇게 하면 여기에서 다른 중요한 사항을 해결하고 초점을 잃지 않을 것이기 때문입니다. 어떻게 생각하세요?