【问题标题】:How to enter a new order only if / when the first one has been executed (filled)? [MQL5]仅当/当第一个订单已执行(成交)时,如何输入新订单? [MQL5]
【发布时间】:2017-08-14 21:37:53
【问题描述】:

我是 MQL5 的新手。

我有一个 EA,它先买一只股票(比如 PETR4),然后再买另一只股票(比如 ABEV3)。

唯一的问题是,我只能在第一个执行时订购第二个(不仅仅是放置)。

我使用 MqlTradeResult.retcode 来获取退货编号,但这仅显示订单是否已下,我需要知道订单是否已成交才能继续第二个操作。

谁能帮帮我? 谢谢

【问题讨论】:

    标签: metatrader4 forex mql5


    【解决方案1】:

    此类指示应编码在PositionSelect() 调用中:

    第一次通话
    if ( PositionSelect( "PETR4" ) ) { ... /* further work will go here */}

    这会选择一个开放的位置,以便进一步使用它。如果函数成功完成,则返回 True。在失败的情况下返回False

    如果给定交易品种报告了任何活动位置,则进一步的工作将在{...}-code-block 内进行

    隐藏的魔法实际上是,对于任何符号要么有一个单一位置或者根本没有。这使得其余的逻辑一清二楚。

    执行交易操作会导致仓位开仓,改变其数量和/或方向,或消失。交易操作基于订单进行,通过OrderSend()函数以交易请求的形式发送。对于每个金融证券(代码),只有一个未平仓头寸是可能的。职位有一组可供 PositionGet...() 函数读取的属性。
    ...
    POSITION_TICKET
    分配给每个新打开的位置的唯一编号。它通常与用于开仓的订单的票据相匹配,除非由于服务器上的服务操作导致票据发生变化,例如,在重新开仓时收取掉期费用。要查找用于开仓的订单,请应用 POSITION_IDENTIFIER 属性。

    POSITION_TICKET 值对应于MqlTradeRequest::position

    【讨论】:

    • 您好,感谢您的回复。我尝试了这个功能,但就我而言,我不需要检查交易是否已完成。我需要的是这样的: Order 100 PETR4 --- 等待这个订单变成一个交易(被成交)--- 当第一个订单被成交时 Order 200 ABEV3。您展示的方法还可以获取已成交的订单(成交)
    • 您似乎错过了重点:... OrderSend( reqStructPETR4, resStructPETR4 ); ... if ( PositionSelect( "PETR4" ) ) /* proves the fill-ed state */ { ... OrderSend( reqStructABEV3, resStructABEV3 ); ... } 符合您的意图。在未提及的用例中 - 如果允许单个头寸 (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING),则可以为一个交易品种打开多个头寸。在这种情况下,PositionSelect() 将选择票数最低的仓位。如果需要保持打开ABEV3 交易的逻辑,这仍然会导致PositionSelectByTicket() 内省工厂。
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2020-05-08
    • 2019-12-26
    • 2022-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多