【发布时间】:2017-08-14 21:37:53
【问题描述】:
我是 MQL5 的新手。
我有一个 EA,它先买一只股票(比如 PETR4),然后再买另一只股票(比如 ABEV3)。
唯一的问题是,我只能在第一个执行时订购第二个(不仅仅是放置)。
我使用 MqlTradeResult.retcode 来获取退货编号,但这仅显示订单是否已下,我需要知道订单是否已成交才能继续第二个操作。
谁能帮帮我? 谢谢
【问题讨论】:
标签: metatrader4 forex mql5
我是 MQL5 的新手。
我有一个 EA,它先买一只股票(比如 PETR4),然后再买另一只股票(比如 ABEV3)。
唯一的问题是,我只能在第一个执行时订购第二个(不仅仅是放置)。
我使用 MqlTradeResult.retcode 来获取退货编号,但这仅显示订单是否已下,我需要知道订单是否已成交才能继续第二个操作。
谁能帮帮我? 谢谢
【问题讨论】:
标签: metatrader4 forex mql5
PositionSelect() 调用中:第一次通话if ( PositionSelect( "PETR4" ) ) { ... /* further work will go here */}
这会选择一个开放的位置,以便进一步使用它。如果函数成功完成,则返回
True。在失败的情况下返回False。
如果给定交易品种报告了任何活动位置,则进一步的工作将在{...}-code-block 内进行
隐藏的魔法实际上是,对于任何符号要么有一个单一位置,或者根本没有。这使得其余的逻辑一清二楚。
执行交易操作会导致仓位开仓,改变其数量和/或方向,或消失。交易操作基于订单进行,通过
OrderSend()函数以交易请求的形式发送。对于每个金融证券(代码),只有一个未平仓头寸是可能的。职位有一组可供PositionGet...()函数读取的属性。
...POSITION_TICKET
分配给每个新打开的位置的唯一编号。它通常与用于开仓的订单的票据相匹配,除非由于服务器上的服务操作导致票据发生变化,例如,在重新开仓时收取掉期费用。要查找用于开仓的订单,请应用POSITION_IDENTIFIER属性。
POSITION_TICKET值对应于MqlTradeRequest::position。
【讨论】:
... OrderSend( reqStructPETR4, resStructPETR4 ); ... if ( PositionSelect( "PETR4" ) ) /* proves the fill-ed state */ { ... OrderSend( reqStructABEV3, resStructABEV3 ); ... } 符合您的意图。在未提及的用例中 - 如果允许单个头寸 (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING),则可以为一个交易品种打开多个头寸。在这种情况下,PositionSelect() 将选择票数最低的仓位。如果需要保持打开ABEV3 交易的逻辑,这仍然会导致PositionSelectByTicket() 内省工厂。