轻松快捷开发 MetaTrader 程序的函数库(第十四部分):品种对象·进阶篇
(2/3)· 从抽象基类到外汇贵金属分类,弄懂 MQL5 品种对象的属性枚举与派生逻辑
◍ 抓实时报价要先认这几个枚举
在 MT5 里想用代码读取某个品种的实时买卖价、当日高低、成交量等,不能直接写变量名,得走 SymbolInfoDouble 配合一组双精度属性枚举。下面这段枚举定义把可读的实时属性列得很全,从买价卖价到期权行权价都有覆盖。 外汇和贵金属杠杆高、点差跳变频繁,用这些属性做条件判断时,要意识到盘口数据本身有滑点风险,回测和实盘可能不一致。 代码里 SYMBOL_PROP_BID 从 SYMBOL_PROP_INTEGER_TOTAL 接着编号,说明双精度属性和整型属性在底层是分开排的;SYMBOL_PROP_POINT 是品种最小变动点位值,做止损距离换算时离不开它;SYMBOL_PROP_TRADE_TICK_VALUE_PROFIT 和 _LOSS 把盈利 tick 与亏损 tick 的币值分开算,对冲或跨品种仓位管理时能直接用。 开 MT5 按 F4 把这段枚举贴进头文件,编译后调用 SymbolInfoDouble(_Symbol, SYMBOL_PROP_BID) 就能在 EA 里拿到实时买价,比自己维护全局变量更稳。
enum ENUM_SYMBOL_PROP_DOUBLE { SYMBOL_PROP_BID = SYMBOL_PROP_INTEGER_TOTAL, class=class="str">"cmt">// Bid - the best price at which a symbol can be sold SYMBOL_PROP_BIDHIGH, class=class="str">"cmt">// The highest Bid price of the day SYMBOL_PROP_BIDLOW, class=class="str">"cmt">// The lowest Bid price of the day SYMBOL_PROP_ASK, class=class="str">"cmt">// Ask - best price, at which an instrument can be bought SYMBOL_PROP_ASKHIGH, class=class="str">"cmt">// The highest Ask price of the day SYMBOL_PROP_ASKLOW, class=class="str">"cmt">// The lowest Ask price of the day SYMBOL_PROP_LAST, class=class="str">"cmt">// The price at which the last deal was executed SYMBOL_PROP_LASTHIGH, class=class="str">"cmt">// The highest Last price of the day SYMBOL_PROP_LASTLOW, class=class="str">"cmt">// The lowest Last price of the day SYMBOL_PROP_VOLUME_REAL, class=class="str">"cmt">// Volume of the day SYMBOL_PROP_VOLUMEHIGH_REAL, class=class="str">"cmt">// Maximum Volume of the day SYMBOL_PROP_VOLUMELOW_REAL, class=class="str">"cmt">// Minimum Volume of the day SYMBOL_PROP_OPTION_STRIKE, class=class="str">"cmt">// Option execution price SYMBOL_PROP_POINT, class=class="str">"cmt">// Point value SYMBOL_PROP_TRADE_TICK_VALUE, class=class="str">"cmt">// SYMBOL_TRADE_TICK_VALUE_PROFIT value SYMBOL_PROP_TRADE_TICK_VALUE_PROFIT, class=class="str">"cmt">// Calculated tick value for a winning position SYMBOL_PROP_TRADE_TICK_VALUE_LOSS, class=class="str">"cmt">// Calculated tick value for a losing position SYMBOL_PROP_TRADE_TICK_SIZE, class=class="str">"cmt">// Minimum price change }
合约与保证金属性的枚举清单
在 MT5 的 ENUM_SYMBOL_INFO_DOUBLE 枚举里,有一批属性专门描述交易合约参数与保证金规则,写 EA 时若漏读会导致手数校验或保证金预估偏差。 下面这段枚举覆盖了从合约大小、应计利息到多空及挂单保证金要求的字段,其中被高亮的那几个(SYMBOL_PROP_MARGIN_LONG / SHORT / STOP / LIMIT / STOPLIMIT)是区分不同方向、不同订单类型保证金占用的关键,做跨品种仓位控制时不能只盯 SYMBOL_PROP_MARGIN_INITIAL。 实际验证方法:开 MT5 终端,在 MetaEditor 里新建脚本,用 SymbolInfoDouble(_Symbol, SYMBOL_PROP_VOLUME_STEP) 打印步长,再用 SYMBOL_PROP_MARGIN_LONG 对比多单占用,外汇与贵金属杠杆差异大,属于高风险品种,数值可能随券商规则变动。
SYMBOL_PROP_TRADE_CONTRACT_SIZE, class=class="str">"cmt">// Trade contract size SYMBOL_PROP_TRADE_ACCRUED_INTEREST, class=class="str">"cmt">// Accrued interest SYMBOL_PROP_TRADE_FACE_VALUE, class=class="str">"cmt">// Face value – initial bond price set by an issuer SYMBOL_PROP_TRADE_LIQUIDITY_RATE, class=class="str">"cmt">// Liquidity rate – share of an asset value that can be used as a collateral SYMBOL_PROP_VOLUME_MIN, class=class="str">"cmt">// Minimum volume for a deal SYMBOL_PROP_VOLUME_MAX, class=class="str">"cmt">// Maximum volume for a deal SYMBOL_PROP_VOLUME_STEP, class=class="str">"cmt">// Minimum volume change step for a deal SYMBOL_PROP_VOLUME_LIMIT, class=class="str">"cmt">// Maximum acceptable total volume of an open position and pending orders in one direction(buy or sell) SYMBOL_PROP_SWAP_LONG, class=class="str">"cmt">// Long swap value SYMBOL_PROP_SWAP_SHORT, class=class="str">"cmt">// Short swap value SYMBOL_PROP_MARGIN_INITIAL, class=class="str">"cmt">// Initial margin SYMBOL_PROP_MARGIN_MAINTENANCE, class=class="str">"cmt">// Maintenance margin for an instrument SYMBOL_PROP_MARGIN_LONG, class=class="str">"cmt">// Margin requirement applicable to class="type">long positions SYMBOL_PROP_MARGIN_SHORT, class=class="str">"cmt">// Margin requirement applicable to class="type">short positions SYMBOL_PROP_MARGIN_STOP, class=class="str">"cmt">// Margin requirement applicable to Stop orders SYMBOL_PROP_MARGIN_LIMIT, class=class="str">"cmt">// Margin requirement applicable to Limit orders SYMBOL_PROP_MARGIN_STOPLIMIT, class=class="str">"cmt">// Margin requirement applicable to Stop Limit orders SYMBOL_PROP_SESSION_VOLUME, class=class="str">"cmt">// The total volume of deals in the current session SYMBOL_PROP_SESSION_TURNOVER class=class="str">"cmt">// The total turnover in the current session
「会话层属性与字符串枚举的接驳点」
在抓取品种元数据做盘前扫描时,会话维度的真实属性很容易被忽略。上面这组枚举值给出了可直接读取的字段:SYMBOL_PROP_SESSION_INTEREST 是未平仓头寸总体积,SYMBOL_PROP_SESSION_BUY_ORDERS_VOLUME 与 SELL_ORDERS_VOLUME 分别是当下买、卖挂单的总量,三者配合能粗略看出多空筹码在会话内的堆积倾向。 会话价格结构也一并暴露:OPEN / CLOSE / AW(成交量加权均价)/ PRICE_SETTLEMENT 以及 LIMIT_MIN、LIMIT_MAX,限定了本会话的合法价格走廊。贵金属与外汇品种在高波动时段可能瞬间撞到 LIMIT 边界,属正常高风险现象,不代表趋势确认。 宏定义里 SYMBOL_PROP_DOUBLE_TOTAL 写死为 47,SKIP 为 0,说明实数型属性共 47 个且全部参与排序。字符串枚举 ENUM_SYMBOL_PROP_STRING 的起始下标直接用 (INTEGER_TOTAL+DOUBLE_TOTAL) 接上,意味着你写 SymbolInfoString 前要先算清前面占了多少槽位,否则读到的字段会整体错位。
SYMBOL_PROP_SESSION_INTEREST, class=class="str">"cmt">// The total volume of open positions SYMBOL_PROP_SESSION_BUY_ORDERS_VOLUME, class=class="str">"cmt">// The total volume of Buy orders at the moment SYMBOL_PROP_SESSION_SELL_ORDERS_VOLUME, class=class="str">"cmt">// The total volume of Sell orders at the moment SYMBOL_PROP_SESSION_OPEN, class=class="str">"cmt">// The open price of the session SYMBOL_PROP_SESSION_CLOSE, class=class="str">"cmt">// The close price of the session SYMBOL_PROP_SESSION_AW, class=class="str">"cmt">// The average weighted price of the session SYMBOL_PROP_SESSION_PRICE_SETTLEMENT, class=class="str">"cmt">// The settlement price of the current session SYMBOL_PROP_SESSION_PRICE_LIMIT_MIN, class=class="str">"cmt">// The minimum allowable price value for the session SYMBOL_PROP_SESSION_PRICE_LIMIT_MAX, class=class="str">"cmt">// The maximum allowable price value for the session SYMBOL_PROP_MARGIN_HEDGED class=class="str">"cmt">// Size of a contract or margin for one lot of hedged positions(oppositely directed positions at one symbol). }; class="macro">#define SYMBOL_PROP_DOUBLE_TOTAL(class="num">47) class=class="str">"cmt">// Total number of event&class="macro">#x27;s real properties class="macro">#define SYMBOL_PROP_DOUBLE_SKIP(class="num">0) class=class="str">"cmt">// Number of symbol real properties not used in sorting class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Symbol class="type">class="kw">string properties | class=class="str">"cmt">//+------------------------------------------------------------------+ enum ENUM_SYMBOL_PROP_STRING { SYMBOL_PROP_NAME = (SYMBOL_PROP_INTEGER_TOTAL+SYMBOL_PROP_DOUBLE_TOTAL), class=class="str">"cmt">// Symbol name SYMBOL_PROP_BASIS, class=class="str">"cmt">// The name of the underlaying asset for a derivative symbol SYMBOL_PROP_CURRENCY_BASE, class=class="str">"cmt">// The base currency of an instrument SYMBOL_PROP_CURRENCY_PROFIT, class=class="str">"cmt">// Profit currency SYMBOL_PROP_CURRENCY_MARGIN, class=class="str">"cmt">// Margin currency SYMBOL_PROP_BANK class=class="str">"cmt">// The source of the current quote };
◍ 品种字符串属性与排序枚举的底层定义
在 MT5 的行情接口里,除了整数和双精度属性,品种还挂了一组字符串属性。下面这几个枚举值直接暴露了符号的元数据:SYMBOL_PROP_DESCRIPTION 是品种的文字说明,SYMBOL_PROP_FORMULA 仅用于自定义品种定价公式,SYMBOL_PROP_ISIN 对应国际证券识别码,SYMBOL_PROP_PAGE 指向品种信息网页,SYMBOL_PROP_PATH 则是它在品种树里的路径。 宏 SYMBOL_PROP_STRING_TOTAL 被写死为 11,代表字符串属性总数。如果你自己写枚举或遍历逻辑,得留意这个数和前面 integer/double 属性的跳过量(SYMBOL_PROP_INTEGER_SKIP、SYMBOL_PROP_DOUBLE_SKIP)共同决定了属性偏移。 排序枚举 ENUM_SORT_SYMBOLS_MODE 从 SORT_BY_SYMBOL_STATUS = 0 起步,依次覆盖自定义属性、图表价类型(Bid/Last)、是否存在、是否入选观察列表、是否可见,以及当前会话的成交数和买卖挂单总数。FIRST_SYM_STR_PROP 这类宏就是拿前面两类属性总数减去跳过量算出来的字符串属性起始下标,改内核遍历代码时别手算错。 外汇与贵金属品种在观察列表里的可见性、会话挂单数都是实时变的,用这些排序字段做扫描脚本时,需意识到高频切换品种可能带来竞态,属于高风险操作环境。
SYMBOL_PROP_DESCRIPTION, class=class="str">"cmt">// The class="type">class="kw">string description of a symbol SYMBOL_PROP_FORMULA, class=class="str">"cmt">// The formula used for custom symbol pricing SYMBOL_PROP_ISIN, class=class="str">"cmt">// The name of a trading symbol in the international system of securities identification numbers(ISIN) SYMBOL_PROP_PAGE, class=class="str">"cmt">// The address of the web page containing symbol information SYMBOL_PROP_PATH, class=class="str">"cmt">// Path in the symbol tree }; class="macro">#define SYMBOL_PROP_STRING_TOTAL(class="num">11) class=class="str">"cmt">// Total number of class="type">class="kw">string properties class=class="str">"cmt">//+------------------------------------------------------------------+ class=class="str">"cmt">//| Possible symbol sorting criteria | class=class="str">"cmt">//+------------------------------------------------------------------+ class="macro">#define FIRST_SYM_DBL_PROP(SYMBOL_PROP_INTEGER_TOTAL-SYMBOL_PROP_INTEGER_SKIP) class="macro">#define FIRST_SYM_STR_PROP(SYMBOL_PROP_INTEGER_TOTAL-SYMBOL_PROP_INTEGER_SKIP+SYMBOL_PROP_DOUBLE_TOTAL-SYMBOL_PROP_DOUBLE_SKIP) enum ENUM_SORT_SYMBOLS_MODE { class=class="str">"cmt">//--- Sort by integer properties SORT_BY_SYMBOL_STATUS = class="num">0, class=class="str">"cmt">// Sort by symbol status SORT_BY_SYMBOL_CUSTOM, class=class="str">"cmt">// Sort by custom symbol class="kw">property SORT_BY_SYMBOL_CHART_MODE, class=class="str">"cmt">// Sort by price type for constructing bars – Bid or Last(from the ENUM_SYMBOL_CHART_MODE enumeration) SORT_BY_SYMBOL_EXIST, class=class="str">"cmt">// Sort by the flag that a symbol with such a name exists SORT_BY_SYMBOL_SELECT, class=class="str">"cmt">// Sort by the flag indicating that a symbol is selected in Market Watch SORT_BY_SYMBOL_VISIBLE, class=class="str">"cmt">// Sort by the flag indicating that a selected symbol is displayed in Market Watch SORT_BY_SYMBOL_SESSION_DEALS, class=class="str">"cmt">// Sort by the number of deals in the current session SORT_BY_SYMBOL_SESSION_BUY_ORDERS, class=class="str">"cmt">// Sort by the total number of current buy orders SORT_BY_SYMBOL_SESSION_SELL_ORDERS, class=class="str">"cmt">// Sort by the total number of current sell orders
品种列表按交易属性排序的枚举全集
在 MT5 的 SymbolInfo 系列接口里,品种集合的排序不是只按名称或点值,而是暴露了一整套 SORT_BY_SYMBOL_* 枚举,覆盖成交量、报价精度、点差、交易时段与保证金模型等维度。 下面这段枚举清单直接可用于 SymbolsGetByFilter 或自定义品种面板里的排序字段映射,复制进 EA 头文件就能编译。 SORT_BY_SYMBOL_VOLUME 按最近一笔成交成交量排序;SORT_BY_SYMBOL_VOLUMEHIGH 按当日最大成交量排序;SORT_BY_SYMBOL_VOLUMELOW 按当日最小成交量排序。 SORT_BY_SYMBOL_TIME 按最后报价时间排序;SORT_BY_SYMBOL_DIGITS 按价格小数位排序;SORT_BY_SYMBOL_DIGITS_LOT 按手数小数位排序。 SORT_BY_SYMBOL_SPREAD 按点差点数排序;SORT_BY_SYMBOL_SPREAD_FLOAT 按浮动点差标志排序;SORT_BY_SYMBOL_TICKS_BOOKDEPTH 按深度行情最大显示档位排序。 SORT_BY_SYMBOL_TRADE_CALC_MODE 按合约价格计算方式(ENUM_SYMBOL_CALC_MODE)排序;SORT_BY_SYMBOL_TRADE_MODE 按订单执行类型(ENUM_SYMBOL_TRADE_MODE)排序。 SORT_BY_SYMBOL_START_TIME 与 SORT_BY_SYMBOL_EXPIRATION_TIME 分别按交易起始与结束日期排序,期货品种常用。 SORT_BY_SYMBOL_TRADE_STOPS_LEVEL 按止损单距现价最小点数排序;SORT_BY_SYMBOL_TRADE_FREEZE_LEVEL 按交易冻结距离点数排序。 SORT_BY_SYMBOL_TRADE_EXEMODE 按交易执行模式(ENUM_SYMBOL_TRADE_EXECUTION)排序;SORT_BY_SYMBOL_SWAP_MODE 按掉期计算模型(ENUM_SYMBOL_SWAP_MODE)排序。 SORT_BY_SYMBOL_SWAP_ROLLOVER3DAYS 按三重掉期计息日(ENUM_DAY_OF_WEEK)排序;SORT_BY_SYMBOL_MARGIN_HEDGED_USE_LEG 按对冲保证金取大边模式排序。 SORT_BY_SYMBOL_EXPIRATION_MODE 按允许挂单过期模式的标志位排序。 实盘里若做多品种监控面板,优先用 SORT_BY_SYMBOL_SPREAD 和 SORT_BY_SYMBOL_VOLUME 做前端排序,能更快暴露流动性异常品种;外汇与贵金属杠杆高,排序结果仅作筛选参考,不预示方向。
SORT_BY_SYMBOL_VOLUME, class=class="str">"cmt">// Sort by last deal volume SORT_BY_SYMBOL_VOLUMEHIGH, class=class="str">"cmt">// Sort by maximum volume for a day SORT_BY_SYMBOL_VOLUMELOW, class=class="str">"cmt">// Sort by minimum volume for a day SORT_BY_SYMBOL_TIME, class=class="str">"cmt">// Sort by the last quote time SORT_BY_SYMBOL_DIGITS, class=class="str">"cmt">// Sort by a number of decimal places SORT_BY_SYMBOL_DIGITS_LOT, class=class="str">"cmt">// Sort by a number of decimal places in a lot SORT_BY_SYMBOL_SPREAD, class=class="str">"cmt">// Sort by spread in points SORT_BY_SYMBOL_SPREAD_FLOAT, class=class="str">"cmt">// Sort by floating spread SORT_BY_SYMBOL_TICKS_BOOKDEPTH, class=class="str">"cmt">// Sort by a maximum number of requests displayed in the market depth SORT_BY_SYMBOL_TRADE_CALC_MODE, class=class="str">"cmt">// Sort by contract price calculation method(from the ENUM_SYMBOL_CALC_MODE enumeration) SORT_BY_SYMBOL_TRADE_MODE, class=class="str">"cmt">// Sort by order execution type(from the ENUM_SYMBOL_TRADE_MODE enumeration) SORT_BY_SYMBOL_START_TIME, class=class="str">"cmt">// Sort by an instrument trading start date(usually used for futures) SORT_BY_SYMBOL_EXPIRATION_TIME, class=class="str">"cmt">// Sort by an instrument trading end date(usually used for futures) SORT_BY_SYMBOL_TRADE_STOPS_LEVEL, class=class="str">"cmt">// Sort by the minimum indent from the current close price(in points) for setting Stop orders SORT_BY_SYMBOL_TRADE_FREEZE_LEVEL, class=class="str">"cmt">// Sort by trade operation freeze distance(in points) SORT_BY_SYMBOL_TRADE_EXEMODE, class=class="str">"cmt">// Sort by trade execution mode(from the ENUM_SYMBOL_TRADE_EXECUTION enumeration) SORT_BY_SYMBOL_SWAP_MODE, class=class="str">"cmt">// Sort by swap calculation model(from the ENUM_SYMBOL_SWAP_MODE enumeration) SORT_BY_SYMBOL_SWAP_ROLLOVER3DAYS, class=class="str">"cmt">// Sort by week day for accruing a triple swap(from the ENUM_DAY_OF_WEEK enumeration) SORT_BY_SYMBOL_MARGIN_HEDGED_USE_LEG, class=class="str">"cmt">// Sort by the calculation mode of a hedged margin using the larger leg(Buy or Sell) SORT_BY_SYMBOL_EXPIRATION_MODE, class=class="str">"cmt">// Sort by flags of allowed order expiration modes
「按品种实时属性给观察列表排序」
在 MT5 的行情观察列表里,除了按交易规则类字段排序,还能直接按真实报价与成交量属性排。下面这组枚举从 SORT_BY_SYMBOL_BID 开始,对应 FIRST_SYM_DBL_PROP,说明它们底层走的是 double 型属性通道。 SORT_BY_SYMBOL_BID 到 SORT_BY_SYMBOL_ASKLOW 覆盖了买卖价及当日高低:Bid 现价、Bid 日高、Bid 日低、Ask 现价、Ask 日高、Ask 日低。做跨品种价差监控时,按 SORT_BY_SYMBOL_SPREAD 类似思路排 Bid/Ask 差,能快速揪出点差异常放大的贵金属对。 SORT_BY_SYMBOL_LAST 与 LASTHIGH / LASTLOW 盯的是最后成交价及当日区间,对期货式品种比 Bid/Ask 更有参考意义。SORT_BY_SYMBOL_VOLUME_REAL 及高低变种则按当日真实成交量排,扫量异动一目了然。 末尾的 SORT_BY_SYMBOL_POINT 和 SORT_BY_SYMBOL_TRADE_TICK_VALUE 按点值、每跳盈亏值排。多品种同时跑 EA 时,用后者排序可优先排查Tick价值突变的标的,外汇与贵金属杠杆高,点值跳动可能瞬间改变仓位风险。
SORT_BY_SYMBOL_FILLING_MODE, class=class="str">"cmt">// Sort by flags of allowed order filling modes SORT_BY_SYMBOL_ORDER_MODE, class=class="str">"cmt">// Sort by flags of allowed order types SORT_BY_SYMBOL_ORDER_GTC_MODE, class=class="str">"cmt">// Sort by StopLoss and TakeProfit orders lifetime SORT_BY_SYMBOL_OPTION_MODE, class=class="str">"cmt">// Sort by option type(from the ENUM_SYMBOL_OPTION_MODE enumeration) SORT_BY_SYMBOL_OPTION_RIGHT, class=class="str">"cmt">// Sort by option right(Call/Put) (from the ENUM_SYMBOL_OPTION_RIGHT enumeration) class=class="str">"cmt">//--- Sort by real properties SORT_BY_SYMBOL_BID = FIRST_SYM_DBL_PROP, class=class="str">"cmt">// Sort by Bid SORT_BY_SYMBOL_BIDHIGH, class=class="str">"cmt">// Sort by maximum Bid for a day SORT_BY_SYMBOL_BIDLOW, class=class="str">"cmt">// Sort by minimum Bid for a day SORT_BY_SYMBOL_ASK, class=class="str">"cmt">// Sort by Ask SORT_BY_SYMBOL_ASKHIGH, class=class="str">"cmt">// Sort by maximum Ask for a day SORT_BY_SYMBOL_ASKLOW, class=class="str">"cmt">// Sort by minimum Ask for a day SORT_BY_SYMBOL_LAST, class=class="str">"cmt">// Sort by the last deal price SORT_BY_SYMBOL_LASTHIGH, class=class="str">"cmt">// Sort by maximum Last for a day SORT_BY_SYMBOL_LASTLOW, class=class="str">"cmt">// Sort by minimum Last for a day SORT_BY_SYMBOL_VOLUME_REAL, class=class="str">"cmt">// Sort by Volume for a day SORT_BY_SYMBOL_VOLUMEHIGH_REAL, class=class="str">"cmt">// Sort by maximum Volume for a day SORT_BY_SYMBOL_VOLUMELOW_REAL, class=class="str">"cmt">// Sort by minimum Volume for a day SORT_BY_SYMBOL_OPTION_STRIKE, class=class="str">"cmt">// Sort by an option execution price SORT_BY_SYMBOL_POINT, class=class="str">"cmt">// Sort by a single point value SORT_BY_SYMBOL_TRADE_TICK_VALUE, class=class="str">"cmt">// Sort by SYMBOL_TRADE_TICK_VALUE_PROFIT value