【发布时间】:2015-08-23 17:35:56
【问题描述】:
我这辈子都不知道如何判断已发送且您已获得有效票证的挂单是否已在 MQL4 中填写
http://book.mql4.com/trading/index
是否有回调,或者脚本是否必须以某种方式连续轮询?
【问题讨论】:
-
嗨,您是说要确定挂单是否已关闭。
我这辈子都不知道如何判断已发送且您已获得有效票证的挂单是否已在 MQL4 中填写
http://book.mql4.com/trading/index
是否有回调,或者脚本是否必须以某种方式连续轮询?
【问题讨论】:
如果您有订单票,则可以定期查看OrderType()。它将从 BUY_STOP ( OP_BUYSTOP ) 变为 BUY ( OP_BUY ) 等等,然后你知道您的订单已完成。
int myTicket;
void OnTick()
{
// check for order filled
OrderSelect(myTicket, SELECT_BY_TICKET);
int type = OrderType();
if((type == OP_BUY) || (type == OP_SELL))
{
// order is filled, do something here.
}
else
{
// order is not filled yet. keep waiting.
}
}
【讨论】:
无论是经纪人/终端生态系统还是 MQL4 语言都不会在 Pending Order 达到市场价格并转换为交易时提供回调。 p>
一个人可能选择以类似循环的相当愚蠢的方式轮询 MT4/终端中的 dbPool 记录
int trades_total = OrdersTotal();
for ( int i = 0; i < trades_total; i++ ) {
OrderSelect( i, SELECT_BY_POS, MODE_TRADES );
if ( OrderSymbol() == Symbol()
&& OrderMagicNumber() == Magic
&& ( OrderType() == OP_BUYSTOP
|| OrderType() == OP_BUY
)
) { ...
或一个可能创建/存储/维护自己的DMA-类似记录编号的包(数组)(用作有点像指针)和相关的订单属性,可以调解直接访问/修改(没有事先 dbPool OrderSelect() )。
使用如此庞大的记录袋进行实时维护测试对于具有数十万个活动订单的低强度 HFT 是可行的(通过dbPoolOrderSelect()/Order*() 处理这将是不切实际的检测(Strategy Tester 多标准优化模式下的更少)。
【讨论】: