外汇EA编写教程:MetaTrader 5 已具备锁仓账户系统

MetaTrader 5平台最初是专为净额持仓账户系统而设计的。净额系统每个金融工具仅允许一个持仓,也就意味着该工具的所有进一步操作只能是关闭,撤销或改变现有持仓的交易量。为了扩大零售外汇交易者的可能性,我们新增第二种账户系统 – 锁仓系统。现在,每个交易品种可以有多位持仓,包括反向持仓。这就为实现基于所谓“锁定”的交易策略铺平了道路 – 如果价格移动方向与交易者相反,那么他们就可以新建一个反向持仓。

因为新系统类似于MetaTrader 4中使用的系统,所以交易者将会非常熟悉。与此同时,交易者将能够体验第五代平台版本的全部优势 – 使用多个交易填充订单(包括部分填充),多种货币和MQL5 云网络支持多线程测试,等等。

现在,您可以使用一个账户进行市场交易,坚持净额系统,允许每个工具只一个持仓,并且在同一个平台使用另一个账户从事外汇交易,使用锁仓。

本文详细描述了净额和锁仓系统,以及阐明了实施第二账户系统相关的变化。

账户持仓取决于交易账户

持仓账户系统是在一个账户水平设置并在程序端窗口的标题和日志中展示:

当前账户的持仓账户系统

若要新建锁仓模拟账户,请启用相应选项:

新建锁仓模拟账户

若要新建锁仓真实账户,请联系您的交易商。

净额系统

通过该系统,您可以在同一时间一个交易品种只有一个普通持仓:

  • 如果一个交易品种有一个持仓,那么同向执行交易会增加该持仓的交易量。
  • 如果反向执行交易,那么现有持仓的交易量可能被减少,持仓可能被关闭(成交量等于持仓交易量时)或撤销(如果反向成交量大于当前持仓)。

到底什么导致了反向交易无关紧要 — 执行的市场订单或者激活的挂单。

下面示例显示了执行两个EURUSD每个0.5手的买入交易的情况:

净额

执行两个交易得出1手一个普通持仓。

锁仓系统

通过该系统,您可以拥有一个及同一个交易品种的多个持仓,包括反向持仓。

如果您持仓一个交易品种,执行一个新的交易(或挂单启动),就会新建一个额外持仓。您的当前持仓不变。

下面示例显示了执行两个EURUSD每个0.5手的买入交易的情况:

锁仓

执行这些交易会得到两个独立的持仓。

选择系统的影响

根据账户持仓系统,一些平台功能可能有不同的表现:

  • 止损获利继承 规则变化。
  • 若要在净额系统平仓,您应该执行一个相同交易品种相同交易量的反向交易操作。若要锁仓系统平仓,直接在持仓快捷菜单选择“平仓”命令。
  • 锁仓系统中不能撤销持仓。在这种情况下,关闭当前持仓,新建剩余交易量的新持仓。
  • 在锁仓系统中,一个新的条件可以用于预付款计算 – 锁仓预付款。

新的交易操作类型 – Close By

新的交易操作类型已经添加到锁仓账户 – 反向平仓。该操作允许在独立交易品种关闭两个反向持仓。如果反向持仓拥有不同的手数,两个中只有一个订单可以保持持仓。其交易量将等于平仓手数的差异,而持仓方向和开盘价将匹配(交易量)越大的平仓。

相比单独关闭两个持仓,关闭反向持仓允许交易者保存一个点差:

  • 在单独平仓情况下,交易者必须支付两次点差:以低价位关闭买入持仓(卖价)和以高价位关闭卖出持仓(买价)时。
  • 当使用反向持仓时,第二持仓的开盘价用于关闭第一持仓,而第一持仓的开盘价用于关闭第二持仓。

反向平仓

在后面的情况下,“close by”命令被替代。评论交易数在该评论指明。一对儿反向持仓由两个“out by”交易关闭。从两次平仓获得的总获利/总亏损只在一笔交易中指定。

历史记录中的"Close by" 操作

持仓账户锁仓系统中的预付款计算

如果使用锁仓账户系统,那么预付款的计算则使用上述相同的公式和规则。 然而,相同交易品种的多位持仓还有一些额外的功能。

同向持仓/订单

总结交易量并为其计算加权平均开盘价。通过交易品种类型对应的公式获得的值用于计算预付款。.

对于挂单(如果预付款比率非零),预付款独立计算。

反向持仓/订单

相同交易品种的反向持仓被视为锁仓或对冲。对这种持仓可以使用两种预付款计算方式。计算方式由交易商决定。

锁仓预付款计算在合约规范中设置

基本计算 使用较大的单边
若 合约规格 的 “对冲保证金” 字段未指定 “使用较大分支计算” 时使用。

计算由若干步组成:

  • 对于未覆盖交易量
  • 对于覆盖交易量 (如果对冲保证金大小已指定)
  • 对于挂单

结果保证金数额的计算是每一步计算出的保证金总和。

计算未覆盖交易量

  • 计算所有持仓的交易量总计, 以及每条分支的市价单 — 买入和卖出。
  • 计算持仓和每条分支的订单权重平均开盘价: (第一笔仓位或订单开盘价 * 第一笔交易量 + … + 第 N 笔仓位或订单开盘价 * 第 N 笔交易量) / (第一笔交易量 + … + 第 N 笔交易量)。
  • 计算未覆盖交易量 (从较大分支里减去较小分支的交易量)。
  • 计算出的交易量和权重均价稍后用来根据相应 品种类型 的公式计算保证金。
  • 当考虑 保证金率 和 转换保证金货币至存款货币 时, 使用比率和汇率的权重平均值。

计算覆盖交易量
如果在 合约规格 指定了 “对冲保证金” 值, 则使用。在此情况下收取对冲保证金, 如同未覆盖的交易量。

如果指定了品种的初始保证金, 则对冲保证金指定为其绝对值 (货币条件)。

如果初始保证金未指定 (等于 0), 则在 “对冲” 字段里指定合约大小。保证金根据相应金融工具类型的公式, 使用指定的合约大小计算。例如, 我们有两笔仓位, 一笔是 1 手买入 EURUSD, 和 1 手卖出 EURUSD, 合约大小是 100,000。如果在 “对冲” 字段里指定的数值是 100,000, 则两笔仓位的保证金将会按照每 1 手计算。如果您指定 0, 不会收取对冲 (覆盖) 交易量的保证金。

每笔对冲仓位收取的保证金, 根据 合约规格 里 “对冲保证金” 字段指定的数值:

  • 计算所有已开仓位和市价单的对冲交易量 (从较大分支里减去未覆盖交易量)。
  • 计算仓位和订单的权重平均开盘价: (第一笔仓位或订单开盘价 * 第一笔交易量 + … + 第 N 笔仓位或订单开盘价 * 第 N 笔交易量) / (第一笔交易量 + … + 第 N 笔交易量)。
  • 计算出的交易量, 权重均价稍后用来根据相应 品种类型 的公式计算保证金。
  • 当考虑 保证金率 和 转换保证金货币至存款货币 时, 使用比率和汇率的权重平均值。

计算挂单

  • 单独计算每笔挂单类型的保证金 (Buy Limit, Sell Limit, 等等)。
  • 当考虑 保证金率 和 转换保证金货币至存款货币 时, 使用每种挂单类型的比率和汇率的权重平均值。
如果在 合约规格 里的 “对冲保证金” 字段指定了 “使用较大分支计算”, 则使用。

  • 计算所有已开仓位和市价单的空头与多头分支的保证金。
  • 单独计算每笔挂单类型的保证金 (Buy Limit, Sell Limit, 等等)。
  • 将多头分支的保证金汇总: 多头持仓和市价单 + 多头挂单。
  • 将空头分支的保证金汇总: 空头持仓和市价单 + 空头挂单。
  • 所有已计算数值的最大值用作最终的保证金值。

MQL5的变化

现在,每个持仓都有其独特的标签。它通常对应于持仓使用的订单标签。程序端更新后,标签自动安排到所有可用持仓。

当在锁仓系统中改变或关闭持仓时,请确保指定其标签 (MqlTradeRequest::ticket)。您也可以在净额系统指定标签,然而根据交易品种名称确定持仓。

MqlTradeRequest

MqlTradeRequest 有两个新字段:

  • 持仓 — 持仓标签。为清楚鉴别而改变和关闭持仓时填充它。它通常匹配用于持仓的订单标签。
  • position_by — 反向持仓标签。它在反向关闭持仓时使用(打开相同但反向的交易品种)。
struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // 执行操作类型
   ulong                         magic;            // EA交易神奇数字
   ulong                         order;            // 订单标签
   string                        symbol;           // 交易品种名称
   double                        volume;           // 按手数请求的交易量
   double                        price;            // 价格 
   double                        stoplimit;        // 止损限价订单水平
   double                        sl;               // 止损订单水平
   double                        tp;               // 获利订单水平
   ulong                         deviation;        //要求价格中最大允许偏差
   ENUM_ORDER_TYPE               type;             // 订单类型
   ENUM_ORDER_TYPE_FILLING       type_filling;     //订单填充类型
   ENUM_ORDER_TYPE_TIME          type_time;        // 订单时间类型
   datetime                      expiration;       // 订单截止日期 ( ORDER_TIME_SPECIFIED 类型订单)
   string                        comment;          // 订单说明
   ulong                         position;         // 持仓标签
   ulong                         position_by;      // 反向持仓标签
  };

MqlTradeTransaction

MqlTradeTransaction 也有两个类似的字段:

  • position — 受交易影响的持仓标签成交处理市场订单相关的交易事务(TRADE_TRANSACTION_ORDER_* except TRADE_TRANSACTION_ORDER_ADD,这里持仓标签尚未分配) 和订单历史 (TRADE_TRANSACTION_HISTORY_*)。
  • position_by — 反向持仓标签。它在反向关闭持仓时使用(打开相同但反向的交易品种)。只有在关闭反向持仓的订单(close by)和反向关闭的交易 (out by)情况下成交。
struct MqlTradeTransaction
  {
   ulong                         deal;             // 交易标签
   ulong                         order;            // 订单标签
   string                        symbol;           // 交易品种名称
   ENUM_TRADE_TRANSACTION_TYPE   type;             // 交易事务类型
   ENUM_ORDER_TYPE               order_type;       // 订单类型
   ENUM_ORDER_STATE              order_state;      // 订单状态
   ENUM_DEAL_TYPE                deal_type;        // 交易类型
   ENUM_ORDER_TYPE_TIME          time_type;        // 订单时间类型
   datetime                      time_expiration;  // 订单截止日期
   double                        price;            // 价格 
   double                        price_trigger;    // 止损限价订单激活价格
   double                        price_sl;         // 止损水平
   double                        price_tp;         // 获利水平
   double                        volume;           // 交易量手数
   ulong                         position;         // 持仓标签
   ulong                         position_by;      // 反向持仓标签
  };

PositionGetTicket

PositionGetTicket 函数通过持仓列表索引返回一个持仓标签并自动选择使用PositionGetDoublePositionGetIntegerPositionGetString函数进一步工作的持仓。

ulong  PositionGetTicket(
   int  index      // 持仓列表索引
   );

PositionSelectByTicket

新的PositionSelectByTicket 函数通过指定标签选择一个持仓进行进一步工作。

bool  PositionSelectByTicket(
   ulong   ticket     // 持仓标签
   );

PositionSelect

PositionSelect 通过交易品种名称选择一个持仓,使用PositionGetDoublePositionGetIntegerPositionGetString 函数进行下一步工作。在锁仓系统中(在这里,一个交易品种可以有多个持仓),函数选择最低标签的持仓。

ACCOUNT_MARGIN_MODE

新属性ACCOUNT_MARGIN_MODE 允许接收预付款计算模式和交易账户持仓账户:

标识符 描述
ACCOUNT_MARGIN_MODE_RETAIL_NETTING 在净额模式账户持仓时(一个交易品种一个持仓)用于场外交易市场。基于交易品种类型计算预付款(SYMBOL_TRADE_CALC_MODE)。
ACCOUNT_MARGIN_MODE_EXCHANGE 用在交易所市场。基于交易品种设置中指定的折扣率计算预付款。折扣率由交易商设置,然而它们不能低于交易所设置的值。
ACCOUNT_MARGIN_MODE_RETAIL_HEDGING 用于独立持仓账户的场外交易市场(锁仓,一个单独交易品种可以有多个持仓)。基于交易品种类型计算预付款(SYMBOL_TRADE_CALC_MODE)。单独交易品种多个持仓的情况已被考虑。

SYMBOL_MARGIN_HEDGED

新属性SYMBOL_MARGIN_HEDGED 允许接收一个交易品种锁仓预付款的值。持仓账户锁仓系统的预付款计算已被如上描述。

新交易常量

由于新增 Close By 操作类型,新的交易属性也显现出来:

  • TRADE_ACTION_CLOSE_BY — 新 交易操作类型 — 反向平仓。
  • ORDER_TYPE_CLOSE_BY — 新 订单类型 — 反向平仓。
  • ORDER_POSITION_BY_ID — new 订单属性 — 用于关闭当前持仓的反向持仓标签。
  • DEAL_ENTRY_OUT_BY — 新 交易类型 — 反向平仓。

额外奖励 – 锁仓和MQL5云网络

现在,您既可以使用MetaTrader 5从事股票市场交易,也可以用它进行广受欢迎的锁仓零售外汇交易。 应用锁仓的自动系统开发人员已经得到了另一个重要的优势。除了多线程测试外,MQL5 云网络的整个计算性能现在也在您掌控。

更新您的平台,体验这些新功能吧!

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/2299

 

 


MyFxtop迈投-靠谱的外汇跟单社区,免费跟随高手做交易!

 

免责声明:本文系转载自网络,如有侵犯,请联系我们立即删除,另:本文仅代表作者个人观点,与迈投财经无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。

風險提示

MyFxtops邁投所列信息僅供參考,不構成投資建議,也不代表任何形式的推薦或者誘導行為。MyFxtops邁投非外匯經紀商,不接觸妳的任何資金。 MYFXTOPS不保證客戶盈利,不承擔任何責任。從事外彙和差價合約等金融產品的槓桿交易具有高風險,損失有可能超過本金,請量力而行,入市前需充分了解潛在的風險。過去的交易成績並不代表以後的交易成績。依據各地區法律法規,MyFxtops邁投不向中國大陸、美國、加拿大、朝鮮居民提供服務。

邁投公眾號

聯繫我們

客服QQ:981617007
Email: service@myfxtop.com

MyFxtops 邁投