第十四章 获取市场信息

这些函数用于接收有关市场规则的信息。
函数 功能
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 - 只是 市场报价 窗口中的交易品种 
   );
1
2
3

参数 selected

[in] 请求模式,可以是true或false。

返回值 如果参数“selected”是true,函数返回交易品种的数量就在 市场报价 窗口中选中的数量,如果值是false,则返回所有 交易品种 的数量。

# 14.2 SymbolName

返回交易品种名称。

string  SymbolName( 
   int   pos,          // 列表中的位置编号数字 
   bool  selected      // true - 只是 市场报价 窗口中的交易品种  
   );
1
2
3
4

参数 pos

[in] 一个交易品种的位置顺序编号。

selected

[in] 请求模式。如果该值为TRUE,表示从 市场报价 窗口中选择的交易品种中获取。 如果该值为FALSE,则从通用列表中获取该交易品种的代码符号。

返回值 包含交易品种名称的字符串。

# 14.3 SymbolSelect

在 市场报价 窗口中选择一个交易品种,或者从该窗口中移除一个交易品种。

bool  SymbolSelect( 
   string  name,       // 交易品种名称 
   bool    select      // 添加或者移除 
   );
1
2
3
4

参数 name

[in] 交易品种名称。

select

[in] 切换。如果该值为false,则会从 市场报价 窗口中移除一个交易品种,否则会在此窗口中选择一个交易品种。如果 交易品种 的图表是打开的,或者此 交易品种 有持仓,则不能删除该交易品种。

返回值 如果失败返回false。

# 14.4 SymbolIsSynchronized

检查客户端中选定的 交易品种 数据是否与交易服务器上的数据同步

bool  SymbolIsSynchronized( 
   string  name,       // 交易品种名称 
   );
1
2
3

参数 name

[in] 交易品种名称。

返回值 如果数据是 同步的 , 返回true,否则返回false。

相关参考 SymbolInfoInterger, 组织数据接入

# 14.5 SymbolInfoDouble

为指定的 交易品种 返回相关属性的双精度值。这个函数有2个变体。

  1. 直接返回属性值。
double  SymbolInfoDouble( 
   string                   name,        // 交易品种 
   ENUM_SYMBOL_INFO_DOUBLE  prop_id      // 属性标识符 
   );
1
2
3
4
  1. 根据函数是否成功执行返回true或false。 在成功的情况下,该属性的值将放入接收变量中,并由最后一个参数引用。
bool  SymbolInfoDouble( 
   string                   name,        // 交易品种 
   ENUM_SYMBOL_INFO_DOUBLE  prop_id,     // 属性标识符 
   double&                  double_var   // 这里我们接受属性值 
   );
1
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); 
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 14.6 SymbolInfoInteger

为指定的 交易品种 返回相关属性的整数型值(长整型,日期时间,整型或者布尔型),这个函数有2个变体。

  1. 直接返回属性值
long  SymbolInfoInteger( 
   string                    name,      // 交易品种 
   ENUM_SYMBOL_INFO_INTEGER  prop_id    // 属性标识符 
  );
1
2
3
4
  1. 根据函数是否成功执行返回true或false。 在成功的情况下,该属性的值将放入接收变量中,并由最后一个参数引用。
bool  SymbolInfoInteger( 
   string                    name,      // 交易品种 
   ENUM_SYMBOL_INFO_INTEGER  prop_id,   // 属性标识符 
   long&                     long_var   // 这里我们接受属性值 
   );
1
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); 
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 14.7 SymbolInfoString

为指定的 交易品种 返回相关属性的字符串类型值。这个函数有2个变体。

  1. 直接返回属性值
string  SymbolInfoString( 
   string                    name,       // 交易品种 
   ENUM_SYMBOL_INFO_STRING   prop_id     // 属性标识符 
   );
1
2
3
4
  1. 根据函数是否成功执行返回true或false在成功的情况下,该属性的值将放入接收变量中,并由最后一个参数引用。
bool  SymbolInfoString( 
   string                    name,       // 交易品种 
   ENUM_SYMBOL_INFO_STRING   prop_id,    // 属性标识符 
   string&                   string_var  // 这里假设属性值 
   );
1
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   // 维持预付款比率 
   );
1
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        // 结构参考 
   );
1
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                   // 期末时间 
   );
1
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                   // 期末时间 
   );
1
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      // 交易品种 
   );
1
2
3

参数 symbol

[in] 交易品种的名称,具 市场深度 的数据用于EA交易或脚本中。

返回值 如果成功打开,返回true,否则是false。

注意 通常,这个函数必须从OnInit()函数 或 类 构造函数中调用。要处理传入的警报,在EA交易程序中必须包括函数void OnBookEvent(string&symbol)。

相关参考 市场深度结构 , 结构和类

# 14.13 MarketBookRelease

提供 交易品种 的关闭市场深度,并取消接收市场深度(DOM)更改的通知

bool  MarketBookRelease( 
   string  symbol      // 交易品种 
   );
1
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[]      // 参考数组 
   );
1
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());
     }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

相关参考
市场深度结构 , 结构和类