내 EA가 이중 항목을 수행합니다. - 페이지 9

 

안녕

이 접근 방식은 현재 위치 크기가 0이고 원하는 위치 크기로 새 거래가 성공적으로 실행되는 경우에만 작동합니다.

코드 참조:

 #include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened= false ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if (conditions_to_open && !position_opened) //-- Or position_opened==false
     {
       if (trade.PositionOpen( _Symbol ,order_type,lot,price,sl,tp, "comment" )
         && 
         (trade.ResultRetcode()== 10009 || trade.ResultRetcode()== 10008 )) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened= true ;
         Print ( "Success!" );
        }
       else
        {
         Print ( "Error = " , GetLastError (), "trade error = " , trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return ;
        }

     }
//--- 
  }


그러나 EA가 포지션을 LONG에서 SHORT로 또는 그 반대로 돌리고 있고 이 작업이 2개의 다른 거래에서 수행된다면 어떻게 될까요?

첫 번째 거래 후 "position_opened" 부울 값이 "TRUE"로 설정되고 조건이 " if (conditions_to_open && !position_opened)"를 확인하기 때문에 EA가 2e 거래를 열 수 없으므로 두 번째 거래가 차단됩니다.

포지션 사이즈가 부분적으로만 열려 있다면 어떻게 될까요? 포지션 사이즈를 정확한 사이즈로 바꾸려면 두 번째 거래가 필요합니다.


결국 "긴 이야기를 짧게" 만들려면 현재 위치 크기를 계산하기 위해 항상 PositionSelect(Symbol()) 함수가 필요하며 여기에서 문제가 모두 시작되었습니다(및 이 포럼 스레드).

중요한 순간에 EA가 PositionSelect(Symbol())를 호출할 때 터미널은 아직 CURRENT 위치 크기를 업데이트하지 않았으며 EA는 잘못된 위치 크기로 작업하고 거래 서버에 새로운 이중 주문을 보냅니다.


EA가 PositionSelect(Symbol()) 함수를 올바른 위치 크기로 업데이트할 때까지 기다려야 하기 때문에 ( figurelli ) 접근 방식이 더 낫다고 생각합니다.


 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 ;
            }
      }
 
snelle_moda :

안녕

이 접근 방식은 현재 위치 크기가 0이고 원하는 위치 크기로 새 거래가 성공적으로 실행되는 경우에만 작동합니다.

코드 참조:


그러나 EA가 포지션을 LONG에서 SHORT로 또는 그 반대로 돌리고 있고 이 작업이 2개의 다른 거래에서 수행된다면 어떻게 될까요?

첫 번째 거래 후 "position_opened" 부울 값이 "TRUE"로 설정되고 조건이 " if (conditions_to_open && !position_opened)"를 확인하기 때문에 EA가 2e 거래를 열 수 없으므로 두 번째 거래가 차단됩니다.

포지션 사이즈가 부분적으로만 열려 있다면 어떻게 될까요? 포지션 사이즈를 정확한 사이즈로 바꾸려면 두 번째 거래가 필요합니다.


결국 "긴 이야기를 짧게" 만들려면 현재 위치 크기를 계산하기 위해 항상 PositionSelect(Symbol()) 함수가 필요하며 여기에서 문제가 모두 시작되었습니다(및 이 포럼 스레드).

중요한 순간에 EA가 PositionSelect(Symbol())를 호출할 때 터미널은 아직 CURRENT 위치 크기를 업데이트하지 않았으며 EA는 잘못된 위치 크기로 작업하고 거래 서버에 새로운 이중 주문을 보냅니다.


EA가 PositionSelect(Symbol()) 함수를 업데이트할 때까지 기다려야 하기 때문에 ( figurelli )의 접근 방식이 더 낫다고 생각합니다.


두 가지 접근 방식 모두 한계가 있습니다.

이제 이 문제의 원인이 명확하게 밝혀졌습니다. 각자는 자신의 전략에 따라 코드를 수정해야 합니다. 모든 경우에 적용할 수 있는 일반적인 방법은 없다고 생각합니다.

 
위대하고 강력한 mql5에 OrderSendReliable () 라이브러리가 필요합니까?
 
Ubzen :
위대하고 강력한 mql5에 OrderSendReliable () 라이브러리가 필요합니까?
나는 풍자가 어떤 도움이 될 수 있다고 생각하지 않습니다. 그러한 복잡성을 초래하는 것은 분명히 나쁜 디자인이지만.
 
angevoyageur :

두 가지 접근 방식 모두 한계가 있습니다.

이제 이 문제의 원인이 명확하게 밝혀졌습니다. 각자 자신의 전략에 따라 코드를 수정해야 합니다. 모든 경우에 적용할 수 있는 일반적인 방법은 없다고 생각합니다.


아니면 Metaquote 직원들의 "공식 성명서"를 기다려야 합니다.

서비스 데스크에서 이미 응답이 있습니까?

 
angevoyageur : 풍자가 도움이 될 수 있다고 생각하지 않습니다. 그러한 복잡성으로 이어지는 나쁜 디자인임이 분명합니다 .

내가 동의한다면 도움이 되지 않는다고 생각하시겠습니까? .

나는 방금 거래를 종료할 때까지 잠자는 솔루션이 OrderSendReliable()을 생각나게 한다고 가르쳤습니다. 나는 이것들이 더 우아하게 다루어졌을 것이라고 가르쳤다.

그것은 또한 old_documents 처리를 생각나게 합니다 ... 어디로 가는지 { 모든 거래가 중지되어야 합니다 }.

어쨌든 사과는 mql5를 선택하려는 것이 아닙니다.

 
snelle_moda :


아니면 Metaquote 직원들의 "공식 성명서"를 기다려야 합니다.

서비스 데스크에서 이미 응답이 있습니까?

아니요. 저는 그냥 그것에 대해 생각하고 있었습니다...관련된 모든 사람들이 이 문제에 대해 ServiceDesk에 티켓을 작성하면 유용할 것입니다. 그러나 MQ가 이 디자인을 변경할 의향이 있는지 매우 회의적입니다. 하지만 우리는 시도할 수 있습니다.

사람들은 ServiceDesk에 글을 쓰고 티켓 번호를 여기에서 보고할 수 있습니다. 내 것은

오류 , MetaTrader 5 MQL , 열기 , 시작: 2013.12.23 19:08 , #916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen :

내가 당신에게 동의한다면 도움이 되지 않는다면 고려하시겠습니까? .

나는 방금 거래를 종료할 때까지 잠자는 솔루션이 OrderSendReliable()을 생각나게 한다고 가르쳤습니다. 나는 이것들이 더 우아하게 다루어졌을 것이라고 가르쳤다.

그것은 또한 old_documents 처리를 생각나게 합니다 ... 어디로 가는지 { 모든 거래가 중지되어야 합니다 }.

어쨌든 사과는 mql5를 선택하려는 것이 아닙니다.

비슷한 문제가 mql4에도 존재할 수 없는지 궁금합니다. 지난 몇 달 동안 mql4 포럼에서 이중 거래에 대해 불만을 제기하는 사용자로부터 최소 2개의 주제를 읽었습니다. 관련이 있는지 확실하지 않지만 이러한 주제를 확인할 가치가 있습니다. 이것들도 읽나요?
 
angevoyageur : 비슷한 문제가 mql4에도 존재할 수 없는지 궁금합니다. 지난 몇 달 동안 mql4 포럼에서 이중 거래에 대해 불만을 제기하는 사용자로부터 최소 2개의 주제를 읽었습니다. 관련이 있는지 확실하지 않지만 이러한 주제를 확인할 가치가 있습니다. 이것들도 읽나요?

예, 하지만 잘못된 코딩 때문인지 말하기 어렵습니다. 이중 거래는 다중 거래 스레드 이전에도 문제였습니다. 전통적으로 처리되는 방식은 snelle_moda가 처리하는 방식입니다.

 
Ubzen :

예, 하지만 잘못된 코딩 때문인지 말하기 어렵습니다. 이중 거래는 다중 거래 스레드 이전에도 문제였습니다. 전통적으로 처리되는 방식은 snelle_moda가 처리하는 방식입니다.

무슨 말인지 이해가 잘 안가네요. 우리가 이 주제에서 이야기하는 이 문제는 잘못된 코딩으로 인한 것이 아니라 mql5의 잘못된 설계로 인해 발생합니다(내 의견이거나 단순히 버그 일 수도 있습니다). "다중 거래 스레드"는 무엇을 의미합니까?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.