在市场发布程序遇到问题 - 页 2

 
Xiao Hong Bian #:

用这段代码检验了,传上去检验还是报错,谢谢请看看什么原因!


//--- 交易操作允许的最大交易量
   double max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
   {
      return(max_volume);
   }

这个代码检查了最大的单笔开仓量,但你这个应该是超过了总单量限制,再加个检查项。
Print("Maximum permitted amount of a lot=",MarketInfo(Symbol(),MODE_MAXLOT)); 

MarketInfo(Symbol(),MODE_MAXLOT) 可查到该品种最大允许的持仓单量。开仓前检查一下。
 
//+------------------------------------------------------------------+
//| 返回交易品种中一个订单允许的最大交易量                                  |
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- 取得订单最大交易量限制
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- 取得一个交易品种的交易量限制
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- 取得一个交易品种已建仓位的交易量
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- 如果我们已经用完了交易量
      if(max_volume-opened_volume<=0)
         return(0);

      //--- 如果已建仓位的交易量没有超过 max_volume
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);

  }

//+------------------------------------------------------------------+
//|  返回交易品种当前挂单的交易量                                         |
//+------------------------------------------------------------------+
double   PendingsVolume(string symbol)
  {
   double volume_on_symbol=0;
   ulong ticket;
//---  获得全部交易品种当前下单数量
   int all_orders=OrdersTotal();

//--- 恢复范围内的全部订单
   for(int i=0; i<all_orders; i++)
     {
      //--- 获得列表中持仓的订单号
      if(ticket=OrderGetTicket(i))
        {
         //--- 如果订单中指定我们的交易品种,增加该订单的交易量
         if(symbol==OrderGetString(ORDER_SYMBOL))
            volume_on_symbol+=OrderGetDouble(ORDER_VOLUME_INITIAL);
        }
     }
//--- 返回指定交易品种当前已下挂单的总交易量
   return(volume_on_symbol);
  }