2017.02.1714:05:01.032 Trades 'xxxxx': buy limit 2.00 Eu-9.17 at 65030 2017.02.1714:05:01.437 Trades 'xxxxx': accepted buy limit 2.00 Eu-9.17 at 65030 2017.02.1714:05:01.444 Trades 'xxxxx': buy limit 2.00 Eu-9.17 at 65030 placed for execution in412.406 ms (179.952 ms on server) 2017.02.1714:05:01.449 Trades 'xxxxx': sell limit 1.00 BR-8.17 at 57.45 2017.02.1714:05:01.603 Trades 'xxxxx': sell limit 1.00 LKOH-6.17 at 34098 placed for execution in554.628 ms (195.343 ms on server) 2017.02.1714:05:01.604 Trades 'xxxxx': accepted buy limit 3.00 MXI-6.17 at 2172.70 2017.02.1714:05:01.604 Trades 'xxxxx': buy limit 3.00 MXI-6.17 at 2172.70 placed for execution in537.273 ms (11.579 ms on server) 2017.02.1714:05:01.608 Trades 'xxxxx': accepted sell limit 5.00 GBPU-6.17 at 1.2495 2017.02.1714:05:02.012 Trades 'xxxxx': sell limit 5.00 GBPU-6.17 at 1.2495 placed for execution in921.827 ms (1.396 ms on server) 2017.02.1714:05:02.013 Trades 'xxxxx': accepted buy limit 5.00 HYDR-6.17 at 10779 2017.02.1714:05:02.015 Trades 'xxxxx': accepted buy limit 2.00 MGNT-9.17 at 9611 2017.02.1714:05:02.017 Trades 'xxxxx': accepted sell limit 2.00 MGNT-9.17 at 11001 2017.02.1714:05:02.018 Trades 'xxxxx': accepted buy limit 1.00 ED-9.17 at 1.0601 2017.02.1714:05:02.019 Trades 'xxxxx': buy limit 5.00 HYDR-6.17 at 10779 placed for execution in929.618 ms (3.608 ms on server) 2017.02.1714:05:02.022 Trades 'xxxxx': buy limit 2.00 MGNT-9.17 at 9611 placed for execution in610.425 ms (3.848 ms on server) 2017.02.1714:05:02.029 Trades 'xxxxx': sell limit 2.00 MGNT-9.17 at 11001 placed for execution in616.804 ms (3.793 ms on server) 2017.02.1714:05:02.030 Trades 'xxxxx': buy limit 1.00 ED-9.17 at 1.0601 placed for execution in616.485 ms (3.712 ms on server) 2017.02.1714:05:02.040 Trades 'xxxxx': cancel order #52607654 sell limit 1.00 LKOH-6.17 at 34098 2017.02.1714:05:02.042 Trades 'xxxxx': accepted sell limit 1.00 ED-9.17 at 1.0849 2017.02.1714:05:02.043 Trades 'xxxxx': sell limit 1.00 ED-9.17 at 1.0849 placed for execution in629.309 ms (2.119 ms on server) 2017.02.1714:05:02.215 Trades 'xxxxx': accepted buy limit 2.00 AUDU-6.17 at 0.7586 2017.02.1714:05:02.216 Trades 'xxxxx': accepted buy limit 5.00 TATN-6.17 at 37027 2017.02.1714:05:02.217 Trades 'xxxxx': accepted sell limit 5.00 AUDU-6.17 at 0.8025 2017.02.1714:05:02.217 Trades 'xxxxx': buy limit 2.00 AUDU-6.17 at 0.7586 placed for execution in793.001 ms (5.415 ms on server) 2017.02.1714:05:02.519 Trades 'xxxxx': buy limit 5.00 TATN-6.17 at 37027 placed for execution in1094.281 ms (5.535 ms on server) 2017.02.1714:05:02.521 Trades 'xxxxx': sell limit 5.00 AUDU-6.17 at 0.8025 placed for execution in1096.137 ms (5.514 ms on server) 2017.02.1714:05:02.533 Trades 'xxxxx': accepted sell limit 5.00 TATN-6.17 at 42028 2017.02.1714:05:02.533 Trades 'xxxxx': sell limit 5.00 TATN-6.17 at 42028 placed for execution in1108.871 ms (1.341 ms on server)
2017.02.1713:45:27.132 trader (RTS-3.17,M1) COrder::Place: Order sent to server... 2017.02.1713:45:27.141 trader (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket. 2017.02.1713:45:27.421 trader (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE--> ORDER_STATE_PLACED -- > Order place done.
289毫秒。
终端日志
2017.02.17 13:45:27.132 Trades '1007932': buy limit 2.00 RTS-6.17 at 115190 2017.02.17 13:45:27.141 Trades '1007932': accepted buy limit 2.00 RTS-6.17 at 115190 2017.02.17 13:45:27.141 Trades '1007932': buy limit 2.00 RTS-6.17 at 115190 placed for execution in 8.526 ms
//+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ voidOnTradeTransaction(constMqlTradeTransaction &trans, constMqlTradeRequest &request, constMqlTradeResult &result) { switch(trans.type) { caseTRADE_TRANSACTION_REQUEST: if((order_id!=0) && (result.request_id==order_id)) { order_ticket=result.order; Print(__FUNCTION__, ": TRADE_TRANSACTION_REQUEST --> Order got ticket."); order_id=0; } break; caseTRADE_TRANSACTION_ORDER_UPDATE: if((order_ticket>0) && (trans.order==order_ticket)) { switch(trans.order_state) { caseORDER_STATE_PLACED: Print(__FUNCTION__, ": TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done."); SetSyncOrder(); break; } } else if((sync_order>0) && (trans.order==sync_order)) { switch(trans.order_state) { caseORDER_STATE_PLACED: Print(__FUNCTION__, ": TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal."); break; } }
break; } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void SetSyncOrder() { MqlTradeRequest request={0}; MqlTradeResult result={0}; order_id=0; sync_order=0; request.magic=Magic; request.symbol=Symbol(); request.volume=1; request.type_filling=ORDER_FILLING_RETURN; request.type_time=ORDER_TIME_DAY; request.action=TRADE_ACTION_PENDING; request.type=ORDER_TYPE_SELL_LIMIT; request.comment=""; request.price=SymbolInfoDouble(Symbol(),SYMBOL_SESSION_PRICE_LIMIT_MAX); Print(__FUNCTION__, ": Sync Order send to server..."); if(OrderSend(request,result)) { if((result.retcode==TRADE_RETCODE_PLACED) || (result.retcode==TRADE_RETCODE_DONE)) { sync_order=result.order; Print(__FUNCTION__, ": Sync Order place done? but nof found in terminal."); } } else {Print("Order not send.");} } //--------------------- void SetOrder() { MqlTradeRequest request={0}; MqlTradeResult result={0}; order_id=0; order_ticket=0; request.magic=Magic; request.symbol=Symbol(); request.volume=1; request.type_filling=ORDER_FILLING_RETURN; request.type_time=ORDER_TIME_DAY; request.action=TRADE_ACTION_PENDING; request.type=ORDER_TYPE_SELL_LIMIT; request.comment=""; request.price=SymbolInfoDouble(Symbol(),SYMBOL_SESSION_PRICE_LIMIT_MAX); Print(__FUNCTION__, ": Async Order send to server..."); if(OrderSendAsync(request,result)) { if((result.retcode==TRADE_RETCODE_PLACED) || (result.retcode==TRADE_RETCODE_DONE)) { order_id=result.request_id; Print(__FUNCTION__, ": Async Order got request ID."); } } else {Print("Order not send.");} } //+------------------------------------------------------------------+
终端日志
2017.02.1715:17:15.279 Trades '1007932': sell limit 1.00 RTS-3.17 at 121900 2017.02.1715:17:15.292 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121900 2017.02.1715:17:15.292 Trades '1007932': sell limit 1.00 RTS-3.17 at 121900 placed for execution in13.559 ms 2017.02.1715:17:15.297 Trades '1007932': sell limit 1.00 RTS-3.17 at 121900 2017.02.1715:17:15.308 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121900 2017.02.1715:17:15.310 Trades '1007932': sell limit 1.00 RTS-3.17 at 121900 placed for execution 2017.02.1715:17:15.317 Trades '1007932': order #54040029 sell limit 1.00 / 1.00 RTS-3.17 at 121900 done in19.853 ms
异步模式 - 13毫秒。(放置执行)
同步 - 20毫秒。
专家顾问日志
2017.02.1715:17:15.277 Test_delay (RTS-3.17,M1) SetOrder: Async Order send to server... 2017.02.1715:17:15.279 Test_delay (RTS-3.17,M1) SetOrder: Async Order got request ID. 2017.02.1715:17:15.292 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket. 2017.02.1715:17:15.297 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done. 2017.02.1715:17:15.297 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order send to server... 2017.02.1715:17:15.317 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order place done? but nof found in terminal. 2017.02.1715:17:15.317 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.
CI 0 14:59:53.943 Trades '5122740': sell limit 1.00 MIX-3.17 at 225925 KL 0 14:59:53.997 Trades '5122740': accepted sell limit 1.00 MIX-3.17 at 225925 OH 0 14:59:54.025 Trades '5122740': order #134542376 sell limit 1.00 / 1.00 MIX-3.17 at market done in 82.884 ms JF 0 14:59:54.026 Trades '5122740': sell limit 1.00 MIX-3.17 at 225925 KM 0 14:59:54.082 Trades '5122740': accepted sell limit 1.00 MIX-3.17 at 225925 PI 0 14:59:54.082 Trades '5122740': order #134542377 sell limit 1.00 / 1.00 MIX-3.17 at market done in 57.025 ms
EN 014:59:53.942 Test (MIX-3.17,M1) SetOrder: Async Order send to server... PP 014:59:53.943 Test (MIX-3.17,M1) SetOrder: Async Order got request ID. JF 014:59:54.025 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket. GP 014:59:54.026 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done. KD 014:59:54.026 Test (MIX-3.17,M1) SetSyncOrder: Sync Order send to server... JM 014:59:54.082 Test (MIX-3.17,M1) SetSyncOrder: Sync Order place done? but nof found in terminal. DE 014:59:54.082 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.
CI 0 14:59:53.943 Trades '5122740': sell limit 1.00 MIX-3.17 at 225925 KL 0 14:59:53.997 Trades '5122740': accepted sell limit 1.00 MIX-3.17 at 225925 OH 0 14:59:54.025 Trades '5122740': order #134542376 sell limit 1.00 / 1.00 MIX-3.17 at market done in 82.884 ms JF 0 14:59:54.026 Trades '5122740': sell limit 1.00 MIX-3.17 at 225925 KM 0 14:59:54.082 Trades '5122740': accepted sell limit 1.00 MIX-3.17 at 225925 PI 0 14:59:54.082 Trades '5122740': order #134542377 sell limit 1.00 / 1.00 MIX-3.17 at market done in 57.025 ms
EN 014:59:53.942 Test (MIX-3.17,M1) SetOrder: Async Order send to server... PP 014:59:53.943 Test (MIX-3.17,M1) SetOrder: Async Order got request ID. JF 014:59:54.025 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket. GP 014:59:54.026 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done. KD 014:59:54.026 Test (MIX-3.17,M1) SetSyncOrder: Sync Order send to server... JM 014:59:54.082 Test (MIX-3.17,M1) SetSyncOrder: Sync Order place done? but nof found in terminal. DE 014:59:54.082 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.
MQ-Demo。
难道这一点没有任何疑问吗?
JF 014:59:54.025 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket. GP 014:59:54.026 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
JF 014:59:54.025 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket. GP 014:59:54.026 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
2017.02.1716:20:47.292 Trades '1007932': sell limit 1.00 RTS-3.17 at 121520 2017.02.1716:20:47.299 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121520 2017.02.1716:20:47.300 Trades '1007932': sell limit 1.00 RTS-3.17 at 121520 placed for execution in8.287 ms 2017.02.1716:20:47.307 Trades '1007932': sell limit 1.00 RTS-3.17 at 121520 2017.02.1716:20:47.315 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121520 2017.02.1716:20:47.316 Trades '1007932': sell limit 1.00 RTS-3.17 at 121520 placed for execution 2017.02.1716:20:47.323 Trades '1007932': order #54042531 sell limit 1.00 / 1.00 RTS-3.17 at 121520 done in15.978 ms
2017.02.1716:17:57.121 Test_delay (RTS-3.17,M1) SetOrder: Async Order send to server... 2017.02.1716:17:57.122 Test_delay (RTS-3.17,M1) SetOrder: Async Order got request ID. 2017.02.1716:17:57.132 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket. 2017.02.1716:17:57.146 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done. 2017.02.1716:17:57.146 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order send to server... 2017.02.1716:17:57.161 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order place done, but not found in terminal. 2017.02.1716:17:57.161 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done and found in terminal. 2017.02.1716:20:47.291 Test_delay (RTS-3.17,M1) SetOrder: Async Order send to server... 2017.02.1716:20:47.292 Test_delay (RTS-3.17,M1) SetOrder: Async Order got request ID. 2017.02.1716:20:47.300 Test_delay (RTS-3.17,M1) 8.305 2017.02.1716:20:47.300 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket. 2017.02.1716:20:47.307 Test_delay (RTS-3.17,M1) 15.644 2017.02.1716:20:47.307 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done. 2017.02.1716:20:47.307 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order send to server... 2017.02.1716:20:47.323 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order place done? but nof found in terminal. 2017.02.1716:20:47.323 Test_delay (RTS-3.17,M1) 16.033 2017.02.1716:20:47.323 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.
我没有我的案子。有终端日志,对所有用户都一样。
好了,日志是一样的,但不幸的是,结果是不同的......。
你顽固地看不到289和9ms之间的区别。
这里有一个新的(真正的1531)。
2017.02.17 14:05:01.437 Trades 'xxxxx': accepted buy limit 2.00 Eu-9.17 at 65030
2017.02.17 14:05:01.444 Trades 'xxxxx': buy limit 2.00 Eu-9.17 at 65030 placed for execution in 412.406 ms (179.952 ms on server)
2017.02.17 14:05:01.449 Trades 'xxxxx': sell limit 1.00 BR-8.17 at 57.45
2017.02.17 14:05:01.603 Trades 'xxxxx': sell limit 1.00 LKOH-6.17 at 34098 placed for execution in 554.628 ms (195.343 ms on server)
2017.02.17 14:05:01.604 Trades 'xxxxx': accepted buy limit 3.00 MXI-6.17 at 2172.70
2017.02.17 14:05:01.604 Trades 'xxxxx': buy limit 3.00 MXI-6.17 at 2172.70 placed for execution in 537.273 ms (11.579 ms on server)
2017.02.17 14:05:01.608 Trades 'xxxxx': accepted sell limit 5.00 GBPU-6.17 at 1.2495
2017.02.17 14:05:02.012 Trades 'xxxxx': sell limit 5.00 GBPU-6.17 at 1.2495 placed for execution in 921.827 ms (1.396 ms on server)
2017.02.17 14:05:02.013 Trades 'xxxxx': accepted buy limit 5.00 HYDR-6.17 at 10779
2017.02.17 14:05:02.015 Trades 'xxxxx': accepted buy limit 2.00 MGNT-9.17 at 9611
2017.02.17 14:05:02.017 Trades 'xxxxx': accepted sell limit 2.00 MGNT-9.17 at 11001
2017.02.17 14:05:02.018 Trades 'xxxxx': accepted buy limit 1.00 ED-9.17 at 1.0601
2017.02.17 14:05:02.019 Trades 'xxxxx': buy limit 5.00 HYDR-6.17 at 10779 placed for execution in 929.618 ms (3.608 ms on server)
2017.02.17 14:05:02.022 Trades 'xxxxx': buy limit 2.00 MGNT-9.17 at 9611 placed for execution in 610.425 ms (3.848 ms on server)
2017.02.17 14:05:02.029 Trades 'xxxxx': sell limit 2.00 MGNT-9.17 at 11001 placed for execution in 616.804 ms (3.793 ms on server)
2017.02.17 14:05:02.030 Trades 'xxxxx': buy limit 1.00 ED-9.17 at 1.0601 placed for execution in 616.485 ms (3.712 ms on server)
2017.02.17 14:05:02.040 Trades 'xxxxx': cancel order #52607654 sell limit 1.00 LKOH-6.17 at 34098
2017.02.17 14:05:02.042 Trades 'xxxxx': accepted sell limit 1.00 ED-9.17 at 1.0849
2017.02.17 14:05:02.043 Trades 'xxxxx': sell limit 1.00 ED-9.17 at 1.0849 placed for execution in 629.309 ms (2.119 ms on server)
2017.02.17 14:05:02.215 Trades 'xxxxx': accepted buy limit 2.00 AUDU-6.17 at 0.7586
2017.02.17 14:05:02.216 Trades 'xxxxx': accepted buy limit 5.00 TATN-6.17 at 37027
2017.02.17 14:05:02.217 Trades 'xxxxx': accepted sell limit 5.00 AUDU-6.17 at 0.8025
2017.02.17 14:05:02.217 Trades 'xxxxx': buy limit 2.00 AUDU-6.17 at 0.7586 placed for execution in 793.001 ms (5.415 ms on server)
2017.02.17 14:05:02.519 Trades 'xxxxx': buy limit 5.00 TATN-6.17 at 37027 placed for execution in 1094.281 ms (5.535 ms on server)
2017.02.17 14:05:02.521 Trades 'xxxxx': sell limit 5.00 AUDU-6.17 at 0.8025 placed for execution in 1096.137 ms (5.514 ms on server)
2017.02.17 14:05:02.533 Trades 'xxxxx': accepted sell limit 5.00 TATN-6.17 at 42028
2017.02.17 14:05:02.533 Trades 'xxxxx': sell limit 5.00 TATN-6.17 at 42028 placed for execution in 1108.871 ms (1.341 ms on server)
我想这更有意义。
专家日志
2017.02.17 13:45:27.141 trader (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket.
2017.02.17 13:45:27.421 trader (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE--> ORDER_STATE_PLACED -- > Order place done.
289毫秒。
终端日志
2017.02.17 13:45:27.141 Trades '1007932': accepted buy limit 2.00 RTS-6.17 at 115190
2017.02.17 13:45:27.141 Trades '1007932': buy limit 2.00 RTS-6.17 at 115190 placed for execution in 8.526 ms
9毫秒。
相同的颜色表示相同的事件。由于某些原因,终端日志中的两行都有27.141。
专家顾问的日志包含27.141和27.421。似乎OnTradeTransaction 的速度仍然很慢--终端收到了事件,但在>200毫秒后才被发送到OnTradeTransaction。也许,专家顾问在这200毫秒内一直在做什么,这就是为什么它如此延迟。没有源代码,我不能说。
同样的颜色也被用来标记相同的事件。由于某些原因,这两行在终端日志中都有27.141。
专家顾问的日志显示27.141和27.421。似乎OnTradeTransaction 的速度仍然很慢--终端收到了事件,但在>200毫秒后才被发送到OnTradeTransaction。也许,专家顾问在这200毫秒内正在做一些事情,这就是为什么它如此延迟的原因。没有源代码,我不能说。
在演示器上试试这个
//| Test_delay.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
ulong order_ticket;
ulong Magic=1234567890;
ulong order_id;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetOrder();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_REQUEST: if((order_id!=0) && (result.request_id==order_id))
{
order_ticket=result.order;
Print(__FUNCTION__, ": TRADE_TRANSACTION_REQUEST --> Order got ticket.");
order_id=0;
}
break;
case TRADE_TRANSACTION_ORDER_UPDATE: if((order_ticket!=0) && (trans.order==order_ticket))
{
switch(trans.order_state)
{
case ORDER_STATE_PLACED:
Print(__FUNCTION__, ": TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Order place done.");
break;
}
}
break;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SetOrder()
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_id=0;
order_ticket=0;
request.magic=Magic;
request.symbol=Symbol();
request.volume=1;
request.type_filling=ORDER_FILLING_RETURN;
request.type_time=ORDER_TIME_DAY;
request.action=TRADE_ACTION_PENDING;
request.type=ORDER_TYPE_SELL_LIMIT;
request.comment="";
request.price=SymbolInfoDouble(Symbol(),SYMBOL_SESSION_PRICE_LIMIT_MAX);
if(OrderSendAsync(request,result))
{
if((result.retcode==TRADE_RETCODE_PLACED) || (result.retcode==TRADE_RETCODE_DONE))
{
order_id=result.request_id;
Print(__FUNCTION__, ": Order send to server.");
}
}
else
{Print("Order not send.");}
}
//+------------------------------------------------------------------+
终端日志
2017.02.17 14:48:33.368 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121900
2017.02.17 14:48:33.369 Trades '1007932': sell limit 1.00 RTS-3.17 at 121900 placed for execution in 8.077 ms
8毫秒。
专家日志。
2017.02.17 14:48:33.369 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket.
2017.02.17 14:48:33.377 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Order place done.
16毫秒。
专家的 "TORRIBLE "在哪里?
现在通过添加同步订单设置使任务复杂化
//| Test_delay.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
ulong order_ticket;
ulong sync_order;
ulong Magic=1234567890;
ulong order_id;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetOrder();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_REQUEST: if((order_id!=0) && (result.request_id==order_id))
{
order_ticket=result.order;
Print(__FUNCTION__, ": TRADE_TRANSACTION_REQUEST --> Order got ticket.");
order_id=0;
}
break;
case TRADE_TRANSACTION_ORDER_UPDATE: if((order_ticket>0) && (trans.order==order_ticket))
{
switch(trans.order_state)
{
case ORDER_STATE_PLACED:
Print(__FUNCTION__, ": TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.");
SetSyncOrder();
break;
}
}
else
if((sync_order>0) && (trans.order==sync_order))
{
switch(trans.order_state)
{
case ORDER_STATE_PLACED:
Print(__FUNCTION__, ": TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.");
break;
}
}
break;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SetSyncOrder()
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_id=0;
sync_order=0;
request.magic=Magic;
request.symbol=Symbol();
request.volume=1;
request.type_filling=ORDER_FILLING_RETURN;
request.type_time=ORDER_TIME_DAY;
request.action=TRADE_ACTION_PENDING;
request.type=ORDER_TYPE_SELL_LIMIT;
request.comment="";
request.price=SymbolInfoDouble(Symbol(),SYMBOL_SESSION_PRICE_LIMIT_MAX);
Print(__FUNCTION__, ": Sync Order send to server...");
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_PLACED) || (result.retcode==TRADE_RETCODE_DONE))
{
sync_order=result.order;
Print(__FUNCTION__, ": Sync Order place done? but nof found in terminal.");
}
}
else
{Print("Order not send.");}
}
//---------------------
void SetOrder()
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_id=0;
order_ticket=0;
request.magic=Magic;
request.symbol=Symbol();
request.volume=1;
request.type_filling=ORDER_FILLING_RETURN;
request.type_time=ORDER_TIME_DAY;
request.action=TRADE_ACTION_PENDING;
request.type=ORDER_TYPE_SELL_LIMIT;
request.comment="";
request.price=SymbolInfoDouble(Symbol(),SYMBOL_SESSION_PRICE_LIMIT_MAX);
Print(__FUNCTION__, ": Async Order send to server...");
if(OrderSendAsync(request,result))
{
if((result.retcode==TRADE_RETCODE_PLACED) || (result.retcode==TRADE_RETCODE_DONE))
{
order_id=result.request_id;
Print(__FUNCTION__, ": Async Order got request ID.");
}
}
else
{Print("Order not send.");}
}
//+------------------------------------------------------------------+
终端日志
2017.02.17 15:17:15.292 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121900
2017.02.17 15:17:15.292 Trades '1007932': sell limit 1.00 RTS-3.17 at 121900 placed for execution in 13.559 ms
2017.02.17 15:17:15.297 Trades '1007932': sell limit 1.00 RTS-3.17 at 121900
2017.02.17 15:17:15.308 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121900
2017.02.17 15:17:15.310 Trades '1007932': sell limit 1.00 RTS-3.17 at 121900 placed for execution
2017.02.17 15:17:15.317 Trades '1007932': order #54040029 sell limit 1.00 / 1.00 RTS-3.17 at 121900 done in 19.853 ms
异步模式 - 13毫秒。(放置执行)
同步 - 20毫秒。
专家顾问日志
2017.02.17 15:17:15.277 Test_delay (RTS-3.17,M1) SetOrder: Async Order send to server...
2017.02.17 15:17:15.279 Test_delay (RTS-3.17,M1) SetOrder: Async Order got request ID.
2017.02.17 15:17:15.292 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket.
2017.02.17 15:17:15.297 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
2017.02.17 15:17:15.297 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order send to server...
2017.02.17 15:17:15.317 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order place done? but nof found in terminal.
2017.02.17 15:17:15.317 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.
异步模式 - 20毫秒。(其中终端7毫秒做????)
同步模式 - 20毫秒。
我们自己永远无法弄清延误的原因。
因为FORTS的连接是如下的。
终端-->互联网-->经纪人网络-->MT5服务器-->经纪人网络-->互联网--终端
除非开发商自己愿意处理延迟问题,否则就会是这样的情况。
而现在要通过增加一个同步订单设置来使任务复杂化
KL 0 14:59:53.997 Trades '5122740': accepted sell limit 1.00 MIX-3.17 at 225925
OH 0 14:59:54.025 Trades '5122740': order #134542376 sell limit 1.00 / 1.00 MIX-3.17 at market done in 82.884 ms
JF 0 14:59:54.026 Trades '5122740': sell limit 1.00 MIX-3.17 at 225925
KM 0 14:59:54.082 Trades '5122740': accepted sell limit 1.00 MIX-3.17 at 225925
PI 0 14:59:54.082 Trades '5122740': order #134542377 sell limit 1.00 / 1.00 MIX-3.17 at market done in 57.025 ms
PP 0 14:59:53.943 Test (MIX-3.17,M1) SetOrder: Async Order got request ID.
JF 0 14:59:54.025 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket.
GP 0 14:59:54.026 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
KD 0 14:59:54.026 Test (MIX-3.17,M1) SetSyncOrder: Sync Order send to server...
JM 0 14:59:54.082 Test (MIX-3.17,M1) SetSyncOrder: Sync Order place done? but nof found in terminal.
DE 0 14:59:54.082 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.
MQ-Demo。
我们自己永远无法弄清延误的原因。
因为FORTS的连接是如下的。
终端-->互联网-->经纪人网络-->MT5服务器-->经纪人网络-->互联网--终端
除非开发商自己愿意处理延迟问题,否则就会是这样的情况。
KL 0 14:59:53.997 Trades '5122740': accepted sell limit 1.00 MIX-3.17 at 225925
OH 0 14:59:54.025 Trades '5122740': order #134542376 sell limit 1.00 / 1.00 MIX-3.17 at market done in 82.884 ms
JF 0 14:59:54.026 Trades '5122740': sell limit 1.00 MIX-3.17 at 225925
KM 0 14:59:54.082 Trades '5122740': accepted sell limit 1.00 MIX-3.17 at 225925
PI 0 14:59:54.082 Trades '5122740': order #134542377 sell limit 1.00 / 1.00 MIX-3.17 at market done in 57.025 ms
PP 0 14:59:53.943 Test (MIX-3.17,M1) SetOrder: Async Order got request ID.
JF 0 14:59:54.025 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket.
GP 0 14:59:54.026 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
KD 0 14:59:54.026 Test (MIX-3.17,M1) SetSyncOrder: Sync Order send to server...
JM 0 14:59:54.082 Test (MIX-3.17,M1) SetSyncOrder: Sync Order place done? but nof found in terminal.
DE 0 14:59:54.082 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.
MQ-Demo。
难道这一点没有任何疑问吗?
GP 0 14:59:54.026 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
1ms - 不!
再次检查。
添加
我是在1525版本上测试的
这一点有什么疑问吗?
GP 0 14:59:54.026 Test (MIX-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
1ms - 不!
我唯一的疑问是终端自己记录的时间。
这就是为什么我做了以下工作
//| Test_delay.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
ulong order_ticket;
ulong sync_order;
ulong Magic=1234567890;
ulong order_id;
ulong StartTime;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
StartTime = GetMicrosecondCount();
SetOrder();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch(trans.type)
{
case TRADE_TRANSACTION_REQUEST: if((order_id!=0) && (result.request_id==order_id))
{
Print(DoubleToString((GetMicrosecondCount() - StartTime) / 1000.0, 3));
order_ticket=result.order;
Print(__FUNCTION__, ": TRADE_TRANSACTION_REQUEST --> Order got ticket.");
order_id=0;
}
break;
case TRADE_TRANSACTION_ORDER_UPDATE: if((order_ticket>0) && (trans.order==order_ticket))
{
switch(trans.order_state)
{
case ORDER_STATE_PLACED:
Print(DoubleToString((GetMicrosecondCount() - StartTime) / 1000.0, 3));
Print(__FUNCTION__, ": TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.");
SetSyncOrder();
break;
}
}
else
if((sync_order>0) && (trans.order==sync_order))
{
switch(trans.order_state)
{
case ORDER_STATE_PLACED:
Print(DoubleToString((GetMicrosecondCount() - StartTime) / 1000.0, 3));
Print(__FUNCTION__, ": TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.");
break;
}
}
break;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void SetSyncOrder()
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_id=0;
sync_order=0;
request.magic=Magic;
request.symbol=Symbol();
request.volume=1;
request.type_filling=ORDER_FILLING_RETURN;
request.type_time=ORDER_TIME_DAY;
request.action=TRADE_ACTION_PENDING;
request.type=ORDER_TYPE_SELL_LIMIT;
request.comment="";
request.price=SymbolInfoDouble(Symbol(),SYMBOL_SESSION_PRICE_LIMIT_MAX);
Print(__FUNCTION__, ": Sync Order send to server...");
StartTime = GetMicrosecondCount();
if(OrderSend(request,result))
{
if((result.retcode==TRADE_RETCODE_PLACED) || (result.retcode==TRADE_RETCODE_DONE))
{
sync_order=result.order;
Print(__FUNCTION__, ": Sync Order place done? but nof found in terminal.");
}
}
else
{Print("Order not send.");}
}
//---------------------
void SetOrder()
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
order_id=0;
order_ticket=0;
request.magic=Magic;
request.symbol=Symbol();
request.volume=1;
request.type_filling=ORDER_FILLING_RETURN;
request.type_time=ORDER_TIME_DAY;
request.action=TRADE_ACTION_PENDING;
request.type=ORDER_TYPE_SELL_LIMIT;
request.comment="";
request.price=SymbolInfoDouble(Symbol(),SYMBOL_SESSION_PRICE_LIMIT_MAX);
Print(__FUNCTION__, ": Async Order send to server...");
StartTime = GetMicrosecondCount();
if(OrderSendAsync(request,result))
{
if((result.retcode==TRADE_RETCODE_PLACED) || (result.retcode==TRADE_RETCODE_DONE))
{
order_id=result.request_id;
Print(__FUNCTION__, ": Async Order got request ID.");
}
}
else
{Print("Order not send.");}
}
//+------------------------------------------------------------------+
你能得到什么?
你得到了什么?
2017.02.17 16:20:47.299 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121520
2017.02.17 16:20:47.300 Trades '1007932': sell limit 1.00 RTS-3.17 at 121520 placed for execution in 8.287 ms
2017.02.17 16:20:47.307 Trades '1007932': sell limit 1.00 RTS-3.17 at 121520
2017.02.17 16:20:47.315 Trades '1007932': accepted sell limit 1.00 RTS-3.17 at 121520
2017.02.17 16:20:47.316 Trades '1007932': sell limit 1.00 RTS-3.17 at 121520 placed for execution
2017.02.17 16:20:47.323 Trades '1007932': order #54042531 sell limit 1.00 / 1.00 RTS-3.17 at 121520 done in 15.978 ms
2017.02.17 16:17:57.122 Test_delay (RTS-3.17,M1) SetOrder: Async Order got request ID.
2017.02.17 16:17:57.132 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket.
2017.02.17 16:17:57.146 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
2017.02.17 16:17:57.146 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order send to server...
2017.02.17 16:17:57.161 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order place done, but not found in terminal.
2017.02.17 16:17:57.161 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done and found in terminal.
2017.02.17 16:20:47.291 Test_delay (RTS-3.17,M1) SetOrder: Async Order send to server...
2017.02.17 16:20:47.292 Test_delay (RTS-3.17,M1) SetOrder: Async Order got request ID.
2017.02.17 16:20:47.300 Test_delay (RTS-3.17,M1) 8.305
2017.02.17 16:20:47.300 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_REQUEST --> Order got ticket.
2017.02.17 16:20:47.307 Test_delay (RTS-3.17,M1) 15.644
2017.02.17 16:20:47.307 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Async Order place done.
2017.02.17 16:20:47.307 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order send to server...
2017.02.17 16:20:47.323 Test_delay (RTS-3.17,M1) SetSyncOrder: Sync Order place done? but nof found in terminal.
2017.02.17 16:20:47.323 Test_delay (RTS-3.17,M1) 16.033
2017.02.17 16:20:47.323 Test_delay (RTS-3.17,M1) OnTradeTransaction: TRADE_TRANSACTION_ORDER_UPDATE --> ORDER_STATE_PLACED --> Sync order place done. And found in terminal.
图片1533。
添加
计时有什么意义,那么在这么小的时间 范围内,当地的 时间怎么会准确呢?