私のEAではダブルエントリーを行います - ページ 3

 
doshur:
オーム。では、スリープは助けにならないのですか?

これを避けるにはどうしたらいいのでしょうか?

私には役に立ちました。snelle_modas tipに加え、sleepを使いました。それでうまくいきました。

しかし、それ以来、私はトレードの開き方を見直しました。今はどちらの解決策も必要ありません。以下は、私が昨日angevoyageurに書いたものです。お役に立てれば幸いです。

こんにちは。

前回解決したのは、取引後にスリープ 機能を使うことでした。しかし、私の新しいボットでは、これはもう必要ありません。おそらく、トレードの開始が異なる方法で処理されるようになったからでしょう。この問題があった最初のボット(多分他のEAもこの方法で取引を開始し、そのために問題があったのでしょう(例えばmetaquant))は、この方法を使用していました。

void SetOrder(ENUM_ORDER_TYPE type, double lot)
{
   int ticket = -1;
   ResetLastError();
   double price = 0;
   double ask, bid;
   ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
   bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
   if (maxSpread != 0 && NormalizeDouble(ask - bid, _Digits) >= NormalizeDouble(maxSpread * point, _Digits)) return; 
   if (type == ORDER_TYPE_BUY) price = ask;
   if (type == ORDER_TYPE_SELL) price = bid;
   trade.PositionOpen(Symbol(), type, lot, price, 0, 0, "");
   Sleep(1000);
   int err = GetLastError();
   if (err > 0) Print(ErrorDescription(err));
}


今、私はドキュメントから学んだように注文を開き、もうこの問題はありません。

void open_sell(double xlot, int xTP)
{
         MqlTradeRequest mrequest;
         MqlTick latest_price;      
         MqlTradeResult mresult;   
            if(!SymbolInfoTick(Symbol(),latest_price))
              {
               Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
               return;
              }
         ZeroMemory(mrequest);
         mrequest.action=TRADE_ACTION_DEAL;                                // immediate order execution
         mrequest.price = NormalizeDouble(latest_price.bid,Digits());           // latest Bid price
         if (StopLoss!=0) mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss*point,Digits()); // Stop Loss
         if (xTP!=0) mrequest.tp = NormalizeDouble(latest_price.bid - xTP*point,Digits()); // Take Profit
         mrequest.symbol = Symbol();                                          // currency pair
         mrequest.volume = xlot;                                              // number of lots to trade
         mrequest.magic = EA_Magic;                                          // Order Magic Number
         mrequest.type= ORDER_TYPE_SELL;                                     // Sell Order
         mrequest.type_filling = ORDER_FILLING_FOK;                          // Order execution type
         mrequest.deviation=100;                                             // Deviation from current price
         //--- send order
         OrderSend(mrequest,mresult);
         // get the result code
         if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed
           {
          // Print("A Sell order has been successfully placed with Ticket#:",mresult.order,"!!");
           }
         else
           {
            Print("The Sell order request could not be completed -error:",GetLastError());
            ResetLastError();
            return;
           }
}


たぶん、これが役に立つでしょう。私はdoshurがこの動作を引き起こしたときに私がしたように、同様の方法トップオープン取引を使用していることを参照してください。

よろしくお願いします。
 
つまり、ctrade クラスに問題があるのでしょうか?

コードを変更する前に、どなたか確認できませんか?
 
doshur:
ctrade クラスに問題があるのですね。

コードを変更する前に、誰かこれを確認することができますか?

ctrade class を削除したら、この問題は発生しなくなったとしか言いようがありません。

トレードを開くのに「昔ながらの」方法を使用するEAの第2バージョンを作成し、それが役に立つかどうかを確認したい場合があります。


一方、スリープ 機能は私にも問題を解決してくれました。

Documentation on MQL5: Common Functions / Sleep
Documentation on MQL5: Common Functions / Sleep
  • www.mql5.com
Common Functions / Sleep - Documentation on MQL5
 
doshur:
ctradeクラスに問題があるのですね?

コードを変更する前に、どなたか確認できませんか?
できるだけ早く回答いたしますので、しばらくお待ちください。マーケットが開いているときに問題を再現してみるつもりです。
 
私はブローカーがここで離れて再生するかどうかは知らないが、それは我々のブローカーが同じであると思われる。Alpari.

Plsは、必要に応じてブローカー名を削除 します。
 
Klammeraffe:

ただ、ctrade classを削除したら、この問題は発生しなくなりました。

取引開始の「昔ながらの」方法を使用するEAの第2バージョンを作成し、それが役に立つかどうかを確認するとよいでしょう。


一方、スリープ機能 で私も問題を解決しました。

これは興味深い点です。

私は、ストップロスの値を調整するためにctradeクラスを使用しています。

      
My_Trade.PositionModify(Symbol(), 
                        NormalizeDouble(dPositionStoploss,   Digits()), 
                        NormalizeDouble(dPositionTakeProfit, Digits())
                        ); 


ポジションの開始自体は、「昔ながらの」方法で行っています。

mrequest.action         = TRADE_ACTION_DEAL;                            // immediate order execution stoploss en takeprofit worden aangepast mrequest.price          = NormalizeDouble(Latest_Price.ask, Digits());  // latest ask price mrequest.symbol         = Symbol();                                     // currency pair mrequest.volume         = dTradePosition_Size;                          // number of lots to trade mrequest.magic          = EA_Magic_Number;                              // Order Magic Number mrequest.type           = ORDER_TYPE_BUY;                               // Buy Order mrequest.type_filling   = ORDER_FILLING_RETURN;                         // Order execution type mrequest.deviation      = 1000;                                         // Max prijs afwijking                                                                                                        OrderSend(mrequest,mresult); //--- send order

私がストップロス注文を調整しているときに、ctradeクラスが新しいダブル注文を送信している可能性はありませんか?おかしいと思うのですが。

 
Klammeraffe:

ctradeクラスを削除した後は、この問題は発生しなくなりました。

トレードを開くのに「昔ながらの」方法を使用するEAの第2バージョンを作成し、それが役に立つかどうかを確認するのがよいでしょう。


一方、スリープ 機能は私にも問題を解決してくれました。

ctradeクラスについて調べてみると。このクラスを使うのとmqltraderequestの方法で何か違いがあるのでしょうか?
 
snelle_moda:

それは良い指摘ですね。BID価格の変化だけでいいのかもしれませんね。

チャート上のBARもBID価格に基づいているのですか?


私のEAのトリガー信号では、1分足BARのベースとなる価格の変化だけに興味があります。

Snelle_modamqltraderequest を使って注文を送ると、まだ二重入力になるのですか?
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 

PositionSelect()はクライアント側とサーバー側のどちらをチェックするのでしょうか?

この問題は、サーバー(ブローカー側)がリクエストを処理する際に、クライアント側を更新しないために、PositionSelect()が再び実行される遅延が原因であると、私は強く感じています。

cTradeとMqlTradeRequestに 違いはなく、PositionSelect()が再実行される前にクライアント側が更新されるようにSleep関数ですべてを遅延させる必要があると強く感じているのですが、二重入力になってしまいます。ジャーナルタブで確認すると、 >2013.12.20 08:35:00 Trades '800****': Exchange buy 0.01 EURUSD at market placed for execution in 313 ms <

400以上のスリープを置くことは安全であるべきですか?

あなたはどう思いますか?

Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Standard Constants, Enumerations and Structures / Data Structures / Trade Request Structure - Documentation on MQL5
 
doshur:
Snelle_moda まだmqltraderequest を使って注文を送ると二重入力になるのですか?


私は03-10-2013からもう1つのダブルエントリーを持っていました。私は両方の方法で注文を送信しています。以前の投稿をご覧ください。