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 priceif (StopLoss!=0) mrequest.sl = NormalizeDouble(latest_price.bid + StopLoss*point,Digits()); // Stop Lossif (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 orderOrderSend(mrequest,mresult);
// get the result codeif(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;
}
}
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 afwijkingOrderSend(mrequest,mresult); //--- send order
cTradeとMqlTradeRequestに 違いはなく、PositionSelect()が再実行される前にクライアント側が更新されるようにSleep関数ですべてを遅延させる必要があると強く感じているのですが、二重入力になってしまいます。ジャーナルタブで確認すると、 >2013.12.20 08:35:00Trades'800****': Exchange buy 0.01 EURUSD at market placed for execution in 313 ms <
オーム。では、スリープは助けにならないのですか?
私には役に立ちました。snelle_modas tipに加え、sleepを使いました。それでうまくいきました。
しかし、それ以来、私はトレードの開き方を見直しました。今はどちらの解決策も必要ありません。以下は、私が昨日angevoyageurに書いたものです。お役に立てれば幸いです。
こんにちは。
前回解決したのは、取引後にスリープ 機能を使うことでした。しかし、私の新しいボットでは、これはもう必要ありません。おそらく、トレードの開始が異なる方法で処理されるようになったからでしょう。この問題があった最初のボット(多分他のEAもこの方法で取引を開始し、そのために問題があったのでしょう(例えばmetaquant))は、この方法を使用していました。
今、私はドキュメントから学んだように注文を開き、もうこの問題はありません。
たぶん、これが役に立つでしょう。私はdoshurがこの動作を引き起こしたときに私がしたように、同様の方法トップオープン取引を使用していることを参照してください。
よろしくお願いします。ctrade クラスに問題があるのですね。
ctrade class を削除したら、この問題は発生しなくなったとしか言いようがありません。
トレードを開くのに「昔ながらの」方法を使用するEAの第2バージョンを作成し、それが役に立つかどうかを確認したい場合があります。
一方、スリープ 機能は私にも問題を解決してくれました。
ctradeクラスに問題があるのですね?
ただ、ctrade classを削除したら、この問題は発生しなくなりました。
取引開始の「昔ながらの」方法を使用するEAの第2バージョンを作成し、それが役に立つかどうかを確認するとよいでしょう。
一方、スリープ機能 で私も問題を解決しました。
これは興味深い点です。
私は、ストップロスの値を調整するためにctradeクラスを使用しています。
ポジションの開始自体は、「昔ながらの」方法で行っています。
私がストップロス注文を調整しているときに、ctradeクラスが新しいダブル注文を送信している可能性はありませんか?おかしいと思うのですが。
ctradeクラスを削除した後は、この問題は発生しなくなりました。
トレードを開くのに「昔ながらの」方法を使用するEAの第2バージョンを作成し、それが役に立つかどうかを確認するのがよいでしょう。
一方、スリープ 機能は私にも問題を解決してくれました。
それは良い指摘ですね。BID価格の変化だけでいいのかもしれませんね。
チャート上のBARもBID価格に基づいているのですか?
私のEAのトリガー信号では、1分足BARのベースとなる価格の変化だけに興味があります。
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以上のスリープを置くことは安全であるべきですか?
あなたはどう思いますか?
Snelle_moda まだmqltraderequest を使って注文を送ると二重入力になるのですか?
私は03-10-2013からもう1つのダブルエントリーを持っていました。私は両方の方法で注文を送信しています。以前の投稿をご覧ください。