【问题标题】:How can I shorten this code to avoid redundancy?如何缩短此代码以避免冗余?
【发布时间】:2021-03-04 07:42:50
【问题描述】:

这是我的代码 sn-p:

string trend()
{
    double emaTrend0 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,0);
    double emaTrend1 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,1); 
    double emaTrend2 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,2); 
    double emaTrend3 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,3); 
    double emaTrend4 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,4); 
    double emaTrend5 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,5); 
    double emaTrend6 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,6); 
    double emaTrend7 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,7); 
    double emaTrend8 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,8);  
    double emaTrend9 = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,9); 
    string signal;
    
    double HighCandle0 = High[0];
    double HighCandle1 = High[1];
    double HighCandle2 = High[2];
    double HighCandle3 = High[3];
    double HighCandle4 = High[4];
    double HighCandle5 = High[5];
    double HighCandle6 = High[6];
    double HighCandle7 = High[7];
    double HighCandle8 = High[8];
    double HighCandle9 = High[9];
    
    double LowCandle0 = Low[0];
    double LowCandle1 = Low[1];
    double LowCandle2 = Low[2];
    double LowCandle3 = Low[3];
    double LowCandle4 = Low[4];
    double LowCandle5 = Low[5];
    double LowCandle6 = Low[6];
    double LowCandle7 = Low[7];
    double LowCandle8 = Low[8];
    double LowCandle9 = Low[9];
    
    if (emaTrend0 > HighCandle0 && emaTrend1 > HighCandle1 && emaTrend2 > HighCandle2 &&emaTrend3 > HighCandle3 &&
    emaTrend4 > HighCandle4 &&emaTrend5 > HighCandle5 &&emaTrend6 > HighCandle6 &&emaTrend7 > HighCandle7 &&
    emaTrend8 > HighCandle8 && emaTrend9 > HighCandle9 )  
      signal = "downtrend";
                                     
    else if (emaTrend0 < LowCandle0 && emaTrend1 < LowCandle1 && emaTrend2 < LowCandle2 &&emaTrend3 < LowCandle3 &&
    emaTrend4 < LowCandle4 &&emaTrend5 < LowCandle5 &&emaTrend6 < LowCandle6 &&emaTrend7 < LowCandle7 &&
    emaTrend8 < LowCandle8 && emaTrend9 < LowCandle9 )  
      signal = "uptrend";
    return signal;
}

我想要做的是循环变量,并且每个条件都必须是true,然后才能产生信号,例如 downtrenduptrend

下面的代码是我的尝试,但还是不行。当其中一个条件为true 时,我的尝试产生了下降趋势上升趋势 的信号,但我需要的是在产生信号之前所有内容都为true

string trend() {
    string signal = "";
    for (int i = 0; i<=9 ; i++){
        double emaTrend = iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,i);
        double highCandle = High[i];
        double lowCandle = Low[i];
        
            if (emaTrend > highCandle){
            signal = "downtrend";
            }
            else if (emaTrend < lowCandle){
            signal = "uptrend";
            }
    }
    return signal;
}

所有回复将不胜感激。谢谢!

【问题讨论】:

    标签: c++ mql4 mql5 mql


    【解决方案1】:

    这是一个可能的解决方案,通过计算下降和上升趋势的数量,然后比较这些计数(未测试):

    std::string trend() {
        const std::size_t max_count = 10;
    
        std::size_t count_downtrend = 0;
        std::size_t count_uptrend = 0;
    
        for (std::size_t i = 0; i != max_count; ++i) {
            const double emaTrend = iMA (NULL, 0, 200, 0, MODE_EMA, PRICE_CLOSE, i);
            const double highCandle = High[i];
            const double lowCandle = Low[i];
            
            if (emaTrend > highCandle) {
                ++count_downtrend;
            } else if (emaTrend < lowCandle) {
                ++count_uptrend;
            }
        }
    
        std::string signal;
        if (count_downtrend == max_count) {
            signal = "downtrend";
        } else if (count_uptrend == max_count) {
            signal = "uptrend";
        }
    
        return signal;
    }
    

    【讨论】:

      【解决方案2】:

      这与常规的“线性搜索循环”非常相似,如果趋势被打破,则会提前中断:

      enum Direction
      {
          Up, Down, None
      };
      
      Direction direction(double value, double low, double high)
      {
          return value < low ? Down : (value > high ? Up : None);
      }
      
      double emaClose(int i)
      {
          return iMA(NULL,0,200,0,MODE_EMA,PRICE_CLOSE,i);
      }
      
      string trend()
      {
          const Direction d = direction(emaClose(0), Low[0], High[0]);
          if (d == None)
          {
              return "";
          }
          for (int i = 1; i < 10 ; i++)
          {
              if (direction(emaClose(i), Low[i], High[i]) != d)
              {
                  return "";
              }
          }
          return d == Up ? "uptrend" : "downtrend";
      }
      

      【讨论】:

      • 之前没听说过线性搜索循环,谢谢!
      • @RenzCarillo 这不是一个既定术语,我只是发明它来指代常见的for (...) {if (found) return something;} return somethingelse;' 模式。
      猜你喜欢
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多