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

Dua Yong Rew  

나는 같은 문제가 있었고 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 교환 구매

Dua Yong Rew  

마침내 스레드를 찾았습니다 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.
Alain Verleyen  
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()를 확인해야 합니다.
Dua Yong Rew  
  • 이것은 게시한 코드의 로그가 아닙니다(Print 문의 결과는 어디에 있습니까?).

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

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

나는 이것들을 읽을 것이다

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

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

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

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

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

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

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

나는 이것들을 읽을 것이다

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

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

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

예, 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.
Alain Verleyen  
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);
Dua Yong Rew  
angevoyageur :

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

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

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

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

m_Trade.SetAsyncMode(false);  

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

Alain Verleyen  
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.
Dua Yong Rew  

조사에 도움을 주셔서 감사합니다. 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);
  }
Alain Verleyen  
뭔가 찾으면 알려주시면 감사하겠습니다.
사유: