第十四章 获取市场信息
这些函数用于接收有关市场规则的信息。函数 | 功能 |
---|---|
SymbolsTotal | 返回有效的交易品种的数量(市场报价 窗口中选中的 或者 全部) |
SymbolName | 返回指定 交易品种 名称 |
SymbolSelect | 在 市场报价 窗口中选中 或者 删除一个交易品种 |
SymbolIsSynchronized | 检查客户端中选定的 交易品种 数据是否与交易服务器上的数据同步 |
SymbolInfoDouble | 为指定的 交易品种 返回相关属性的双精度值 |
SymbolInfoInteger | 为指定的 交易品种 返回相关属性的整数型值(长整型,日期时间,整型或者布尔型) |
SymbolInfoString | 为指定的 交易品种 返回相关属性的字符串类型值 |
SymbolInfoMarginRate | 根据订单类型和方向返回预付款比率 |
SymbolInfoTick | 返回MqlTick型变量中指定的 交易品种 的当前价格。 |
SymbolInfoSessionQuote | 交易品种允许接收报价会话的起止时间以及星期几。 |
SymbolInfoSessionTrade | 交易品种允许接收交易的起止时间 |
MarketBookAdd | 提供 交易品种 的打开市场深度,并订阅接收市场深度(DOM)更改的通知 |
MarketBookRelease | 提供 交易品种 的关闭市场深度,并取消接收市场深度(DOM)更改的通知 |
MarketBookGet | 返回包含 交易品种 的市场深度记录的结构数组MqlBookInfo |
# 14.1 SymbolsTotal
返回有效的交易品种的数量(市场报价 窗口中选中的 或者 全部)。
int SymbolsTotal(
bool selected // True - 只是 市场报价 窗口中的交易品种
);
2
3
参数 selected
[in] 请求模式,可以是true或false。
返回值 如果参数“selected”是true,函数返回交易品种的数量就在 市场报价 窗口中选中的数量,如果值是false,则返回所有 交易品种 的数量。
# 14.2 SymbolName
返回交易品种名称。
string SymbolName(
int pos, // 列表中的位置编号数字
bool selected // true - 只是 市场报价 窗口中的交易品种
);
2
3
4
参数 pos
[in] 一个交易品种的位置顺序编号。
selected
[in] 请求模式。如果该值为TRUE,表示从 市场报价 窗口中选择的交易品种中获取。 如果该值为FALSE,则从通用列表中获取该交易品种的代码符号。
返回值 包含交易品种名称的字符串。
# 14.3 SymbolSelect
在 市场报价 窗口中选择一个交易品种,或者从该窗口中移除一个交易品种。
bool SymbolSelect(
string name, // 交易品种名称
bool select // 添加或者移除
);
2
3
4
参数 name
[in] 交易品种名称。
select
[in] 切换。如果该值为false,则会从 市场报价 窗口中移除一个交易品种,否则会在此窗口中选择一个交易品种。如果 交易品种 的图表是打开的,或者此 交易品种 有持仓,则不能删除该交易品种。
返回值 如果失败返回false。
# 14.4 SymbolIsSynchronized
检查客户端中选定的 交易品种 数据是否与交易服务器上的数据同步
bool SymbolIsSynchronized(
string name, // 交易品种名称
);
2
3
参数 name
[in] 交易品种名称。
返回值 如果数据是 同步的 , 返回true,否则返回false。
相关参考 SymbolInfoInterger, 组织数据接入
# 14.5 SymbolInfoDouble
为指定的 交易品种 返回相关属性的双精度值。这个函数有2个变体。
- 直接返回属性值。
double SymbolInfoDouble(
string name, // 交易品种
ENUM_SYMBOL_INFO_DOUBLE prop_id // 属性标识符
);
2
3
4
- 根据函数是否成功执行返回true或false。 在成功的情况下,该属性的值将放入接收变量中,并由最后一个参数引用。
bool SymbolInfoDouble(
string name, // 交易品种
ENUM_SYMBOL_INFO_DOUBLE prop_id, // 属性标识符
double& double_var // 这里我们接受属性值
);
2
3
4
5
参数 name
[in] 交易品种名称
prop_id
[in] 交易品种的属性标识符,取值范围是 ENUM_SYMBOL_INFO_DOUBLE枚举值之一。
double_var
[out] 接收所请求属性值的 双精度(double) 类型的变量
返回值
双精度型值。如果执行失败,可以使用GetLastError()函数获得有关的错误信息:
• 5040 —— 指定的交易品种名称无效,
• 4301 —— 未知交易品种(金融工具),
• 4302 —— 交易品种在“市场报价”窗口中没找到(可用列表中未发现),
• 4303 —— 交易品种属性的标识符无效。
注意 如果函数用于获取有关最后一次报价的信息,建议使用SymbolInfoTick()。 从客户端连接到交易账户以后,很可能还没有出现过一次报价信号。在这种情况下,请求的值将是不确定的。
在大多数情况下,使用SymbolInfoTick()函数就足够了,该函数允许用户在单次调用期间接收Ask,Bid,Last,Volume和最后一次订单到达的时间。
示例:
void OnTick()
{
//--- 从交易品种属性获得点差
bool spreadfloat=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT);
string comm=StringFormat("Spread %s = %I64d points\r\n",
spreadfloat?"floating":"fixed",
SymbolInfoInteger(Symbol(),SYMBOL_SPREAD));
//--- 现在自己计算点差
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
double spread=ask-bid;
int spread_points=(int)MathRound(spread/SymbolInfoDouble(Symbol(),SYMBOL_POINT));
comm=comm+"Calculated spread = "+(string)spread_points+" points";
Comment(comm);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 14.6 SymbolInfoInteger
为指定的 交易品种 返回相关属性的整数型值(长整型,日期时间,整型或者布尔型),这个函数有2个变体。
- 直接返回属性值
long SymbolInfoInteger(
string name, // 交易品种
ENUM_SYMBOL_INFO_INTEGER prop_id // 属性标识符
);
2
3
4
- 根据函数是否成功执行返回true或false。 在成功的情况下,该属性的值将放入接收变量中,并由最后一个参数引用。
bool SymbolInfoInteger(
string name, // 交易品种
ENUM_SYMBOL_INFO_INTEGER prop_id, // 属性标识符
long& long_var // 这里我们接受属性值
);
2
3
4
5
参数 name
[in] 交易品种名称
prop_id
[in] 交易品种属性标识符,取值范围是 ENUM_SYMBOL_INFO_INTEGER 枚举值之一。
long_var
[out] 接收所请求属性值的 长整型(long) 类型的变量
返回值
长整型值。如果执行失败,可以使用GetLastError()函数获得有关的错误信息:
• 5040 —— 指定的交易品种名称无效,
• 4301 —— 未知交易品种(金融工具),
• 4302 —— 交易品种在“市场报价”窗口中没找到(可用列表中未发现),
• 4303 —— 交易品种属性的标识符无效。
注意 如果函数用于获取有关最后一次报价的信息,建议使用SymbolInfoTick()。 从客户端连接到交易账户以后,很可能还没有出现过一次报价信号。在这种情况下,请求的值将是不确定的。
在大多数情况下,使用SymbolInfoTick()函数就足够了,该函数允许用户在单次调用期间接收Ask,Bid,Last,Volume和最后一次订单到达的时间。
示例:
void OnTick()
{
//--- 从交易品种属性获得点差
bool spreadfloat=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD_FLOAT);
string comm=StringFormat("Spread %s = %I64d points\r\n",
spreadfloat?"floating":"fixed",
SymbolInfoInteger(Symbol(),SYMBOL_SPREAD));
//--- 现在自己计算点差
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
double spread=ask-bid;
int spread_points=(int)MathRound(spread/SymbolInfoDouble(Symbol(),SYMBOL_POINT));
comm=comm+"Calculated spread = "+(string)spread_points+" points";
Comment(comm);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 14.7 SymbolInfoString
为指定的 交易品种 返回相关属性的字符串类型值。这个函数有2个变体。
- 直接返回属性值
string SymbolInfoString(
string name, // 交易品种
ENUM_SYMBOL_INFO_STRING prop_id // 属性标识符
);
2
3
4
- 根据函数是否成功执行返回true或false在成功的情况下,该属性的值将放入接收变量中,并由最后一个参数引用。
bool SymbolInfoString(
string name, // 交易品种
ENUM_SYMBOL_INFO_STRING prop_id, // 属性标识符
string& string_var // 这里假设属性值
);
2
3
4
5
参数 name
[in] 交易品种名称。
prop_id
[in] 交易品种属性标识符,取值范围是 ENUM_SYMBOL_INFO_STRING 枚举值之一。
string_var
[out] 接收所请求属性值的 字符串(string) 类型的变量
返回值 字符串型值。如果执行失败,可以使用GetLastError()函数获得有关的错误信息:
• 5040 —— 指定的交易品种名称无效,
• 4301 —— 未知交易品种(金融工具),
• 4302 —— 交易品种在“市场报价”窗口中没找到(可用列表中未发现),
• 4303 —— 交易品种属性的标识符无效。
注意 如果函数用于获取有关最后一次报价的信息,建议使用SymbolInfoTick()。 从客户端连接到交易账户以后,很可能还没有出现过一次报价信号。在这种情况下,请求的值将是不确定的。
在大多数情况下,使用SymbolInfoTick()函数就足够了,该函数允许用户在单次调用期间接收Ask,Bid,Last,Volume和最后一次订单到达的时间。
# 14.8 SymbolInfoMarginRate
根据订单类型和方向返回预付款比率
bool SymbolInfoMarginRate(
string name, // 交易品种名称
ENUM_ORDER_TYPE order_type, // 订单类型
double& initial_margin_rate, // 初始预付款比率
double& maintenance_margin_rate // 维持预付款比率
);
2
3
4
5
6
参数 name
[in] 交易品种名称。
order_type
[in] 订单类型。
initial_margin_rate [in] 用于接收初始保证金比率的双精度类型变量。初始保证金是对一笔交易的保证金。将利率乘以初始保证金后,我们在指定类型的订单时,会收到账户上预留的资金数额。
maintenance_margin_rate
[out] 用于接收维持预付款比率的双精度类型变量。维持预付款是维护相应方向一手持仓的最低金额。维持预付款与比率相乘后,在指定类型的订单被激活后,我们将收到在帐户上保留的资金数量。
返回值 如果属性请求成功,返回true,否则false。
# 14.9 SymbolInfoTick
返回MqlTick型变量中指定的 交易品种 的当前价格。
bool SymbolInfoTick(
string symbol, // 交易品种名称
MqlTick& tick // 结构参考
);
2
3
4
参数 symbol
[in] 交易品种名称。
tick
[out] 连接 MqlTick 类型结构,显示当前价格和最后价格的即时更新。
返回值 如果成功,函数返回TRUE,否则返回FALSE
# 14.10 SymbolInfoSessionQuote
交易品种允许接收报价会话的起止时间以及星期几。
bool SymbolInfoSessionQuote(
string name, // 交易品种名称
ENUM_DAY_OF_WEEK day_of_week, // 一周中的每天
uint session_index, // 期指
datetime& from, // 期始时间
datetime& to // 期末时间
);
2
3
4
5
6
7
参数 name
[in] 交易品种名称
ENUM_DAY_OF_WEEK
[in] 一周中的星期几,取值范围 ENUM_DAY_OF_WEEK枚举值之一。
uint
[in] 我们想要接收开始和结束时间的一个会话的序号。会话索引从0开始。
from
[out] 从00:00分开始的登陆时间,单位为 秒,返回值的日期可以忽略不计。
to
[out] 从00:00分结束的登陆时间,单位为 秒,返回值的日期可以忽略不计。
返回值 如果指定的会话、交易品种和星期几的数据被接收,返回true,否则返回false。
相关参考 交易品种属性 , TimeToStruct, 数据结构
# 14.11 SymbolInfoSessionTrade
交易品种允许接收交易的起止时间
bool SymbolInfoSessionTrade(
string name, // 交易品种名称
ENUM_DAY_OF_WEEK day_of_week, // 一周中的每天
uint session_index, // 期指
datetime& from, // 期始时间
datetime& to // 期末时间
);
2
3
4
5
6
7
参数 name
[in] 交易品种名称。
ENUM_DAY_OF_WEEK
[in] 一周中的星期几,取值范围 ENUM_DAY_OF_WEEK枚举值之一。
uint
[in] 我们想要接收开始和结束时间的一个会话的序号。会话索引从0开始。
from
[out] 从00:00分开始的登陆时间,单位为 秒,返回值的日期可以忽略不计。
to
[out] 从00:00分结束的登陆时间,单位为 秒,返回值的日期可以忽略不计。
返回值 如果指定的会话、交易品种和星期几的数据被接收,返回true,否则返回false。
相关参考 交易品种属性 ,TimeToStruct ,数据结构
# 14.12 MarketBookAdd
提供 交易品种 的打开市场深度,并订阅接收市场深度(DOM)更改的通知。
bool MarketBookAdd(
string symbol // 交易品种
);
2
3
参数 symbol
[in] 交易品种的名称,具 市场深度 的数据用于EA交易或脚本中。
返回值 如果成功打开,返回true,否则是false。
注意 通常,这个函数必须从OnInit()函数 或 类 构造函数中调用。要处理传入的警报,在EA交易程序中必须包括函数void OnBookEvent(string&symbol)。
相关参考 市场深度结构 , 结构和类
# 14.13 MarketBookRelease
提供 交易品种 的关闭市场深度,并取消接收市场深度(DOM)更改的通知
bool MarketBookRelease(
string symbol // 交易品种
);
2
3
参数 symbol
[in] 交易品种名称。
返回值 如果成功关闭,返回true,否则是false。
注意 通常,这个函数必须从OnInit()函数 或 类 构造函数中调用。要处理传入的警报,在EA交易程序中必须包括函数void OnBookEvent(string&symbol)。
通常,如果在OnInit()函数中调用相应的MarketBookAdd()函数,则必须从OnDeinit()函数调用该函数。或者它必须从 类 析构函数中调用,如果相应的MarketBookAdd()函数从 类 构造函数中调用。
相关参考 市场深度结构 , 结构和类
# 14.14 MarketBookGet
返回包含 交易品种 的市场深度记录的结构数组MqlBookInfo
bool MarketBookGet(
string symbol, // 交易品种
MqlBookInfo& book[] // 参考数组
);
2
3
4
参数 symbol
[in] 交易品种名称。
book[]
[in] 参考一个市场深度数组的记录。该数组可以预先分配给足够数量的记录。如果动态数组未在操作内存中预先分配,则客户端将自己分配该数组。
返回值 如果成功,返回true,否则是false。
整数 市场深度 通过 MarketBookAdd() 函数重新打开。
示例:
MqlBookInfo priceArray[];
bool getBook=MarketBookGet(NULL,priceArray);
if(getBook)
{
int size=ArraySize(priceArray);
Print("MarketBookInfo for ",Symbol());
for(int i=0;i<size;i++)
{
Print(i+":",priceArray[i].price
+" Volume = "+priceArray[i].volume,
" type = ",priceArray[i].type);
}
}
else
{
Print("Could not get contents of the symbol DOM ",Symbol());
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
相关参考
市场深度结构 , 结构和类