내 EA가 이중 항목을 수행합니다.

 

나는 같은 문제가 있었고 xxxx를 사용하는 사람을 기억합니다.

그 스레드를 찾을 수 없었습니다. 누군가가 저를 도울 수 있다면 큰 감사가 될 것입니다.

On_Tick()에서 다음과 같은 내 코드

 if (! PositionSelect ( Symbol ()))
             do
            {
               Price = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );

               if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , LotSize, Price, 0 , 0 ))
               {
                   Print ( "Position opened in " , Symbol ());
                   Sleep ( 100 );

                   break ;
               }
               else
               {
                  ErrorCount++;

                   printf ( "Error opening BUY position in %s : '%s'" , Symbol (), m_Trade.ResultComment());
               }

               if (ErrorCount == ErrCnt)
               {
                   Print ( "Error count = " , ErrCnt);
               }
            }
             while (ErrorCount < ErrCnt);

0.01 로트를 입력해야 하지만 대신 0.02 로트를 입력합니다.

저널에서

2013.12.20 08:35:01 거래 '800****': 거래 #27731692 1.36354에서 0.01 EURUSD 구매 완료( 주문 #40018327 기준)

2013.12.20 08:35:01 거래 '800****': 331ms 후 실행을 위해 배치된 시장에서 0.01 EURUSD 교환 구매

2013.12.20 08:35:01 거래 '800****': 거래 #27731691 1.36353에서 0.01 EURUSD 구매 완료(주문 #40018326 기준)

2013.12.20 08:35:00 거래 '800****': 시장에서 0.01 EURUSD 교환 구매

2013.12.20 08:35:00 거래 '800****': 313ms 후 실행을 위해 배치된 시장에서 0.01 EURUSD 교환 구매

2013.12.20 08:35:00 거래 '800****': 시장에서 0.01 EURUSD 교환 구매

 

마침내 스레드를 찾았습니다 https://www.mql5.com/en/forum/14327

해당 스레드를 찾는 데 2시간이 걸렸습니다... 어쨌든 EA가 충분히 오래 자지 않아서 이중 항목을 수행하는 이유는 무엇입니까?

Problem: Multiple Trades at brokerX
Problem: Multiple Trades at brokerX
  • www.mql5.com
Problem: Multiple Trades at brokerX.
 
doshur :

나는 같은 문제가 있었고 xxxx를 사용하는 사람을 기억합니다.

그 스레드를 찾을 수 없었습니다. 누군가가 저를 도울 수 있다면 큰 감사가 될 것입니다.

On_Tick()에서 다음과 같은 내 코드

0.01 로트를 입력해야 하지만 대신 0.02 로트를 입력합니다.

저널에서

2013.12.20 08:35:01 거래 '800****': 거래 #27731692 1.36354에서 0.01 EURUSD 구매 완료( 주문 #40018327 기준)

2013.12.20 08:35:01 거래 '800****': 331ms 후 실행을 위해 배치된 시장에서 0.01 EURUSD 교환 구매

2013.12.20 08:35:01 거래 '800****': 거래 #27731691 1.36353에 0.01 EURUSD 구매 완료(주문 #40018326 기준)

2013.12.20 08:35:00 거래 '800****': 시장에서 0.01 EURUSD 교환 구매

2013.12.20 08:35:00 거래 '800****': 313ms 후 실행을 위해 배치된 시장에서 0.01 EURUSD 교환 구매

2013.12.20 08:35:00 거래 '800****': 시장에서 0.01 EURUSD 교환 구매

  • 이것은 게시한 코드의 로그가 아닙니다(Print 문의 결과는 어디에 있습니까?).
  • 왜 Sleep()을 사용해야 합니까? 불필요하다.
  • 왜 루프가 필요합니까? 오류의 원인을 확인하지도 않았으니 시정하지도 마십시오.
  • ResultComment()가 아니라 ResultRetcode() 및/또는 GetLastError()를 확인해야 합니다.
 
  • 이것은 게시한 코드의 로그가 아닙니다(Print 문의 결과는 어디에 있습니까?).

전문가 탭 아래에는 EURUSD에서 열린 포지션 외에는 인쇄 명세서의 출력이 없습니다.

다른 스레드가 절전 모드를 사용하여 해결하는 것 같습니다.
  • ResultComment()가 아니라 ResultRetcode() 및/또는 GetLastError()를 확인해야 합니다.

나는 이것들을 읽을 것이다

그러나 if (! PositionSelect ( 기호 ()))

왜 여전히 2 번 실행됩니까?

 
doshur :
  • 이것은 게시한 코드의 로그가 아닙니다(Print 문의 결과는 어디에 있습니까?).

전문가 탭 아래에는 EURUSD에서 열린 포지션 외에는 인쇄 명세서의 출력이 없습니다.

자, 그럼 2번 출력되겠죠?

다른 스레드가 절전 모드를 사용하여 해결하는 것 같습니다.

무엇을 해결?
  • ResultComment()가 아니라 ResultRetcode() 및/또는 GetLastError()를 확인해야 합니다.

나는 이것들을 읽을 것이다

하지만 if (! PositionSelect ( 기호 ()))

왜 여전히 2 번 실행됩니까?

우리는 답을 찾기 위해 노력하고 있습니다. 포지션을 열 때마다 이 문제가 발생합니까?
 

예, 2번 인쇄되었습니다. > 포지션은 EURUSD로 열렸습니다.

다른 사용자가 보고한 동일한 문제 > https://www.mql5.com/en/forum/14327

350ms로 절전 모드를 사용하여 해결

내 EA는 이 전에 2번의 다른 거래를 했고 완벽하게 괜찮습니다.

내 EA가 이미 주문 처리를 완료했고 중개인이 아직 거래 세부 정보를 반환하지 않았고 내 EA가 2개의 항목을 유발하는 새 틱을 처리했다면?

Problem: Multiple Trades at brokerX
Problem: Multiple Trades at brokerX
  • www.mql5.com
Problem: Multiple Trades at brokerX.
 
doshur :

예, 2번 인쇄되었습니다. > 포지션은 EURUSD로 개설되었습니다.

다른 사용자가 보고한 동일한 문제 > https://www.mql5.com/en/forum/14327

350ms로 절전 모드를 사용하여 해결

내 EA는 이 전에 2번의 다른 거래를 했고 완벽하게 괜찮습니다.

내 EA가 이미 주문 처리를 완료했고 중개인이 아직 거래 세부 정보를 반환하지 않았고 내 EA가 2개의 항목을 유발하는 새 틱을 처리했다면?

이것은 가능한 설명처럼 보이지만, 만약 그렇다면 정상이 아닙니다. 비동기 모드를 사용하고 있습니까? 그렇지 않은 경우 EA는 서버의 응답을 기다렸다가 다음 틱만 계속 진행해야 합니다.

내가 잘 이해한다면 이것은 임의의 문제이며 재현할 수 없습니까?

m_Trade 선언 뒤에 다음 줄을 추가하여 더 많은 디버그 정보를 인쇄할 수 있습니다.

m_Trade.LogLevel(LOG_LEVEL_ALL);
 
angevoyageur :

이것은 가능한 설명처럼 보이지만, 만약 그렇다면 정상이 아닙니다. 비동기 모드를 사용하고 있습니까? 그렇지 않은 경우 EA는 서버의 응답을 기다렸다가 다음 틱만 계속 진행해야 합니다.

내가 잘 이해한다면 이것은 임의의 문제이며 재현할 수 없습니까?

m_Trade 선언 뒤에 다음 줄을 추가하여 더 많은 디버그 정보를 인쇄할 수 있습니다.

나는 cTrade 클래스를 사용하고 있습니다. 비동기 모드는 기본적으로 켜져 있습니까?

m_Trade.SetAsyncMode(false);  

이것을 on_init() 안에 설정해야 합니까?

 
doshur :

나는 cTrade 클래스를 사용하고 있습니다. 비동기 모드는 기본적으로 켜져 있습니까?

m_Trade.SetAsyncMode(false);  

이것을 on_init() 안에 설정해야 합니까?

일반적으로 기본적으로 false입니다. 그리고 사용 중인 코드는 false여야 합니다.

당신이보고 한 것은 "흥미로운"것입니다. 제 생각에는 정상적인 행동이 아니며 어딘가에 버그가있는 것 같습니다. 오류를 재현하기 위해 샘플 코드를 게시할 수 있습니까? 어쨌든 이 문제에 대해 조사하겠습니다.

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.
 

조사에 도움을 주셔서 감사합니다. EA를 개발할 때 사용한 템플릿을 첨부하겠습니다. Sleep()은 이전에 100ms에 있었고 다른 사용자가 시작한 스레드를 읽은 후 방금 800으로 업데이트했습니다.

 //+------------------------------------------------------------------+
//|                                                     Template.mq5 |
//|                                                           doshur |
//|                                     http://tradeaud.blogspot.com |
//+------------------------------------------------------------------+
#property copyright "doshur"
#property link        "http://tradeaud.blogspot.com"
#property version    "1.00"

#include <Trade\Trade.mqh>

#define   ErrCnt   5

//--- Input Parameters
input int     TP        = 50 ;
input int     SL        = 40 ;
input double LotSize   = 0.01 ;

//--- Buffers
double    MA_Fast[];
double    MA_Slow[];

//--- Handles
int       h_MA_Fast;
int       h_MA_Slow;

//--- Globals
double    AdjPoints;

CTrade   m_Trade;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

   h_MA_Fast = iDEMA ( Symbol (), 0 , 3 , 0 , PRICE_CLOSE );
   h_MA_Slow = iDEMA ( Symbol (), 0 , 5 , 0 , PRICE_CLOSE );

//---

   long    SymDigits;
   double SymPoints;

   SymPoints = SymbolInfoDouble ( Symbol (), SYMBOL_POINT );
   SymDigits = SymbolInfoInteger ( Symbol (), SYMBOL_DIGITS );

   if (SymDigits == 3 || SymDigits == 5 )
   {
        AdjPoints = SymPoints * 10 ;
   }
   else
   {
        AdjPoints = SymPoints;
   }

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

   IndicatorRelease (h_MA_Fast);
   IndicatorRelease (h_MA_Slow);

//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---

   if (!CopyBufferAsSeries(h_MA_Fast, 0 , 0 , 3 , true , MA_Fast)) return ;
   if (!CopyBufferAsSeries(h_MA_Slow, 0 , 0 , 3 , true , MA_Slow)) return ;

//---

   double    Price;
   ulong     SymSpread;
   int       ErrorCount;

   ErrorCount = 0 ;
   SymSpread  = SymbolInfoInteger ( Symbol (), SYMBOL_SPREAD );

   m_Trade.SetDeviationInPoints(SymSpread);

   MqlDateTime sTime;
   TimeCurrent (sTime);

//---

   if (! PositionSelect ( Symbol ()))
   if (TradeCount( PERIOD_CURRENT ) == 0 )
   {
       // Open BUY Position
       if (MA_Fast[ 0 ] > MA_Slow[ 0 ] && MA_Fast[ 1 ] < MA_Slow[ 1 ])
      {
         //
         {
             do
            {
               Price = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );

               if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , LotSize, Price, 0 , 0 ))
               {
                   Print ( "Position opened in " , Symbol ());
                   Sleep ( 800 );

                   break ;
               }
               else
               {
                  ErrorCount++;

                   Print ( "Error opening BUY position in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription());
               }

               if (ErrorCount == ErrCnt)
               {
                   Print ( "Error count = " , ErrCnt);
               }
            }
             while (ErrorCount < ErrCnt);
         }
      }

       // Open SELL Position
       if (MA_Fast[ 0 ] < MA_Slow[ 0 ] && MA_Fast[ 1 ] > MA_Slow[ 1 ])
      {
         //
         {
             do
            {
               Price = SymbolInfoDouble ( Symbol (), SYMBOL_BID );

               if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_SELL , LotSize, Price, 0 , 0 ))
               {
                   Print ( "Position opened in " , Symbol ());
                   Sleep ( 800 );

                   break ;
               }
               else
               {
                  ErrorCount++;

                   Print ( "Error opening SELL position in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription());
               }

               if (ErrorCount == ErrCnt)
               {
                   Print ( "Error count = " , ErrCnt);
               }
            }
             while (ErrorCount < ErrCnt);
         }
      }
   }

//---

   long      Pos_OT, Pos_HT;
   double    Pos_OP;

   if ( PositionSelect ( Symbol ()))
   {
      Pos_OT = PositionGetInteger ( POSITION_TIME );
      Pos_HT = TimeCurrent () - Pos_OT;
      Pos_OP = PositionGetDouble ( POSITION_PRICE_OPEN );
      Price  = PositionGetDouble ( POSITION_PRICE_CURRENT );

       if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
      {
         // Take Profit
         if (Price - Pos_OP >= TP * AdjPoints)
         {
            m_Trade.PositionClose( Symbol (), SymSpread);

             Sleep ( 800 );
         }

         // Stop Loss
         if (Pos_OP - Price >= SL * AdjPoints)
         {
            m_Trade.PositionClose( Symbol (), SymSpread);

             Sleep ( 800 );
         }
      }

       if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
      {
         // Take Profit
         if (Pos_OP - Price >= TP * AdjPoints)
         {
            m_Trade.PositionClose( Symbol (), SymSpread);

             Sleep ( 800 );
         }

         // Stop Loss
         if (Price - Pos_OP >= SL * AdjPoints)
         {
            m_Trade.PositionClose( Symbol (), SymSpread);

             Sleep ( 800 );
         }
      }
   }

//---
  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester ()
  {
//---
//---
  }
//+------------------------------------------------------------------+
//| Copy Buffer As Series                                            |
//+------------------------------------------------------------------+
bool CopyBufferAsSeries( int handle, int buffer, int start, int number, bool asSeries, double &M[])
  {
//---

   if ( CopyBuffer (handle, buffer, start, number, M) <= 0 ) return ( false );

   ArraySetAsSeries (M, asSeries);

   return ( true );

//---
  }
//+------------------------------------------------------------------+
//| Trade Count                                                      |
//+------------------------------------------------------------------+
int TradeCount( ENUM_TIMEFRAMES TimeFrame)
  {
//---

   int       Cnt;
   ulong     Ticket;
   long      EntryType;
   datetime DT[ 1 ];

   Cnt = 0 ;

   if ( CopyTime ( Symbol (), TimeFrame, 0 , 1 , DT) <= 0 )
   {
      Cnt = - 1 ;
   }
   else
   {
       HistorySelect (DT[ 0 ], TimeCurrent ());

       for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--)
      {
         Ticket    = HistoryDealGetTicket (i);
         EntryType = HistoryDealGetInteger (Ticket, DEAL_ENTRY );

         if (EntryType == DEAL_ENTRY_IN )
         if ( Symbol () == HistoryDealGetString (Ticket, DEAL_SYMBOL ))
         {
            Cnt++;
         }
      }
   }

//---
   return (Cnt);
  }
 
뭔가 찾으면 알려주시면 감사하겠습니다.