【问题标题】:Recursive symbol checking递归符号检查
【发布时间】:2021-12-23 11:56:04
【问题描述】:

我收到一个错误,我在修复时遇到问题,因为递归尚未“陷入”。

它应该通过类 OrderManager 对象已经放置的符号数组并检查传入的符号是否已经存在,如果不存在则应允许交易,否则将阻止它(同一货币的多个订单复合风险)

[Error] '}' - not all control paths return a value.

我相信这是因为重新测试部分没有返回值,但我对制作自己的递归函数还是很陌生。但是也可能是因为我的基础和测试用例可能是错误的?

P.S 我在一些地方添加了 (SE) cmets 来阐明语言特定的东西,因为它非常接近 C++。

P.P.S 由于编译器错误,我不知道这是否符合 MVRC。对不起大家。

bool OrderManager::Check_Risk(const string symbol, uint iter = 0) {
    if((iter + 1) != ArraySize(m_symbols) &&
       m_trade_restrict != LEVEL_LOW) // Index is one less than Size (SE if
                                      // m_trade_restrict is set to LOW, it
                                      // allows all trades so just break out)
    {
        if(OrderSelect(OrderManager::Get(m_orders[iter]),
                       SELECT_BY_TICKET)) // Check the current iterator position
                                          // order (SE OrderSelect() sets an
                                          // external variable in the terminal,
                                          // sort of like an environment var)
        {
            string t_base = SymbolInfoString(
                OrderSymbol(),
                SYMBOL_CURRENCY_BASE); // Test base (SE function pulls apart
                                       // the Symbol into two strings
                                       // representing the currency to check
                                       // against)
            string t_profit =
                SymbolInfoString(OrderSymbol(), SYMBOL_CURRENCY_PROFIT);
            string c_base =
                SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE); // Current base

            // (SE does the same as above but for the passed variable instead):
            string c_profit = SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT);

            // Uses ENUM_LEVELS from Helpers.mqh (SE ENUM of 5 levels: Strict,
            // High, Normal, Low, None in that order):
            switch(m_trade_restrict) {
            case LEVEL_STRICT: {
                if(t_base == c_base || t_profit == c_profit) {
                    return false; // Restrictions won't allow doubling
                                  // orders on any currency
                } else
                    return Check_Risk(symbol, iter++);
            };
            case LEVEL_NORMAL: {
                if(symbol == OrderSymbol()) {
                    return false; // Restrictions won't allow doubling
                                  // orders on that curr pair
                } else
                    return Check_Risk(symbol, iter++);
            };
            default: {
                // TODO: Logging Manager
                // Hardcoded constant global (SE set to LEVEL_NORMAL):
                ENB_Trade_Restrictions(default_level);
                return Check_Risk(symbol, iter);
            }
            }
        }
    } else {
        return true;
    }
}

【问题讨论】:

  • @Ted Lyngmo 感谢您更好地格式化我的代码以便在 SE 上阅读。下次我会这样做
  • 如果OrderSelect调用返回false,Check_Risk返回什么值?

标签: c++ recursion mql4


【解决方案1】:

所以,我一定是盯着代码看太久了,但问题是 ln 7 上的 if(OrderSelect(...)) 如果订单没有在终端中正确设置,则没有返回案例。我需要对此进行润色,但以下代码会删除错误。

bool OrderManager::Check_Risk(const string symbol, uint iter=0)
{
 if((iter + 1) != ArraySize(m_symbols) && m_trade_restrict != LEVEL_LOW) // Index is one less than Size
   {
   if(OrderSelect(OrderManager::Get(m_orders[iter]), SELECT_BY_TICKET)) //Check the current iterator position order
    {
      string t_base      = SymbolInfoString(OrderSymbol(), SYMBOL_CURRENCY_BASE); //Test base
      string t_profit    = SymbolInfoString(OrderSymbol(), SYMBOL_CURRENCY_PROFIT);
      string c_base      = SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE);        //Current base
      string c_profit    = SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT);

      switch(m_trade_restrict) // Uses ENUM_LEVELS from Helpers.mqh
       {
        case LEVEL_STRICT : 
          {
           if(t_base == c_base || t_profit == c_profit)
               {
                return false;
               }
           else return Check_Risk(symbol, ++iter);
          };
        case LEVEL_NORMAL :
          {
           if(symbol == OrderSymbol())
               {
                return false;
               }
           else return Check_Risk(symbol, ++iter);
          };
        default: {
                    // TODO: Logging Messages
                    ENB_Trade_Restrictions(default_level); //Hardcoded constant global
                    return Check_Risk(symbol, iter);
                 }
         }
      }
      else {return Check_Risk(symbol, ++iter);}
   }
 else {return true;}
}

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2014-06-17
    • 2013-12-28
    • 2016-12-29
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多