第十七章 自定义交易品种

此函数用于 创建 和 编辑 自定义交易品种的属性。

当客户端连接到某个交易服务器时,用户能够处理经纪平台提供的金融工具的 时间序列。 可用的金融交易品种列表显示在 市场报价 窗口中。一组独立的函数允许接收 交易品种属性,交易时段和市场深度更新等数据。

本部分描述的这组函数可以创建自定义交易品种。为此,用户可以使用交易服务器现有的交易品种,文本文件或外部数据源。

函数 操作
CustomSymbolCreate 使用指定组中的指定名称创建一个自定义的交易品种
CustomSymbolDelete 删除指定名称的自定义交易品种
CustomSymbolSetInteger 为自定义交易品种设置 整型 属性值
CustomSymbolSetDouble 为自定义交易品种设置 真实型 属性值
CustomSymbolSetString 为自定义交易品种设置 字符串型 属性值
CustomSymbolSetMarginRate 按照订单类型和方向,为自定义交易品种设置预付款比率
CustomSymbolSetSessionQuote 为指定的交易品种和工作日设置报价时段的起止时间
CustomSymbolSetSessionTrade 为指定的交易品种和工作日设置交易时段的起止时间
CustomRatesDelete 删除指定时间间隔内自定义交易品种历史价格的全部K线柱图形
CustomRatesReplace 以MqlRates类型数组的数据完全替换指定时间间隔内自定义交易品种的历史价格
CustomRatesUpdate 将缺失的K线柱图形添加到自定义交易品种的历史价格中,并用MqlRates类型数组的数据替换现有数据
CustomTicksAdd 添加MqlTick类型的数组的数据到自定义交易品种的历史价格中。自定义交易品种一定要在 市场报价 窗口中选中
CustomTicksDelete 删除指定时间间隔内自定义交易品种历史价格中的全部报价
CustomTicksReplace 以MqlTick类型数组的数据完全替换指定时间间隔内的自定义交易品种的历史价格
CustomBookAdd 为自定义交易品种传递市场深度的状态

# 17.1 CustomSymbolCreate

使用指定组中的指定名称创建一个自定义的交易品种

bool  CustomSymbolCreate( 
   const string     symbol_name,         // 自定义交易品种名称 
   const string     symbol_path=""       // 将要创建交易品种的组的名称 
   );
1
2
3
4

参数

symbol_name

[in] 自定义交易品种名称。它不应包含交易品种所在的组或分组。

symbol_path

[in] 交易品种所在的 组 名称。

返回值

true —— 成功,否则 —— false。若要获得错误信息,请调用GetLastError()函数。

注意

无论创建所在的 组 名称是什么,自定义交易品种名称都应该是独一无二的。

交易品种 和 组 的名称只能包含拉丁字母,不可带有标点符号,空格或特殊字符(只可以包括以下符号".","_","&" 和 "#")。不建议使用下列字符<,>,:,",/,|,?,*。

相关参考

SymbolName,SymbolSelect,CustomSymbolDelete

# 17.2 CustomSymbolDelete

删除指定名称的自定义交易品种。

bool  CustomSymbolDelete( 
   const string     symbol_name          // 自定义交易品种名称 
   );
1
2
3

参数

symbol_name

[in] 自定义交易品种名称。不应该与现有交易品种名称相同。

返回值

true —— 成功,否则 —— false。若要获得错误信息,请调用GetLastError()函数。

注意

不可以删除在 市场报价 窗口显示的 或 图表已打开的 自定义交易品种。

相关参考
SymbolName,SymbolSelect,CustomSymbolCreate

# 17.3 CustomSymbolSetInteger

为自定义交易品种设置 整型 属性值。

bool  CustomSymbolSetInteger( 
   const string              symbol_name,      // 交易品种名称 
   ENUM_SYMBOL_INFO_INTEGER  property_id,      // 属性 ID 
   long                      property_value    // 属性值 
   );
1
2
3
4
5

参数

symbol_name

[in] 自定义交易品种名称。

property_id

[in] 交易品种属性ID。取值范围 是ENUM_SYMBOL_INFO_INTEGER枚举值之一。

property_value

[in] 包含属性值的 长整型 变量。

返回值

true —— 成功,否则 —— false。若要获得错误信息,请调用GetLastError()函数。

相关参考
SymbolInfoInteger

# 17.4 CustomSymbolSetDouble

为自定义交易品种设置 真实型 属性值。

bool  CustomSymbolSetDouble( 
   const string              symbol_name,      // 交易品种名称 
   ENUM_SYMBOL_INFO_DOUBLE   property_id,      // 属性ID 
   double                    property_value    // 属性值 
   );
1
2
3
4
5

参数 symbol_name

[in] 自定义交易品种名称。

property_id

[in] 交易品种属性ID。取值范围是ENUM_SYMBOL_INFO_DOUBLE枚举值之一。

property_value

[in] 包含属性值的 双精度类型 变量。

返回值

true —— 成功,否则 —— false。若要获得错误信息,请调用GetLastError()函数。

相关参考
SymbolInfoDouble

# 17.5 CustomSymbolSetString

为自定义交易品种设置 字符串类型 属性值。

bool  CustomSymbolSetString( 
   const string              symbol_name,      // 交易品种名称 
   ENUM_SYMBOL_INFO_STRING   property_id,      // 属性 ID 
   string                    property_value    // 属性值 
   );
1
2
3
4
5

参数

symbol_name

[in] 自定义交易品种名称。

property_id

[in] 交易品种属性ID。取值范围是ENUM_SYMBOL_INFO_STRING枚举值之一。

property_value

[in] 包含属性值的 字符串类型 变量。

返回值

true —— 成功,否则 —— false。若要获得错误信息,请调用GetLastError()函数。

相关参考
SymbolInfoString

# 17.6 CustomSymbolSetMarginRate

按照订单类型和方向,为自定义交易品种设置预付款比率。

bool  CustomSymbolSetMarginRate( 
   const string       symbol_name,              // 交易品种名称 
   ENUM_ORDER_TYPE    order_type,               // 订单类型 
   double             initial_margin_rate,      // 初始预付款比率 
   double             maintenance_margin_rate   // 维持预付款比率 
   );
1
2
3
4
5
6

参数

symbol_name

[in] 自定义交易品种名称。

order_type

[in] 订单类型。

initial_margin_rate

[in] 具有初始预付款(保证金)比率的 双精度类型 变量。初始预付款(保证金)是指,在适当方向上进行1标准手交易的保证金。乘以初始预付款(保证金)比率后,我们会获得指定类型订单下单账户上保留的资金数额。

maintenance_margin_rate

[in] 具有维持预付款比率的 双精度类型 变量。维持预付款是指,在适当方向保持1标准手持仓的最低金额。乘以维持预付款比率后,我们会获得激活指定类型订单后账户上保留的资金数额。

返回值

true —— 成功,否则 —— false。若要获得错误信息,请调用GetLastError()函数。

相关参考
SymbolInfoMarginRate

# 17.7 CustomSymbolSetSessionQuote

为指定交易品种和工作日设置指定报价时段的起止时间。

bool  CustomSymbolSetSessionQuote( 
   const string      symbol_name,         // 交易品种名称 
   ENUM_DAY_OF_WEEK  day_of_week,         // 工作日 
   uint              session_index,       // 时段索引 
   datetime          from,                // 开始时段 
   datetime          to                   // 结束时段 
   );
1
2
3
4
5
6
7

参数

symbol_name

[in] 自定义交易品种名称。

ENUM_DAY_OF_WEEK

[in] 工作日,取值范围是ENUM_DAY_OF_WEEK枚举值之一。

uint

[in] 报价时段的索引编号,设置起止时间。时段索引编号从0开始。

from

[in] 设置开始时间,时段按照00:00的格式以秒为单位计算,忽略变量中的数据值。

to

[in] 设置结束时间,时段按照00:00的格式以秒为单位计算,忽略变量中的数据值。

返回值

true —— 成功,否则 —— false。若要获得错误信息,请调用GetLastError()函数。

注意

如果session_index指定的时段已经存在,那么该函数只需编辑时段的起止时间。

如果这个时段传递的起止参数均为零(from=0 and to=0),那么将会删除session_index对应的时段,而时段索引向下移动。

只能按照顺序添加时段。换句话说,只有索引编号 0 时段存在时您才能添加session_index = 1。如果打破这个规则,则不会创建新时段,而函数本身也会返回 'false'。

相关参考
SymbolInfoSessionQuote,Symbol info,TimeToStruct,Date structure

# 17.8 CustomSymbolSetSessionTrade

为指定交易品种和工作日设置指定交易时段的起止时间

bool  CustomSymbolSetSessionTrade( 
   const string      symbol_name,         // 交易品种名称 
   ENUM_DAY_OF_WEEK  day_of_week,         // 工作日 
   uint              session_index,       // 时段索引 
   datetime          from,                // 开始时段 
   datetime          to                   // 结束时段 
   );
1
2
3
4
5
6
7

参数

symbol_name

[in] 自定义交易品种名称。

ENUM_DAY_OF_WEEK

[in] 工作日,取值范围是ENUM_DAY_OF_WEEK枚举值之一。

uint

[in] 允许交易时段的索引编号,设置起止时间。时段索引编号从0开始。

from

[in] 设置开始时间,时段按照00:00的格式以秒为单位计算,忽略变量中的数据值。

to

[in] 设置结束时间,时段按照00:00的格式以秒为单位计算,忽略变量中的数据值。

返回值

true —— 成功,否则 —— false。若要获得错误信息,请调用GetLastError()函数。

注意

如果session_index指定的时段已经存在,那么该函数只需编辑时段的起止时间。

如果这个时段传递的起止参数均为零(from=0 and to=0),那么将会删除session_index对应的时段,而时段索引向下移动。

只能按照顺序添加时段。换句话说,只有索引编号 0 时段存在时您才能添加session_index = 1。如果打破这个规则,则不会创建新时段,而函数本身也会返回 'false'。

相关参考

SymbolInfoSessionQuote,Symbol info,TimeToStruct,Date structure

# 17.9 CustomRatesDelete

删除指定时间间隔内自定义交易品种历史价格的全部K线柱图形。

int  CustomRatesDelete( 
   const string     symbol,       // 交易品种名称 
   datetime         from,         // 开始日期 
   datetime         to,           // 结束日期 
   const MqlRates&  rates[]       // 即将用于自定义交易品种的数据数组 
   );
1
2
3
4
5
6

参数

交易品种

[in] 自定义交易品种名称。

from

[in] 指定删除历史价格范围内的第一根K线柱的时间。

to

[in] 指定删除历史价格范围内的最后一根K线柱的时间。

rates[]

[in] MqlRates类型历史数据数组。

返回值

已删除柱形图的数量, 如果发生错误,则返回 -1。

相关参考
CustomRatesReplace,CustomRatesUpdate,CopyRates

# 17.10 CustomRatesReplace

以MqlRates类型数组的数据完全替换指定时间间隔内自定义交易品种的历史价格

int  CustomRatesReplace( 
   const string     symbol,       // 交易品种名称 
   datetime         from,         // 开始日期 
   datetime         to,           // 结束日期 
   const MqlRates&  rates[]       // 即将用于自定义交易品种的数据数组 
   );
1
2
3
4
5
6

参数

交易品种

[in] 自定义交易品种名称。

from

[in] 指定替换历史价格范围内的第一根K线柱的时间。

to

[in] 指定替换历史价格范围内的最后一根K线柱的时间。

rates[]

[in] M1的MqlRates类型历史数据数组。

返回值

已更新柱形图的数量,如果发生错误,则返回 -1。

注意

如果来自rates []数组的K线柱超出了指定的范围,它将被忽略。如果价格历史中已经存在这样的K线柱并且在给定的时间范围内,则它将被替换。当前价格历史中超出指定范围的所有其它K线柱线保持不变。 rate []数组数据在OHLC价格方面应该是正确的,而K线柱开盘时间应该与M1时间段相对应。

相关参考
CustomRatesDelete,CustomRatesUpdate,CopyRates CustomRatesUpdate

将缺失的K线柱图形添加到自定义交易品种的历史价格中,并用MqlRates类型数组的数据替换现有数据

int  CustomRatesUpdate( 
   const string           symbol,       //自定义交易品种名称 
   const MqlRates&        rates[]       // 即将用于自定义交易品种的数据数组 
   );
1
2
3
4

参数

交易品种

[in] 自定义交易品种名称。

rates[]

[in] M1的MqlRates类型历史数据数组。

返回值

已更新柱形图的数量,如果发生错误,则返回 -1。

注意

如果指定的时间范围内,没有rates []数组中的K线柱,则会添加该K线柱图形。如果价格历史中已经存在这样的K线柱并且在给定的时间范围内,则它将被替换。当前价格历史中超出指定范围的所有其它K线柱线保持不变。 rate []数组数据在OHLC价格方面应该是正确的,而K线柱开盘时间应该与M1时间段相对应。

相关参考

CustomRatesReplace,CustomRatesDelete,CopyRates

# 17.11 CustomRatesUpdate

将丢失的柱形图添加到自定义交易品种历史并用MqlRates类型数组数据替换现有数据。

int  CustomRatesUpdate(
   const string     symbol,             //自定义交易品种名称
   const MqlRates&  rates[],            // 即将用于自定义交易品种的数据数组
   uint             count=WHOLE_ARRAY   // 即将使用的rates[]数组元素的数量
   );
1
2
3
4
5

参数

交易品种

[in] 自定义交易品种名称。

rates[]

[in] M1的MqlRates类型历史数据数组。

count=WHOLE_ARRAY

[in] 即将用于更新的rates[]数组元素的数量。WHOLE_ARRAY意味着所有rates[]数组元素都应被使用。

返回值

已更新柱形图的数量,错误情况下为-1。

注意

如果当前自定义交易品种的历史中没有rates[]数组柱形图,则需要添加该柱形图。如果已存在这个柱形图,则它可被替换。当前价格历史的其他所有柱形图保持不变。有关高开低收价格应该是正确的rates[]数组数据,而开盘时间柱形图应该对应M1 时间周期。

另见

CustomRatesReplace,CustomRatesDelete,CopyRates

# 17.12 CustomTicksAdd

添加MqlTick类型的数组的数据到自定义交易品种的历史价格中。自定义交易品种一定要在 市场报价 窗口中选中

int  CustomTicksAdd( 
   const string           symbol,       // 交易品种名称 
   const MqlTick&         ticks[]       // 应该应用于自定义交易品种的报价数据数组 
   );
1
2
3
4

参数

交易品种

[in] 自定义交易品种的名称。

ticks[]

[in] MqlTick类型的报价数据数组按照从 最早 到 最新 的顺序排列,例如ticks[k].time_msc <= ticks[n].time_msc,if k<n。

返回值

添加报价的数量,如果发生错误,则返回 -1。

注意

CustomTicksAdd函数只能用于在 市场报价 窗口打开的自定义交易品种。如果没有在市场报价窗口选择交易品种,您应该使用CustomTicksReplace添加报价。

MqlTick结构有两个关于时间值的字段:time (以秒表示的报价时间) 和 time_msc (以毫秒表示的报价时间),从1970年1月1日开始计算。添加报价的这些字段按照以下顺序进行处理:

  1. 如果ticks[k].time_msc != 0,我们用它来填写ticks[k].time字段,例如为报价设置 ticks[k].time=ticks[k].time_msc/1000 (整除) 2. 如果ticks[k].time_msc == 0 并且 ticks[k].time != 0,那么将乘以1000来获得毫秒表示的时间,例如ticks[k].time_msc=ticks[k].time*1000 3. 如果ticks[k].time_msc==0和ticks[k].time==0,那么将调用CustomTicksApply函数时把当前交易服务器的毫秒时间写入这些字段。

如果ticks[k].bid,ticks[k].ask,ticks[k].last或ticks[k].volume的数值大于零,那么将适当的标识组合写入ticks[k].flags 字段:

•TICK_FLAG_BID —— 报价已更改卖价(Bid)
•TICK_FLAG_ASK —— 报价已更改买价(Ask)
•TICK_FLAG_LAST —— 报价已更改最后交易价(last_price)
•TICK_FLAG_VOLUME —— 报价已更改交易量(volume)

如果字段的值 小于或等于 零,对应的标识将不写入ticks[k].flags字段。

标志TICK_FLAG_BUY和TICK_FLAG_SELL不会添加到自定义符号的历史记录中。

相关参考
CustomRatesDelete,CustomRatesUpdate,CustomTicksReplace, CopyTicks,CopyTicksRange

# 17.13 CustomTicksDelete

删除指定时间间隔内自定义交易品种历史价格中的全部报价

int  CustomTicksDelete( 
   conststring      symbol,            // 交易品种名称 
   long             from_msc,          // 开始日期 
   long             to_msc             // 结束日期 
   );
1
2
3
4
5

参数

交易品种

[in] 自定义交易品种名称。

from_msc

[in] 指定删除历史价格范围内的第一个报价时间。单位:毫秒,从1970.01.01开始计算。

to_msc

[in] 指定删除历史价格范围内的最后一个报价时间。单位:毫秒,从1970.01.01开始计算。

返回值

已删除报价的数量,如果发生错误,则返回 -1。

相关参考
CustomRatesDelete,CustomRatesUpdate,CustomTicksReplace, CopyTicks,CopyTicksRange

# 17.14 CustomTicksReplace

以MqlTick类型数组的数据完全替换指定时间间隔内的自定义交易品种的历史价格

int  CustomTicksReplace( 
   const string     symbol,            // 交易品种名称 
   long             from_msc,          // 开始日期 
   long             to_msc,            // 结束日期 
   const MqlTick&   ticks[]            // 即将用于自定义交易品种的数据数组 
   );
1
2
3
4
5
6

参数

交易品种

[in] 自定义交易品种名称。

from_msc

[in] 指定替换历史价格范围内的第一个报价时间。单位:毫秒,从1970.01.01开始计算。

to_msc

[in] 指定替换历史价格范围内的最后一个报价时间。单位:毫秒,从1970.01.01开始计算。

ticks[]

[in] 以升序时间顺序排列的MqlTick类型报价数据数组。

返回值

已更新报价的数量,如果发生错误,则返回 -1。

注意

由于在报价流中几个 跳价 可能通常具有相同的时间(精确的 跳价 时间存储在MqlTick结构的time_msc字段中),因此CustomTicksReplace函数不会自动按时间排列ticks []数组元素。 因此,必须按时间升序预先排列 每次跳价 的数组。

跳价 被连续地逐日替换,直至到达在to_msc中指定的时间 或 发生错误时停止。从指定范围的第一天开始处理,然后是第二天。一旦检测到 报价时间和升序(非下降)之间的不匹配,则 跳价 替换将在当天停止。所有之前的报价都被成功替换,而当天(在错误发生的那一天)以及指定时间间隔内的所有剩余天数则保持不变。

如果ticks[] 数组包含任何时间的非报价数据(通常是任何时间间隔),那么使用ticks[]报价数据后,丢失数据对应的“hole”显示在自定义交易品种的历史中。换句话说,调用丢失报价的CustomTicksReplace函数等同于删除部分报价历史,就好比调用“hole”间隔的CustomTicksDelete函数。

如果ticks []数组在任何一天(通常是任何时间间隔)都不包含任何 跳价 数据,则应用来自ticks []的跳价数据后,自定义交易品种的历史记录中会出现与缺失数据相对应的“洞(缺口)”。 换句话说,调用CustomTicksReplace时,如果缺少 跳价 ,就相当于删除了 跳价 历史记录的一部分,就好像CustomTicksDelete带有“空洞(缺口)”间隔被调用一样。

相关参考
CustomRatesDelete,CustomRatesUpdate,CustomTicksDelete,CopyTicks,CopyTicksRange

# 17.15 CustomBookAdd

为自定义交易品种传递市场深度的状态。该函数可以推广市场深度,类似于价格从交易商服务器到达。

int  CustomBookAdd( 
   const string        symbol,            // 交易品种名称 
   const MqlBookInfo&  books[]            // 带有对市场深度元素描述的数组 
   uint                count=WHOLE_ARRAY  // 将要使用的元素数量 
   );
1
2
3
4
5

参数

交易品种

[in] 自定义交易品种名称。

books[]

[in] MqlBookInfo数组类型数据充分描述了市场深度状态 — 所有买卖请求。该传递的市场深度状态完全取代了过去的深度。

count=WHOLE_ARRAY

[in] 将要传递到函数的'books'数组元素的数量。默认使用整个数组。

返回值

添加报价的数量或错误情况下的-1。

注意

CustomBookAdd函数仅适用于市场深度所开放的自定义交易品种 — 通过平台界面或MarketBookAdd函数。

当交易品种卖价和买价加入到市场深度时,不会更新。您应该控制最佳价格的变化,并使用CustomTicksAdd将其加入到报价中。

检查传递数据的有效性:价格和交易量不应是负值,并且类型、价格和交易量(MqlBookInfo.volume or MqlBookInfo.volume_real)应该为每一个元素而指定。如果至少有一个市场深度元素描述错误,系统将完全丢弃传递的状态。

MqlBookInfo.volume_real提高精确度交易量拥有高于常规MqlBookInfo.volume的优先级。如果两个值都为市场深度元素指定,那么会使用volume_real的值。

MqlBookInfo元素在'books'数组中的顺序并不重要。当保存数据时,程序端将根据其价格进行排序。

当保存数据时,检查接收人自定义交易品种的"Book depth" (SYMBOL_TICKS_BOOKDEPTH)参数。如果在传递的市场深度中,卖出请求的数量超过该值,则丢弃超出的部分。购买请求也是如此。

'books'数组的采样填充:

例如:

//+------------------------------------------------------------------+
//| 专家初始化函数                          |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 为我们将要检索数据的交易品种启用市场深度 from
   MarketBookAdd(Symbol());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 专家去初始化函数                                                   |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| 报价函数                                                          |
//+------------------------------------------------------------------+
void OnTick(void)
  {
   MqlTick ticks[];
   ArrayResize(ticks,1); 
//--- 将普通交易品种的当前价格复制到自定义交易品种 
   if(SymbolInfoTick(Symbol(),ticks[0]))
     {
      string symbol_name=Symbol()+".SYN";
      CustomTicksAdd(symbol_name,ticks);
     }
  }
//+------------------------------------------------------------------+
//| Book 函数                                                        |
//+------------------------------------------------------------------+
void OnBookEvent(const string &book_symbol)
  { 
//--- 将普通交易品种的当前市场深度状态复制到自定义交易品种 
   if(book_symbol==Symbol())
     {
      MqlBookInfo book_array[];
      if(MarketBookGet(Symbol(),book_array))
        {
         string symbol_name=Symbol()+".SYN";
         CustomBookAdd(symbol_name,book_array);
        }
     }
  }
//+------------------------------------------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

另见
MarketBookAdd,CustomTicksAdd, OnBookEvent