structMqlTradeRequest { ENUM_TRADE_REQUEST_ACTIONS action; // Тип выполняемого действия ulong magic; // Штамп эксперта (идентификатор magic number) ulong order; // Тикет ордера string symbol; // Имя торгового инструмента double volume; // Запрашиваемый объем сделки в лотах double price; // Цена double stoplimit; // Уровень StopLimit ордера double sl; // Уровень Stop Loss ордера double tp; // Уровень Take Profit ордера ulong deviation; // Максимально приемлемое отклонение от запрашиваемой цены ENUM_ORDER_TYPE type; // Тип ордера ENUM_ORDER_TYPE_FILLING type_filling; // Тип ордера по исполнению ENUM_ORDER_TYPE_TIME type_time; // Тип ордера по времени действия datetime expiration; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED) string comment; // Комментарий к ордеру ulong position; // Тикет позиции ulong position_by; // Тикет встречной позиции };
写真を拝見しました。証券取引所(指値注文)については、すべてクリアしています。
FXや成行注文の場合は、ポイントがずれています。すべてがクリアになる。
それは(取引所での)成行注文と同じです。
によって追加されました。
成行注文を出したら、チケットを受け取ったら、そのチケットで履歴を見に行き
歴史を見て、どうなったか確認する。また、OnTradeTransactionを 見ることができます。
TRADE_TRANSACTION_HISTORY_ADD
OrderSendがチケットを返した場合、実行される」というのはどうでしょうか。
結局、歴史に走るべきか、出来事を待つべきか。まあそれがこのスレの目的なんだけどね!!!
正解です。興信所」で言わなかったことは?
例としてEA(取引所用)も掲載しました
そうですね、全体的に、あまりオントピックではありませんね )でも、ご意見ありがとうございました。
EAが口座への影響を見る前に、「同期」OrderSendが終了することです(取引履歴もポジションの変化もありません)。
そして、正しく動作させるためには、イベントを待つか(とても便利な機能です!でも今回は違います)、履歴を検索するか(これも待ち時間あり)という形で、松葉杖を考えなければならないのです。
確かにFOREXでは問題があります(同じExpert AdvisorをFOREXで動かしてみました)。
しかし、非同期モード(FOREX)では問題なく動作する
もちろん、誰にでも伝わります。しかし、誰かが同じメッセージを1拍早く受け取り、新たなオーダー送信のトリガーになっていないことは分からない。
新しい発想です。
EAシンクロナイザーを書く。OrderSendが行われると、このEAにデータを送信し、応答を待つ。
とはいえ、スリップバリアントとの違いは同じ卵ですが。全体として、あなたのバリアントは最適です、残念ながら。
成行注文と同じ(取引所内)
追加
成行注文が出た場合、チケットを受け取ったら、そのチケットで履歴を見に行き
はどうなったか見てみましょう。
OrderSend()は完全な同期関数で、チケットを受信すればすべてが実行されます。
以下はその例です。
追加され、以下はそのログです。
https://www.mql5.com/ru/forum/38456/page85#comment_2888263
リンクありがとうございます。しかし、私の質問は少し違っていた。むしろ、OnTrade()イベントの処理を待たずに、その場で注文状態を確認することを支持する意見であり、質問ではなかった。
例のコードを見ていないのでしょう。
{
if(order_ticket>0)
{
if(OrderSelect(order_ticket))
{
RemoveOrderSyncMode(order_ticket);
}
else
{
Print(__FUNCTION__," Order not select! Ticket = ",order_ticket);
}
}
}
同期モード(OrderSend())での注文の削除は、以下の応答があった後であるべきでした。
SendOrserSyncMode関数が 発生しなかった。
2016.10.14 02:18:20.292 Trades'3941932': failed cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374 [Invalid request] (無効なリクエスト です)。
ここに間違いがあるのです。資料によると、チケットを受け取っていれば、取引システムに注文が入ったことになります。
しかし、(FOREXでは)それが行われず、RemoveOrderAsyncMode 関数の本体で削除が行われた、 つまり。
OnTradeTransactionでメッセージを受信した後
追加
トップスターターの質問に答えると、OrderSend()を使って注文を送信した後。
の場合、OntradeTransaction(OnTrade)でイベントを受信した後に注文を処理することができます。
開発者が問題を解決してくれるようです。
追加
FORTSを見ると、この問題があることがわかります。
2016.10.17 18:45:19.081 Trades '1007932': accepted buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.081 Trades '1007932': buy limit 1.00 GAZR-12.16 at 12847 placed for execution
2016.10.17 18:45:19.091 Trades '1007932': order #52178167 buy limit 1.00 / 1.00 GAZR-12.16 at 12847 done in 17.440 ms
2016.10.17 18:45:19.091 Trades '1007932': failed cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847.00000 [Invalid request]
2016.10.17 18:45:19.091 Trades '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.098 Trades '1007932': accepted cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.099 Trades '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847 placed for execution in 7.215 ms
2016.10.17 18:45:19.074 TestOrders (GAZR-12.16,M1) OnChartEvent Send Order Sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) SendOrderSyncMode Order sent in sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) RemoveOrderSyncMode Order not sent (remove) in sync mode.
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order update state = ORDER_STATE_REQUEST_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order plased done. Ticket = 52178167
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order get ticket done. Ticket = 52178167
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order remove done. Ticket = 52178167
トップトレーダーの質問に答えると、OrderSend()を使って注文を送った後。
OntradeTransaction (OnTrade)でイベント受信後、注文の操作が可能です。
同じシンボルに2つのEAがある場合?
はい、同じシンボルに2つのEAがあります。
{
ENUM_TRADE_REQUEST_ACTIONS action; // Тип выполняемого действия
ulong magic; // Штамп эксперта (идентификатор magic number)
ulong order; // Тикет ордера
string symbol; // Имя торгового инструмента
double volume; // Запрашиваемый объем сделки в лотах
double price; // Цена
double stoplimit; // Уровень StopLimit ордера
double sl; // Уровень Stop Loss ордера
double tp; // Уровень Take Profit ордера
ulong deviation; // Максимально приемлемое отклонение от запрашиваемой цены
ENUM_ORDER_TYPE type; // Тип ордера
ENUM_ORDER_TYPE_FILLING type_filling; // Тип ордера по исполнению
ENUM_ORDER_TYPE_TIME type_time; // Тип ордера по времени действия
datetime expiration; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
string comment; // Комментарий к ордеру
ulong position; // Тикет позиции
ulong position_by; // Тикет встречной позиции
};
間違った」ポジション、注文、取引を排除する。