私の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 Trades '800****': deal #27731692 buy 0.01 EURUSD at 1.36354 done(based on order#40018327)

2013.12.20 08:35:01 Trades '800****': 為替 0.01 EURUSD をマーケットで買う 331 ms で実行されました。

2013.12.20 08:35:01 Trades '800****': 取引 #27731691 buy 0.01 EURUSD at 1.36353 done (based on order #40018326)

2013.12.20 08:35:00 Trades '800****': 為替 買0.01 EURUSD at market

2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms

2013.12.20 08:35:00 Trades '800****': 為替の買い0.01 EURUSD at market

 

やっとスレッドを見つけました 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 Trades '800****': deal #27731692 buy 0.01 EURUSD at 1.36354 done(based on order#40018327)

2013.12.20 08:35:01 Trades '800****': 為替 0.01 EURUSD をマーケットで買う 331 ms で実行されました。

2013.12.20 08:35:01 Trades '800****': 取引 #27731691 buy 0.01 EURUSD at 1.36353 done (based on order #40018326)

2013.12.20 08:35:00 Trades '800****': 為替 買0.01 EURUSD at market

2013.12.20 08:35:00 Trades '800****': exchange buy 0.01 EURUSD at market placed for execution in 313 ms

2013.12.20 08:35:00 Trades '800****': 為替の買い0.01 EURUSD at market

  • これは、あなたが投稿したコードのログではありません(どこにPrint文の結果ですか?)
  • なぜSleep()を使う必要があるのでしょうか?それは不要です。
  • なぜループが必要なのですか?エラーの原因も確認せず、修正もしない。
  • ResultRetcode()やGetLastError()をチェックする必要があり、ResultComment()をチェックする必要はない。
 
  • これは投稿されたコードのログではありません(Print文の結果はどこにあるのでしょうか?)

エキスパートタブでは、EURUSDで開いたポジション 以外、Print文の出力はありません。

  • なぜSleep() を使う必要があるのでしょうか?それは不要です。
他のスレッドではsleepを使って解決しているようですが
  • ResultRetcode() や GetLastError() をチェックする必要があり、(ResultComment() だけではなく) ResultComment() もチェックする必要があります。

私はこれらについて読みます

しかし、if(!PositionSelect(Symbol()))

では、なぜ2回実行されるのでしょうか?

 
doshur:
  • これは投稿されたコードのログではありません(Print文の結果はどこにあるのでしょうか?)

エキスパートタブでは、EURUSDで開いたポジション 以外、Print文の出力はありません。

OK、それは2回印刷されているかどうか?
  • なぜSleep() を使う必要があるのでしょうか?それは不要です。

他のスレッドではsleepを使って解決しているようですが

何を解決するのでしょうか?
  • ResultRetcode() や GetLastError() をチェックする必要があり、(ResultComment() だけではなく) ResultComment() もチェックする必要があります。

私はこれらについて読みます

しかし、if(!PositionSelect(Symbol()))

では、なぜ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);
  }
 
ありがとうございます。何か見つけたらお知らせします。
理由: