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

 

sleep 을 사용 하면 진드기가 사라집니까?

결과는 어떻게 될까요? 나와 공유할 수 있습니까?

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur :

sleep 을 사용 하면 진드기가 사라집니까?

결과는 어떻게 될까요? 나와 공유할 수 있습니까?

그것은 당신의 전략에 달려 있습니다. "이중 거래"에 대한 이 문제는 거래 코드가 각 틱에서 실행될 때만 발생할 수 있으므로 틱에 의존하는 전략이 있을 수 있습니다. 따라서 지연(수면) 중에 도착하는 틱을 잃어버리면 어떤 결과가 발생할 수 있는지 평가하는 것은 사용자의 몫입니다.

 
angevoyageur :

그것은 당신의 전략에 달려 있습니다. "이중 거래"에 대한 이 문제는 거래 코드가 각 틱에서 실행될 때만 발생할 수 있으므로 틱에 의존하는 전략이 있을 수 있습니다. 따라서 지연(수면) 중에 도착하는 틱을 잃어버리면 어떤 결과가 발생할 수 있는지 평가하는 것은 사용자의 몫입니다.

그래서 내가 800을 자면

다음 800ms 동안 틱을 잃는다는 의미입니까? 내 거래를 입력한 후 내 EA는 아무 것도 하지 않고 TP 또는 SL까지 거기에 앉아 있거나 시간이 종료될 때까지 기다립니다.

그래서 내가 sleep 을 사용 하면 내 전략은 괜찮습니까?

refreshrates()를 호출하면 틱이 다시 나타납니까?

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur :

그래서 내가 800을 자면

다음 800ms 동안 틱을 잃는다는 의미입니까? 내 거래를 입력한 후 내 EA는 아무 것도 하지 않고 TP 또는 SL까지 거기에 앉아 있거나 시간이 종료될 때까지 기다립니다.

그래서 내가 sleep 을 사용 하면 내 전략은 괜찮습니까?

refreshrates()를 호출하면 틱이 다시 나타납니까?

doshur, 당신을 느슨하게 틱, 당신은 느슨하게, 웨이백 머신이 없습니다.

https://www.mql5.com/en/docs/common/sleep 의 문서와 관련하여 함수 는 지정된 간격 내에서 현재 Expert Advisor 또는 스크립트의 실행을 일시 중단합니다.

따라서 EA가 하나의 스레드만 사용하기 때문에 OnTimer 이벤트도 일시 중단됩니다.

따라서 고정 수면을 사용하는 것은 최종적인 솔루션이 아니며 단지 "수비학"입니다. 즉, 지연이 값보다 낮은 경우 해결 방법입니다.

그리고 이것이 내가 거래를 연 후 PositionSelect 루프 테스트를 제안하는 이유입니다. PositionOpen 실행을 두 번 확인하고 Sleep()보다 더 나은 해결 방법으로 반환하고 문제의 원인도 해결합니다( angevoyageur 테스트에 따르면).

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 

이것이 제가 지금 사용하고 있는 것입니다. 더 우아한 방식으로 figurelli에서 제공하는 해결 방법을 어디에서 코딩해야 하나요?

 //
         {
            Price = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );

             if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , LotSize, Price, 0 , 0 ))
            {
               Sleep ( 800 );

               if (m_Trade.ResultRetcode() == 10009 )
               {
                   Print ( "Position opened in " , Symbol ());

                   return ;
               }
               else
               {
                   Print ( "Error opening position in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription());
               }
            }
             else
            {
               Print ( "Error with PositionOpen in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription());
            }
         }
 
doshur :

이것이 제가 지금 사용하고 있는 것입니다. 더 우아한 방식으로 figurelli에서 제공하는 해결 방법을 어디에서 코딩해야 하나요?

안녕 doshur, 나는 또한 내 EA 중 하나에서 이중 항목에 문제가 있었습니다. 실제로 이러한 문제는 유동성이 높은 자산을 거래할 때만 발생했습니다. 비동기 모드로 보내도록 주문을 설정한 후에도 EA는 "분명히" 서버 응답이 PositionsTotal()을 업데이트하는 데 너무 오래 대기하고 있었습니다... 한편, 다른 들어오는 틱은 두 번째 주문을 보내기 위한 조건을 트리거했습니다... in 포르투갈 포럼에 해결 방법을 게시했는데 여기에서 공유하고 싶습니다.

아이디어는 간단합니다.

//--- global variables
CTrade trade;
bool position_opened= false ;

//--- inside OnTick()
if ( conditions to open && position_opened== false )
  {
   //--- set the global variable to true to avoid duplicate orders
   position_opened= true ;
   trade.PositionOpen( _Symbol ,order_type,lot,price,sl,tp, "comment" );
  }

이 코드의 유일한 문제는 서버에서 주문을 수락하지 않는 경우이므로 전역 변수를 "재설정"해야 합니다... 다음을 사용할 수 있습니다.

 MqlTradeResult mresult;

//--- 
if (mresult.retcode== 10009 || mresult.retcode== 10008 )
  { Print ( "Success!" );}
else 
  {
   Print ( "Error = " , GetLastError ());
   ResetLastError ();
   //--- Sets the global variable to false
   position_opened= false ;
   return ;
  }

따라서 보낸 첫 번째 주문이 오류를 반환하는 경우 전역 변수가 false로 설정되어 EA가 다른 주문을 보낼 수 있습니다. 그러나 나는이 코드를 주식과 선물에서만 테스트했지만 forex 시장에서는 테스트하지 않았다고 말해야합니다 ... :-(

 
Malacarne :

안녕 doshur, 나는 또한 내 EA 중 하나에서 이중 항목에 문제가 있었습니다. 실제로 이러한 문제는 유동성이 높은 자산을 거래할 때만 발생했습니다. 비동기 모드로 보내도록 주문을 설정한 후에도 EA는 "분명히" 서버 응답이 PositionsTotal()을 업데이트하는 데 너무 오래 대기하고 있었습니다... 한편, 다른 들어오는 틱은 두 번째 주문을 보내기 위한 조건을 트리거했습니다... in 포르투갈 포럼에 해결 방법을 게시했는데 여기에서 공유하고 싶습니다.

아이디어는 간단합니다.

이 코드의 유일한 문제는 서버에서 주문을 수락하지 않는 경우이므로 전역 변수를 "재설정"해야 합니다... 다음을 사용할 수 있습니다.

따라서 보낸 첫 번째 주문이 오류를 반환하는 경우 전역 변수가 false로 설정되어 EA가 다른 주문을 보낼 수 있습니다. 그러나 나는이 코드를 주식과 선물에서만 테스트했지만 forex 시장에서는 테스트하지 않았다고 말해야합니다 ... :-(

이것은 실행 가능한 것 같습니다. figurelligevoyageur 가 이 해결 방법에 대한 의견이 있는지 봅시다...
 
doshur :
이것은 실행 가능한 것 같습니다. figurelligevoyageur 가 이 해결 방법에 대한 의견이 있는지 봅시다...

Malacarne이 제안한 이 솔루션(일부 조정 포함)은 훌륭합니다. 왜냐하면 Malacarne이 겸손하게 언급하는 것처럼 저에게는 해결 방법이 아니라 이 질문을 해결하는 우아하고 올바른 방법이기 때문입니다.

내 의견으로는 이중 항목의 원래 문제는 MT5 버그가 아니라 다음 도움말에서 설명하는 코딩 버그입니다.

" PositionOpen(...) 메서드가 성공적으로 완료되었다고 해서 반드시 거래가 성공적으로 수행되는 것은 아닙니다 . ResultRetcode()와 ResultDeal() 에서 반환한 값을 사용하여 거래 요청 결과(거래 서버 반환 코드)를 확인해야 합니다. ."

따라서 모든 시장 상황에 보다 탄력적으로 대처할 수 있도록 약간의 변경을 제안합니다.

1) PostionOpen()이 원래 코드로 반환되는지도 테스트합니다. 예를 들면 다음과 같습니다.

 if (trade.PositionOpen( _Symbol ,order_type,lot,price,sl,tp, "comment" )) position_opened= true ;

2) 10010 - TRADE_RETCODE_DONE_PARTIAL - 요청의 일부만 완료되었습니다. 또한 10008 - TRADE_RETCODE_PLACED - 주문한 것은 나에게 성공이 아니라 10009 - TRADE_RETCODE_DONE - 요청이 완료되었으며 이것은 비동기식 메시지이므로 Malacarne 코드의 두 번째 부분은 거래가 실행된 후 이 티켓 및/또는 거래 티켓을 고려할 수 있습니다. 도.

어쨌든, 나에게 우리는 지금 올바른 길을 가고 있고 최종 컷인 것 같습니다.

 
Malacarne :

안녕 doshur, 나는 또한 내 EA 중 하나에서 이중 항목에 문제가 있었습니다. 실제로 이러한 문제는 유동성이 높은 자산을 거래할 때만 발생했습니다. 비동기 모드로 보내도록 주문을 설정한 후에도 EA는 "분명히" 서버 응답이 PositionsTotal()을 업데이트하는 데 너무 오래 대기하고 있었습니다... 한편, 다른 들어오는 틱은 두 번째 주문을 보내기 위한 조건을 트리거했습니다... in 포르투갈 포럼에 해결 방법을 게시했는데 여기에서 공유하고 싶습니다.

아이디어는 간단합니다.

이 코드의 유일한 문제는 서버에서 주문을 수락하지 않는 경우이므로 전역 변수를 "재설정"해야 합니다... 다음을 사용할 수 있습니다.

따라서 보낸 첫 번째 주문이 오류를 반환하는 경우 전역 변수가 false로 설정되어 EA가 다른 주문을 보낼 수 있습니다. 그러나 나는이 코드를 주식과 선물에서만 테스트했지만 forex 시장에서는 테스트하지 않았다고 말해야합니다 ... :-(

유효한 접근 방식이지만 위치가 닫힐 때 전역 변수 position_opened를 false로 재설정해야 합니다. 어디서 하는거야?

구현 정보:

  1. position_opened를 true로 설정한 다음 오류가 있는 경우 false로 설정할 필요가 없습니다.
  2. CTrade 클래스의 개체를 사용하고 있으므로 새 MqlTradeResult 구조를 사용할 필요가 없습니다.
  3. Figurelli가 그의 게시물에서 언급했듯이 PositionOpen의 반환 값을 확인해야 합니다.
  4. 클래스 이름은 Ctrade가 아니라 CTrade입니다. mql5는 대소문자를 구분합니다.
  5. position_opened는 bool이므로 false와 비교할 필요가 없습니다. 그렇게 하면 '='가 아니라 '=='를 사용해야 합니다.

다음은 수정된 코드입니다( 컴파일되었지만 테스트되지 않음 ).

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#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 ;
        }

     }
//--- 
  }
//+------------------------------------------------------------------+
 
figurelli :

...

내 의견으로는 이중 항목의 원래 문제는 MT5 버그가 아니라 다음 도움말에서 설명하는 코딩 버그입니다.

" PositionOpen(...) 메서드가 성공적으로 완료되었다고 해서 반드시 거래가 성공적으로 수행되는 것은 아닙니다 . ResultRetcode()와 ResultDeal() 에서 반환한 값을 사용하여 거래 요청 결과(거래 서버 반환 코드)를 확인해야 합니다. ."

나는 그것이이 주제의 문제와 관련이 있다고 생각하지 않습니다. 우리가 얻는 문제는 요청이 성공적으로 채워지고 포지션이 열린 경우입니다. 그러나 이 포지션은 거래 서버에서 열렸고, 우리가 직면한 문제는 평소와 같이 더 중요한 지연이 있고 새로운 틱이 이미 처리된 후 MT5 터미널에 이 새로운 포지션에 대한 알림이 있을 때입니다.

이런 식으로 설계되었으므로 버그가 아닙니다. 그러나 제 생각에는 명시적으로 동기 및 비동기 거래 요청을 허용하는 플랫폼에 적합하지 않게 설계되었습니다. 우리는 여기에서 동기적이어야 하는 요청에 대해 이야기하고 있지만 실제로 요청에 대한 서버로부터 응답을 받을 때(위 코드의 trade.ResultRetCode) MT5를 기다려야 하므로 실제로 동기적이지 않습니다. 거래 결과에 대해 알리고 업데이트하는 플랫폼. (이 스레드로 모든 것을 이해했습니다.)

그래서 저는 어떤 시장 상황에도 더 탄력적으로 대처할 수 있도록 약간의 변화를 제안합니다.

1) PostionOpen()이 원래 코드로 반환되는지도 테스트합니다. 예를 들면 다음과 같습니다.

2) 10010 - TRADE_RETCODE_DONE_PARTIAL - 요청의 일부만 완료되었습니다. 또한, 10008 - TRADE_RETCODE_PLACED - 주문한 것은 나에게 성공이 아니라 10009 - TRADE_RETCODE_DONE - 요청이 완료되었으며 이것은 비동기 메시지 이므로 Malacarne 코드의 두 번째 부분은 거래가 실행된 후 이 및/또는 거래 티켓을 고려할 수 있습니다. 도.

어쨌든, 나에게 우리는 지금 올바른 길과 최종 컷에 있는 것 같습니다.

물론 PositionOpen의 반환 값과 거래 결과의 반환 코드를 확인해야 하는 것은 절대적으로 옳습니다. 그러나 ResultRetCode는 동기식이며 비동기식인 위치(거래 및 주문)에 대한 MT5 데이터베이스의 업데이트입니다. 귀하의 제안으로 수행한 테스트 는 물론 거래 요청의 반환된 값을 확인하는 코드를 사용하기 때문에 이를 입증했습니다.