EA'm çift giriş yapıyor

 

Aynı sorunu yaşayan ve xxxx kullanan birini hatırlıyorum.

Konuyu bulamadım, yardımcı olabilecek biri varsa çok teşekkur ederim.

On_Tick() içinde aşağıdaki gibi kodlarım

 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 lot girilmeli, bunun yerine 0.02 lot girilmelidir.

dergiden

2013.12.20 08:35:01 ticaret '800****': anlaşma #27731692, 1.36354'ten 0.01 EURUSD satın aldı ( sipariş #40018327)

2013.12.20 08:35:01 ticaret '800****': 331 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alımı

2013.12.20 08:35:01 ticaret '800****': anlaşma #27731691, 1.36353'ten 0.01 EURUSD satın alın (#40018326 numaralı siparişe göre)

2013.12.20 08:35:00 ticaret '800****': borsada 0,01 EURUSD satın al

2013.12.20 08:35:00 ticaret '800****': 313 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alımı

2013.12.20 08:35:00 ticaret '800****': borsada 0,01 EURUSD satın al

 

Sonunda konuyu buldum https://www.mql5.com/en/forum/14327

sadece o konuyu bulmam 2 saatimi aldı... Neyse EA yeterince uzun süre uyumuyor değil, bu yüzden çift giriş yapıyor?

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

Aynı sorunu yaşayan ve xxxx kullanan birini hatırlıyorum.

Konuyu bulamadım, yardımcı olabilecek biri varsa çok teşekkur ederim.

On_Tick() içinde aşağıdaki gibi kodlarım

0.01 lot girilmeli, bunun yerine 0.02 lot girilmelidir.

dergiden

2013.12.20 08:35:01 ticaret '800****': anlaşma #27731692, 1.36354'ten 0.01 EURUSD satın aldı ( sipariş #40018327)

2013.12.20 08:35:01 ticaret '800****': 331 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alımı

2013.12.20 08:35:01 ticaret '800****': anlaşma #27731691, 1.36353'ten 0.01 EURUSD satın alın (#40018326 numaralı siparişe göre)

2013.12.20 08:35:00 ticaret '800****': borsada 0,01 EURUSD satın al

2013.12.20 08:35:00 ticaret '800****': 313 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alımı

2013.12.20 08:35:00 ticaret '800****': borsada 0,01 EURUSD satın al

  • Bu, gönderdiğiniz kodun günlüğü değil (Yazdır ifadesinin sonuçları nerede?).
  • Neden Sleep() kullanmanız gerekiyor? Bu gereksiz.
  • Neden bir döngüye ihtiyacınız var? Hatanın nedenini bile kontrol etmiyorsunuz ve bu yüzden düzeltmiyorsunuz.
  • ResultRetcode() ve/veya GetLastError()'u kontrol etmeniz gerekir, (yalnızca) ResultComment()'i değil.
 
  • Bu, gönderdiğiniz kodun günlüğü değil (Yazdır ifadesinin sonuçları nerede?).

Uzman sekmesi altında, EURUSD'de açılan Pozisyon dışında print ekstresinden çıktı yoktur.

diğer iş parçacığı uyku kullanarak çözüyor gibi görünüyor
  • ResultRetcode() ve/veya GetLastError()'u kontrol etmeniz gerekir, (yalnızca) ResultComment()'i değil.

bunları okuyacağım

Ancak if (! PositionSelect ( Symbol ())) ile

neden hala 2 kez yürütülüyor?

 
doshur :
  • Bu, gönderdiğiniz kodun günlüğü değil (Yazdır ifadesinin sonuçları nerede?).

Uzman sekmesi altında, EURUSD'de açılan Pozisyon dışında print ekstresinden çıktı yoktur.

Tamam, yani 2 kez basıldı mı, basılmadı mı?

diğer iş parçacığı uyku kullanarak çözüyor gibi görünüyor

Neyi çöz?
  • ResultRetcode() ve/veya GetLastError()'u kontrol etmeniz gerekir, (yalnızca) ResultComment()'i değil.

bunları okuyacağım

Ancak if (! PositionSelect ( Symbol ())) ile

neden hala 2 kez yürütülüyor?

Cevabı bulmaya çalışıyoruz. Bu sorun her pozisyon açtığınızda mı oluyor?
 

Evet, 2 kez yazdırıldı > EURUSD'de açılan pozisyon

Başka bir kullanıcı tarafından bildirilen aynı sorun > https://www.mql5.com/en/forum/14327

350ms ile uyku kullanılarak çözüldü

EA'm bundan önce 2 işlem daha yaptı ve gayet iyi.

EA'm siparişi işlemeyi çoktan bitirmişse ve komisyoncu henüz ticari ayrıntıları bana geri vermemişse ve EA'm 2 girişe neden olan yeni bir onay onaylamış mı diye düşünüyorum.

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

Evet, 2 kez yazdırıldı > EURUSD'de açılan pozisyon

Başka bir kullanıcı tarafından bildirilen aynı sorun > https://www.mql5.com/en/forum/14327

350ms ile uyku kullanılarak çözüldü

EA'm bundan önce 2 işlem daha yaptı ve gayet iyi.

EA'm siparişi işlemeyi çoktan bitirmişse ve komisyoncu henüz ticari ayrıntıları bana geri vermemişse ve EA'm 2 girişe neden olan yeni bir onay onaylamış mı diye düşünüyorum.

Bu olası bir açıklama gibi görünüyor, ancak durum buysa normal değil. Asenkron mod mu kullanıyorsunuz? Değilse, EA'nız sunucunun yanıtını beklemeli ve ardından yalnızca devam etmeli ve bir sonraki onay işaretini işlemelidir.

İyi anlarsam, bu rastgele bir sorundur ve yeniden üretemez misiniz?

m_Trade beyanından sonra bu satırı ekleyerek daha fazla hata ayıklama bilgisi yazdırmayı deneyebilirsiniz:

m_Trade.LogLevel(LOG_LEVEL_ALL);
 
angevoyageur :

Bu olası bir açıklama gibi görünüyor, ancak durum buysa normal değil. Asenkron mod mu kullanıyorsunuz? Değilse, EA'nız sunucunun yanıtını beklemeli ve ardından yalnızca devam etmeli ve bir sonraki onay işaretini işlemelidir.

İyi anlarsam, bu rastgele bir sorundur ve yeniden üretemez misiniz?

m_Trade beyanından sonra bu satırı ekleyerek daha fazla hata ayıklama bilgisi yazdırmayı deneyebilirsiniz:

cTrade sınıfını kullanıyorum. Asenkron mod varsayılan olarak açık mı?

bunu kullanmamı önerir misiniz m_Trade.SetAsyncMode(false);  

Bunu on_init() içine ayarlamalı mıyım?

 
doshur :

cTrade sınıfını kullanıyorum. Asenkron mod varsayılan olarak açık mı?

bunu kullanmamı önerir misiniz m_Trade.SetAsyncMode(false);  

Bunu on_init() içine ayarlamalı mıyım?

Normalde varsayılan olarak yanlıştır. Ve kullandığınız kodla birlikte false olmalıdır.

Rapor ettiğiniz şey "ilginç", bence bu normal bir davranış değil ve bir yerlerde bir hata var gibi görünüyor. Hatayı yeniden oluşturmak için bir örnek kod gönderme olanağınız var mı? Her durumda, bu konuyu araştıracağım.

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.
 

Araştırma yardımınız için teşekkürler, EA'mı geliştirmek için kullandığım şablonumu ekleyeceğim. Sleep() daha önce 100ms'deydi, başka bir kullanıcı tarafından başlatılan iş parçacığını okuduktan sonra 800 olarak güncelledim.

 //+------------------------------------------------------------------+
//|                                                     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);
  }
 
Teşekkür ederim bir şey bulursam haber veririm.
Neden: