やっとスレッドを見つけました https://www.mql5.com/en/forum/14327
そのスレッドを見つけるだけで2時間かかりました...とにかく、EAは十分に長く眠っていないため、ダブルエントリーをするのではありませんか?
同じ悩みを持つ人がいて、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() を使う必要があるのでしょうか?それは不要です。
- ResultRetcode() や GetLastError() をチェックする必要があり、(ResultComment() だけではなく) ResultComment() もチェックする必要があります。
私はこれらについて読みます
しかし、if(!PositionSelect(Symbol())) で
では、なぜ2回実行されるのでしょうか?
- これは投稿されたコードのログではありません(Print文の結果はどこにあるのでしょうか?)
エキスパートタブでは、EURUSDで開いたポジション 以外、Print文の出力はありません。
- なぜ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つのエントリーを引き起こしたのではないかと考えているのですが、いかがでしょうか?
これは可能な説明のように見えますが、もしそうなら、それは正常ではありません。非同期モードを使っていますか?もしそうでなければ、EAはサーバーからの応答を待って、それから次のティックを処理する必要があります。
もし私がよく理解していれば、これはランダムな問題であり、あなたはそれを再現することができないのですか?
m_Trade の宣言の後に次の行を追加することで、より多くのデバッグ情報を表示することができます。
m_Trade.LogLevel(LOG_LEVEL_ALL);
これは可能な説明のようですが、もしそうであれば、それは正常ではありません。非同期モードを使用していますか?そうでない場合、EAはサーバーからの応答を待ち、その後、次のティックを継続して処理する必要があります。
もし私がよく理解していれば、これはランダムな問題であり、あなたはそれを再現することができないのですか?
m_Tradeの宣言の後にこの行を追加することによって、より多くのデバッグ情報を表示することができます。
私はcTrade クラスを使っています。非同期モードはデフォルトでオンになっていますか?
この m_Trade.SetAsyncMode(false)を使用することをお勧め しますか?
on_init()の中でこれを設定すべきですか?
cTradeクラスを使っています。非同期モードはデフォルトでオンになっていますか?
この m_Trade.SetAsyncMode(false)を使用することをお勧め します。
on_init()の中でこれを設定すべきですか?
通常、デフォルトではfalseです。そして、あなたが使っているコードでは、falseでなければなりません。
あなたの報告は「興味深い」ものですが、私の意見では、それは正常な動作ではなく、どこかにバグが あるようです。エラーを再現するためのサンプルコードを投稿することは可能でしょうか?いずれにせよ、私はこの問題について調査します。
- www.mql5.com
調査への協力ありがとうございます。私が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); }
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
同じ悩みを持つ人がいて、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