《MQL4实用编程》读书笔记(2) - 交易操作的编程:基本交易知识

时间:2023-01-08 09:05:20
  • 普通的交易方式

    外汇交易,需由汇客手工或者使用程序,通过客户端向服务器发出交易请求。

    应用程序发出的交易请求,由以下函数管理:

    • OrderSend() - 开仓(建仓)。包括现价交易和期价交易(挂单);
    • OrderClose() OrderCloseBy() - 平仓(关仓)。终结交易;
    • OrderDelete() - 撤单。删除挂单;
    • OrderModify() - 改单。修改现价单和挂单。
  • 定单特点和交易规则

    在具体介绍交易函数之前,先了解一些基本交易知识。

    交易标的的特点

    双向询价是交易商(中间方)提供的,交易标的(某一货币对)当前卖价和买价。

    Bid(买价) 是双向询价中的低位价格。

    Ask(卖价)是双向询价中的高位价格。

    Point(点)衡量交易标的价格变化的最小单位。

    Spread(点差)双向询价中,以点计算的二者的价差。

    通常,点差是固定不变的。在 MetaTrader 4 主图中的反映:

    《MQL4实用编程》读书笔记(2) - 交易操作的编程:基本交易知识

    从图中可见,黑色的买价1.3005,红色的卖价1.3007,点差为2。

    定单类型和特点

    共有6种交易定单:2种现价交易的,4种期价交易的(挂单)。

    Buy 以市场现价买入标的。

    Sell 以市场现价卖出标的。

    BuyLimit 低位买入挂单。买入报价低于当前市场价。当市场卖出价等于或低于该挂单时,达成交易。

    SellLimit 高位卖出挂单。卖出报价高于当前市场价。当市场买入价等于或高于该挂单时,达成交易。

    BuyStop 高位买入挂单。买入报价高于当前市场价。当市场卖出价等于或高于该挂单时,达成交易。

    SellStop 低位卖出挂单。卖出报价低于当前市场价。当市场买入价等于或低于该挂单时,达成交易。

    Lot “手”。定单交易量的单位。

    StopLoss 止损位。损失达到预定程度时,平仓的价位。

    TakeProfit 止盈位。盈利达到预定程度时,平仓的价位。

    现价买单 Buy 对应的是当前市场最新卖价 Ask。

    现价卖单 Sell 对应的是当前市场最新买价 Bid。

    定单止损位和止盈位的设置,不得小于最低限制。

    例如,欧元/美元EURUSD的止损/止盈低限为5点。现价卖单开价在1.2987(对应市场Bid询价)。
    相应的市场卖价(Ask)是1.2989。于是,该定单的上操/止盈位应该设在:

    止损位 = Ask + 最低限制 = 1.2989 + 0.0005 = 1.2994

    止盈位 = Ask - 最低限制 = 1.2989 - 0.0005 = 1.2984.

    《MQL4实用编程》读书笔记(2) - 交易操作的编程:基本交易知识
    图 69. 设有止损位的现价卖单最接近市场价.

    现价买单正确的平仓价,是当前买价(Bid)。
    现价卖单正确的平仓价,是当前卖价(Ask)。

    如果按图69立即将卖单平仓,成交价将接近 Ask=1.2989,会亏损 2 个点。如果继续持仓,市场卖价 Ask 跌至1.2984,这时平仓会盈利 3 个点。如果市场价上涨至 Ask= 1.2994, 这时平仓会亏损 7 个点。

    如果“操盘手”发出现价交易建仓或平仓的请求,不符合最新的市场报价,该请求将被MT4终端拒绝。

    市场价格是决定现价交易价格的计算基础。
    市场价格未达到止损或止盈点位,相应的定单不能平仓。

    如图69所示,如果交易商设置的固定止损位是4个点,或者低于当前平仓价位,方可平仓。这时,建仓不受影响。平仓价位的上下限,以市场价格为计算基础。如果固定止损位是4个点,则最小止损点位上限是1.2989+ 0.0004 = 1.2993; 相应的下限是 1.2989 - 0.0004 =1.2985。此时,若“操盘手”向交易服务器发出平仓请求,由于止损定单在固定范围之外,允许平仓。
    如果交易商设定固定止损位是5个点,上下限则分别为1.2994和1.2984。此时,止损定单在预设范围内,不允许平仓。在本例中,2个止损定单都在预设范围内。
    一般地,如果止损位在预定范围之内,现价定单不能平仓。

    如果一个交易品种同时开立买、卖2个现价定单,可由以下方式平仓:
    使用OrderClode()逐个平仓;或者,使用OrderCloseBy()平仓。第二种办法节省佣金。

    挂单与取消挂单

    挂单是指以不同于当前市场价请求交易。挂单用函数OrderSend(),取消挂单用OrderDelete()。

    SellLimit 和 BuyStop 是高于当前市场价的挂单,BuyLimit 和 SellStop 是低于当前市场价的挂单。

    BuyLimit, BuyStop, SellLimit 和 SellStop 挂单,必须与市场现价有一定价格差距。

    例如,BuyStop 挂单,其最低价是在最新卖价 Ask 的基础之上加上止损点位。 若止损点为 5, 则最低挂单价为1.3003+0.0005 = 1.3008 (见图. 70)。高于最低价是允许的,如本例挂单价 1.3015。

    《MQL4实用编程》读书笔记(2) - 交易操作的编程:基本交易知识
    图. 70. 挂单价低于或者高于当前市场价

    BuyStop 挂单价为 1.3015,SellLimit 挂单价为 1.3012,SellStop 挂单价为 1.2995,BuyLimit 挂单价为1.2993。

    挂单改为现价交易

    挂单在交易服务器自动改为现价交易,没有函数进行这种操作。

    BuyLimit 和 BuyStop 挂单,如果价格达到市场卖出价 Ask, 转为现价交易。 SellLimit 和 SellStop 挂单,如果价格达到市场买入价 Bid,转为现价交易。

    修改现单价格

    修改现单,应该使用函数 OrderModify()。

    修改现单,是指修改止损价位。不可修改现单的建仓价。

    止损位和止盈位,必须与市场现价有一定差距。
    如果修改后的止损位和止盈位,与市场现价差距小于规定值,不得修改现单。

    修改挂单价格

    修改挂单,使用函数 OrderModify()。

    修改挂单,是指改变其建仓价和止损价。
    挂单价位可修改的范围,以挂单价可转现价的范围为基础计算。
    挂单止损价的修改,以挂单建仓价为基础计算,与市场现价无关。

    BuyLimit 和 BuyStop 挂单,对应的市场卖价,不能小于卖价+规定的最小点差。
    SellLimit 和 SellStop 挂单,对应的市场买价,不能小于买价+规定的最小点差。
    挂单的止损/止盈价位,对应的建仓价,不能小于建仓价+规定的最小点差。

    BuyLimit 和 BuyStop 挂单,建仓价处于市场卖价+固定点差范围之内时,挂单不能修改。
    SellLimit 和 SellStop 挂单,建仓价处于市场买价+固定点差范围之内时,挂单不能修改。
    挂单的止损/止盈的仓位,不受固定点差的限制。

    例如,BuyLimit 挂单的情况如下:开价=1. 2969, 止损=1.2964, 止盈=1.2974。现时卖价Ask=1.2983。因此,开价与时价差值为 14 点 (1.2983-1.2969),远超最低限(开价+5点是最低止损价),允许修改挂单。(见图78)

    《MQL4实用编程》读书笔记(2) - 交易操作的编程:基本交易知识
    图. 78. BuyLimit 挂单及最小止损

    若需改变 BuyLimit 挂单价格,无论是何交易方向,必须同时改变相应的止损/止盈价位(或者,将其删除,即将其值设为0)。否则,挂单价与其止损/止盈价之间的点差,可能低于最小允许值。汇客修改挂单,使目标价与止盈价间的点差保持为5点,而止损价保持不变。(图79)

    《MQL4实用编程》读书笔记(2) - 交易操作的编程:基本交易知识
    图. 79. 修改 BuyLimit 挂单(改变开单价和止盈价).

    若需使 BuyLimit 挂单价尽量接近市场价, 例如图80,允许的最小目标价为 Ask - 5点 = 1.2985-0.0005 =1.2980. 本例的止损/止盈价超出了最小限制。

    《MQL4实用编程》读书笔记(2) - 交易操作的编程:基本交易知识
    图. 80. 修改 BuyLimit 挂单价接近市场价.