CustomBookAdd

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

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

参数

交易品种

[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'数组的采样填充:

市场深度状态

Filling books[]

市场深度采样

books[0].type=BOOK_TYPE_SELL;
books[0].price=1.14337;
books[0].volume=100;   
books[1].type=BOOK_TYPE_SELL;
books[1].price=1.14330;
books[1].volume=50;   
books[2].type=BOOK_TYPE_SELL;
books[2].price=1.14335;
books[2].volume=40;   
books[3].type=BOOK_TYPE_SELL;
books[3].price=1.14333;
books[3].volume=10;   
books[4].type=BOOK_TYPE_BUY;
books[4].price=1.14322;
books[4].volume=10;   
books[5].type=BOOK_TYPE_BUY;
books[5].price=1.14320;
books[5].volume=90;  
books[6].type=BOOK_TYPE_BUY;
books[6].price=1.14319;
books[6].volume=100;   
books[7].type=BOOK_TYPE_BUY;
books[7].price=1.14318;
books[7].volume=10;

例如:

//+------------------------------------------------------------------+
//| 专家初始化函数                                                     |
//+------------------------------------------------------------------+
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);
        }
     }
  }
//+------------------------------------------------------------------+

另见

MarketBookAddCustomTicksAddOnBookEvent