Класс DBBE. Кто? Кто этот гений?

Dmitry Fedoseev  

Прислали индикатор на исправление. Индикатор переписан с MQL4 на MQL5. Хотелось бы узнать имя этого гения-создателя сего класса.

Он даже не входит в один пост. Делю на части

class DBBE
  {
private:
   /**
   * _LastError is used to set custom errors that could be returned by the custom GetLastError method
   * The initial value should be -1 and everything >= 0 should be valid error code
   * When setting an error code in it, it should be the MQL5 value,
   * because then in GetLastError it will be converted to MQL4 value
   */
   static int        _LastError;
public:
                     DBBE()
     {

     };

   static bool       IndicatorBuffers(int count)
     {
      // this function has no equivalent in MQL5
      return true;
     }

   static void       IndicatorShortName(string name)
     {
      ::IndicatorSetString(INDICATOR_SHORTNAME, name);
     }

   static bool       ObjectCreate(
      long chart_id, string object_name, ENUM_OBJECT object_type, int sub_window,
      datetime time1, double price1,
      datetime time2 = 0, double price2 = 0,
      datetime time3 = 0, double price3 = 0,
      datetime time4 = 0, double price4 = 0,
      datetime time5 = 0, double price5 = 0,
      datetime time6 = 0, double price6 = 0,
      datetime time7 = 0, double price7 = 0,
      datetime time8 = 0, double price8 = 0,
      datetime time9 = 0, double price9 = 0,
      datetime time10 = 0, double price10 = 0,
      datetime time11 = 0, double price11 = 0,
      datetime time12 = 0, double price12 = 0,
      datetime time13 = 0, double price13 = 0,
      datetime time14 = 0, double price14 = 0,
      datetime time15 = 0, double price15 = 0,
      datetime time16 = 0, double price16 = 0,
      datetime time17 = 0, double price17 = 0,
      datetime time18 = 0, double price18 = 0,
      datetime time19 = 0, double price19 = 0,
      datetime time20 = 0, double price20 = 0,
      datetime time21 = 0, double price21 = 0,
      datetime time22 = 0, double price22 = 0,
      datetime time23 = 0, double price23 = 0,
      datetime time24 = 0, double price24 = 0,
      datetime time25 = 0, double price25 = 0,
      datetime time26 = 0, double price26 = 0,
      datetime time27 = 0, double price27 = 0,
      datetime time28 = 0, double price28 = 0,
      datetime time29 = 0, double price29 = 0
   )
     {
      return (bool)::ObjectCreate(
                chart_id, object_name, object_type, sub_window,
                time1, price1,
                time2, price2,
                time3, price3,
                time4, price4,
                time5, price5,
                time6, price6,
                time7, price7,
                time8, price8,
                time9, price9,
                time10, price10,
                time11, price11,
                time12, price12,
                time13, price13,
                time14, price14,
                time15, price15,
                time16, price16,
                time17, price17,
                time18, price18,
                time19, price19,
                time20, price20,
                time21, price21,
                time22, price22,
                time23, price23,
                time24, price24,
                time25, price25,
                time26, price26,
                time27, price27,
                time28, price28,
                time29, price29
             );
     }

   static bool       ObjectCreate(
      string object_name, ENUM_OBJECT object_type, int sub_window,
      datetime time1, double price1,
      datetime time2 = 0, double price2 = 0,
      datetime time3 = 0, double price3 = 0
   )
     {
      return (bool)::ObjectCreate(0, object_name, object_type, sub_window, time1, price1, time2, price2, time3, price3);
     }

   static bool       ObjectDelete(long chart_id, string object_name)
     {
      return (bool)::ObjectDelete(chart_id, object_name);
     }
   static bool       ObjectDelete(string object_name)
     {
      return (bool)::ObjectDelete(0, object_name);
     }

   /**
   * This overload is not described in MQL4's documentation, but it exists in MQL4
   */
   static string     ObjectName(long chart_id, int object_index, int sub_window=-1, int object_type=-1)
     {
      return ::ObjectName(chart_id, object_index, sub_window, object_type);
     }
   /**
   * And this is the old fashion overload
   */
   static string     ObjectName(int index)
     {
      return ::ObjectName(0, index);
     }

   /**
   * Overloads to cover cases when the property is an enumeration.
   * This works for all MQL5 enum constants, such as OBJPROP_COLOR...
   */
   static int        ObjectSet(string name, ENUM_OBJECT_PROPERTY_INTEGER prop_id, long value)
     {
      return (int)::ObjectSetInteger(0, name, prop_id, 0, value);
     }
   static double     ObjectSet(string name, ENUM_OBJECT_PROPERTY_DOUBLE prop_id, double value)
     {
      return (int)::ObjectSetDouble(0, name, prop_id, 0, value);
     }
   /**
   * Overload to cover cases when the property is an integer value.
   * Also works when the property is a constant defined with #define
   */
   static double     ObjectSet(string name, int index, double value)
     {
      ENUM_OBJECT_PROPERTY_INTEGER propInteger = -1;
      ENUM_OBJECT_PROPERTY_DOUBLE propDouble   = -1;
      int propModifier = 0;
      double output    = 0.0;

      // 2) Integer type
      switch(index)
        {
         // For the first ones the constants should be defined with #define
         case 0 /* OBJPROP_TIME1 */        :
            propInteger = OBJPROP_TIME;
            propModifier = 0;
            break;
         case 2 /* OBJPROP_TIME2 */        :
            propInteger = OBJPROP_TIME;
            propModifier = 1;
            break;
         case 4 /* OBJPROP_TIME3 */        :
            propInteger = OBJPROP_TIME;
            propModifier = 2;
            break;
         case 200 /* OBJPROP_FIBOLEVELS */ :
            propInteger = OBJPROP_LEVELS;
            break;

         case 6   :
            propInteger = OBJPROP_COLOR;
            break;
         case 7   :
            propInteger = OBJPROP_STYLE;
            break;
         case 8   :
            propInteger = OBJPROP_WIDTH;
            break;
         case 9   :
            propInteger = OBJPROP_BACK;
            break;
         case 10  :
            propInteger = OBJPROP_RAY;
            break;
         case 11  :
            propInteger = OBJPROP_ELLIPSE;
            break;
         case 14  :
            propInteger = OBJPROP_ARROWCODE;
            break;
         case 15  :
            propInteger = OBJPROP_TIMEFRAMES;
            break;
         case 100 :
            propInteger = OBJPROP_FONTSIZE;
            break;
         case 101 :
            propInteger = OBJPROP_CORNER;
            break;
         case 102 :
            propInteger = OBJPROP_XDISTANCE;
            break;
         case 103 :
            propInteger = OBJPROP_YDISTANCE;
            break;
         case 201 :
            propInteger = OBJPROP_LEVELCOLOR;
            break;
         case 202 :
            propInteger = OBJPROP_LEVELSTYLE;
            break;
         case 203 :
            propInteger = OBJPROP_LEVELWIDTH;
            break;
        }

      if(propInteger > -1)
         output = (double)::ObjectSetInteger(0, name, propInteger, propModifier, (int)value);

      // 2) Double type
      switch(index)
        {
         // For the first ones the constants should be defined with #define
         case 1 /* OBJPROP_PRICE1 */ :
            propDouble = OBJPROP_PRICE;
            propModifier = 0;
            break;
         case 3 /* OBJPROP_PRICE2 */ :
            propDouble = OBJPROP_PRICE;
            propModifier = 1;
            break;
         case 5 /* OBJPROP_PRICE3 */ :
            propDouble = OBJPROP_PRICE;
            propModifier = 2;
            break;

         case 12 :
            propDouble = OBJPROP_SCALE;
            break;
         case 13 :
            propDouble = OBJPROP_ANGLE;
            break;
         case 16 :
            propDouble = OBJPROP_DEVIATION;
            break;
        }

      if(propDouble > -1)
         output = ::ObjectSetDouble(0, name, propDouble, propModifier, value);

      // 3) OBJPROP_FIRSTLEVEL+n
      if(index >= 210 && index <= 241)
        {
         propModifier = index - 210;
         output = ::ObjectSetDouble(0, name, OBJPROP_LEVELVALUE, propModifier, value);
        }

      return output;
     }

   static int        ObjectsTotal(long chart_id, int sub_window = -1, ENUM_OBJECT type = -1)
     {
      return ::ObjectsTotal(chart_id, sub_window, type);
     }
   /**
   * In the MQL4 documentation the second version of the function has only one "int" argument for "type".
   * This is misleading, because actually the type is ENUM_OBJECT.
   * It could not be "int", because interferes with the "long" argument of the main overload.
   */
   static int        ObjectsTotal(ENUM_OBJECT type = -1, int sub_window = -1)
     {
      return ::ObjectsTotal(0, sub_window, type);
     }

   /**
   * Refresh the data in the predefined variables and series arrays
   * In MQL5 this function should run on every tick or calculate
   *
   * Note that when Symbol or Timeframe is changed,
   * the global arrays (Ask, Bid...) are reset to size 0,
   * and also the static variables are reset to initial values.
   */
   static bool       RefreshRates()
     {
      static bool initialized = false;
      static double prevAsk   = 0.0;
      static double prevBid   = 0.0;
      static int prevBars     = 0;
      static MqlRates ratesArray[1];

      bool isDataUpdated = false;

      if(initialized == false)
        {
         ::ArraySetAsSeries(::Close, true);
         ::ArraySetAsSeries(::High, true);
         ::ArraySetAsSeries(::Low, true);
         ::ArraySetAsSeries(::Open, true);
         ::ArraySetAsSeries(::Volume, true);

         initialized = true;
        }

      // For Bars below, if the symbol parameter is provided through a string variable, the function returns 0 immediately when the terminal is started
      ::Bars = ::Bars(::_Symbol, PERIOD_CURRENT);
      ::Ask  = ::SymbolInfoDouble(::_Symbol, SYMBOL_ASK);
      ::Bid  = ::SymbolInfoDouble(::_Symbol, SYMBOL_BID);

      if((::Bars > 0) && (::Bars > prevBars))
        {
         // Tried to resize these arrays below on every successful single result, but turns out that this is veeeery slow
         ::ArrayResize(::Time, ::Bars);
         ::ArrayResize(::Open, ::Bars);
         ::ArrayResize(::High, ::Bars);
         ::ArrayResize(::Low, ::Bars);
         ::ArrayResize(::Close, ::Bars);
         ::ArrayResize(::Volume, ::Bars);

         // Fill the missing data
         for(int i = prevBars; i < ::Bars; i++)
           {
            int success = ::CopyRates(::_Symbol, PERIOD_CURRENT, i, 1, ratesArray);

            if(success == 1)
              {
               ::Time[i]   = ratesArray[0].time;
               ::Open[i]   = ratesArray[0].open;
               ::High[i]   = ratesArray[0].high;
               ::Low[i]    = ratesArray[0].low;
               ::Close[i]  = ratesArray[0].close;
               ::Volume[i] = ratesArray[0].tick_volume;
              }
           }
        }
      else
        {
         // Update the current bar only
         int success = ::CopyRates(::_Symbol, PERIOD_CURRENT, 0, 1, ratesArray);

         if(success == 1)
           {
            ::Time[0]   = ratesArray[0].time;
            ::Open[0]   = ratesArray[0].open;
            ::High[0]   = ratesArray[0].high;
            ::Low[0]    = ratesArray[0].low;
            ::Close[0]  = ratesArray[0].close;
            ::Volume[0] = ratesArray[0].tick_volume;
           }
        }

      if(::Bars != prevBars || ::Ask != prevAsk || ::Bid != prevBid)
        {
         isDataUpdated = true;
        }

      prevBars = ::Bars;
      prevAsk  = ::Ask;
      prevBid  = ::Bid;

      return isDataUpdated;
     }

   /**
   * In MQL4 SetIndexBuffer makes the array as series and also fills it with as many elements as many bars they are, each element equals to EMPTY_VALUE.
   *
   * In MQL5 SetIndexBuffer does not make the array as series and that's why these overloads here exists.
   * The array is not resized and even if ArrayResize is applied, it appears as if its size is still 0. But magically the array appears resized in OnCalculate
   */
   static bool       SetIndexBuffer(int index, double &buffer[], ENUM_INDEXBUFFER_TYPE data_type)
     {
      bool success = ::SetIndexBuffer(index, buffer, data_type);

      if(success)
        {
         ::ArraySetAsSeries(buffer, true);
        }

      return success;
     }
   static bool       SetIndexBuffer(int index, double &buffer[])
     {
      return DBBE::SetIndexBuffer(index, buffer, INDICATOR_DATA);
     }

   static void       SetIndexLabel(int index, string text)
     {
      ::PlotIndexSetString(index, PLOT_LABEL, text);
     }

   template<
      typename T1,typename T2
      >static string StringConcatenate(
         T1 p1,T2 p2
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2);
      return output;
     };
   template<
      typename T1,typename T2,typename T3
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12
      )
Dmitry Fedoseev  

Часть 2:

     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36);
      return output;
     };
Dmitry Fedoseev  

Часть 3:

   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49);
      return output;
     };
Dmitry Fedoseev  

Часть 4:

   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55,typename T56
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55,typename T56,typename T57
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55,typename T56,typename T57,typename T58
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57,T58 p58
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55,typename T56,typename T57,typename T58,typename T59
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57,T58 p58,
         T59 p59
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55,typename T56,typename T57,typename T58,typename T59,typename T60
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57,T58 p58,
         T59 p59,T60 p60
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,p60);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55,typename T56,typename T57,typename T58,typename T59,typename T60,
      typename T61
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57,T58 p58,
         T59 p59,T60 p60,T61 p61
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,p60,p61);
      return output;
     };
   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55,typename T56,typename T57,typename T58,typename T59,typename T60,
      typename T61,typename T62
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57,T58 p58,
         T59 p59,T60 p60,T61 p61,T62 p62
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,p60,p61,p62);
      return output;
     };
Dmitry Fedoseev  

Часть 5:

   template<
      typename T1,typename T2,typename T3,typename T4,typename T5,typename T6,typename T7,typename T8,typename T9,typename T10,
      typename T11,typename T12,typename T13,typename T14,typename T15,typename T16,typename T17,typename T18,typename T19,typename T20,
      typename T21,typename T22,typename T23,typename T24,typename T25,typename T26,typename T27,typename T28,typename T29,typename T30,
      typename T31,typename T32,typename T33,typename T34,typename T35,typename T36,typename T37,typename T38,typename T39,typename T40,
      typename T41,typename T42,typename T43,typename T44,typename T45,typename T46,typename T47,typename T48,typename T49,typename T50,
      typename T51,typename T52,typename T53,typename T54,typename T55,typename T56,typename T57,typename T58,typename T59,typename T60,
      typename T61,typename T62,typename T63
      >static string StringConcatenate(
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57,T58 p58,
         T59 p59,T60 p60,T61 p61,T62 p62,T63 p63
      )
     {
      string output = "";
      ::StringConcatenate(output,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,p60,p61,p62,p63);
      return output;
     };

   /**
   * In MQL5 when length is 0, it returns an empty string
   * In MQL4 when length is 0, it returns the whole string
   */
   static string     StringSubstr(const string string_value, int start_pos, int length = 0)
     {
      return ::StringSubstr(string_value, start_pos, ((length <= 0) ? -1 : length));
     }

   static string     TimeToStr(datetime value, int mode = TIME_DATE|TIME_MINUTES)
     {
      return ::TimeToString(value, mode);
     }

   static string     WindowExpertName()
     {
      return ::MQLInfoString(MQL_PROGRAM_NAME);
     }

   /**
   * Values in ENUM_APPLIED_PRICE are from 0 to 6 in MQL4 and from 1 to 7 in MQL5.
   * These overloads help with the situation when the applied price is privided as an integer value.
   */
   static ENUM_APPLIED_PRICE _ConvertAppliedPrice_(ENUM_APPLIED_PRICE applied_price)
     {
      return applied_price;
     }

   static ENUM_APPLIED_PRICE _ConvertAppliedPrice_(int applied_price)
     {
      return (ENUM_APPLIED_PRICE)(++applied_price);
     }

   /**
   * In MQL4 the values are the number of minutes in the period
   * In MQL5 the values are the minutes up to M30, then it's the number of seconds in the period
   * This function converts all values that exist in MQL4, but not in MQL5
   * There are no conflict values otherwise
   */
   static ENUM_TIMEFRAMES _ConvertTimeframe_(int timeframe)
     {
      switch(timeframe)
        {
         case 60    :
            return PERIOD_H1;
         case 120   :
            return PERIOD_H2;
         case 180   :
            return PERIOD_H3;
         case 240   :
            return PERIOD_H4;
         case 360   :
            return PERIOD_H6;
         case 480   :
            return PERIOD_H8;
         case 720   :
            return PERIOD_H12;
         case 1440  :
            return PERIOD_D1;
         case 10080 :
            return PERIOD_W1;
         case 43200 :
            return PERIOD_MN1;
        }

      return (ENUM_TIMEFRAMES)timeframe;
     }
   static ENUM_TIMEFRAMES _ConvertTimeframe_(ENUM_TIMEFRAMES timeframe)
     {
      return timeframe;
     }

   static double     _GetIndicatorValue_(int handle, int mode = 0, int shift = 0, bool isCustom = false)
     {
      static double buffer[1];

      double valueOnError = (isCustom) ? EMPTY_VALUE : 0.0;

      ::ResetLastError();

      if(handle < 0)
        {
         ::Print("Error: Indicator not loaded (handle=", handle, " | error code=", ::_LastError, ")");

         return valueOnError;
        }

      int barsCalculated = 0;

      for(int i = 0; i < 100; i++)
        {
         barsCalculated = ::BarsCalculated(handle);

         if(barsCalculated > 0)
            break;

         ::Sleep(50); // doesn't work when in custom indicators
        }

      int copied = ::CopyBuffer(handle, mode, shift, 1, buffer);

      // Some indicators like MA could be working fine for most candles, but not for the few oldest candles where MA cannot be calculated.
      // In this case the amount of copied idems is 0. That's why don't rely on that value and use BarsCalculated instead.
      if(barsCalculated > 0)
        {
         double value = (copied > 0) ? buffer[0] : EMPTY_VALUE;

         // In MQL4 all built-in indicators return 0.0 when they have nothing to return, for example when asked for value from non existent bar.
         // In MQL5 they return EMPTY_VALUE in this case. That's why here this fix is needed.
         if(value == EMPTY_VALUE && isCustom == false)
            value = 0.0;

         return value;
        }

      DBBE::_IndicatorProblem_(true);

      return valueOnError;
     }
     
     /**
   * _IndicatorProblem_() to get the state
   * _IndicatorProblem_(true) or _IndicatorProblem_(false) to set the state
   */
   static bool       _IndicatorProblem_(int setState = -1)
     {
      static bool memory = false;

      if(setState > -1)
         memory = setState;

      if(memory == 1)
         FXD_INDICATOR_COUNTED_MEMORY = 0; // Resets the IndicatorCount() function

      return memory;
     }

   static double     iATR(
      string symbol,
      int timeframe,
      int ma_period,
      int shift
   )
     {
      return DBBE::_GetIndicatorValue_(
                ::iATR(
                   symbol,
                   DBBE::_ConvertTimeframe_(timeframe),
                   ma_period),
                0,
                shift
             );
     }
Dmitry Fedoseev  

Часть 6:

   /**
   * Overload for the case when numeric value is used for timeframe
   */
   static int        iBarShift(const string symbol, int timeframe, datetime time, bool exact = false)
     {
      return ::iBarShift(symbol, DBBE::_ConvertTimeframe_(timeframe), time, exact);
     }

   static double     iCustom(
      string symbol, int timeframe, string name,
      int mode, int shift
   )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name),
                                       mode, shift, true);
     }
   template<
      typename T1
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22
                                                ), mode, shift, true);
     }
Dmitry Fedoseev  

Часть 7:

   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,
         int mode, int shift
      )
Dmitry Fedoseev  

Часть 8:

     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,
         int mode, int shift
      )
Dmitry Fedoseev  

Часть 9:

     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50,
      typename T51
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50,
      typename T51, typename T52
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50,
      typename T51, typename T52, typename T53
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50,
      typename T51, typename T52, typename T53, typename T54
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50,
      typename T51, typename T52, typename T53, typename T54, typename T55
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50,
      typename T51, typename T52, typename T53, typename T54, typename T55, typename T56
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50,
      typename T51, typename T52, typename T53, typename T54, typename T55, typename T56, typename T57
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57
                                                ), mode, shift, true);
     }
   template<
      typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10,
      typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20,
      typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30,
      typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40,
      typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50,
      typename T51, typename T52, typename T53, typename T54, typename T55, typename T56, typename T57, typename T58
      >static double iCustom(
         string symbol, int timeframe, string name,
         T1 p1,T2 p2,T3 p3,T4 p4,T5 p5,T6 p6,T7 p7,T8 p8,T9 p9,T10 p10,T11 p11,T12 p12,T13 p13,T14 p14,T15 p15,T16 p16,T17 p17,T18 p18,T19 p19,T20 p20,T21 p21,T22 p22,T23 p23,T24 p24,T25 p25,T26 p26,T27 p27,T28 p28,T29 p29,T30 p30,
         T31 p31,T32 p32,T33 p33,T34 p34,T35 p35,T36 p36,T37 p37,T38 p38,T39 p39,T40 p40,T41 p41,T42 p42,T43 p43,T44 p44,T45 p45,T46 p46,T47 p47,T48 p48,T49 p49,T50 p50,T51 p51,T52 p52,T53 p53,T54 p54,T55 p55,T56 p56,T57 p57,T58 p58,
         int mode, int shift
      )
     {
      return DBBE::_GetIndicatorValue_(::iCustom(symbol, DBBE::_ConvertTimeframe_(timeframe), name,
                                       p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58
                                                ), mode, shift, true);
     }

   /**
   * https://www.metatrader5.com/en/terminal/help/indicators/trend_indicators/ma
   */
   static double     iMAOnArray(
      double &array[],
      int total,
      int period,
      int ma_shift,
      int ma_method,
      int shift
   )
Dmitry Fedoseev  

Часть 10:

     {
      shift = shift + ma_shift;

      double output = 0.0;

      // In MQL4 the output is the same when the array is set as series or not.
      // That's why the calculations are done as if the array is not as series.
      // At the end the array is again set as series, if needed.
      bool isSeries = ArrayGetAsSeries(array);

      if(isSeries)
         ArraySetAsSeries(array, false);

      int size = ArraySize(array);

      // Checks and fixes
      if(total <= 0 || total > size)
         total = size;

      if(
         (period <= 0)
         || (total > 0 && total < period)
         || (total-period-shift < 0)
         || (shift < 0)
      )
        {
         // Wrong request, do nothing here, will return 0
        }
      else
        {
         // INDICATOR SPECIFIC BEGIN

         if(period == 1)
           {
            output = array[total-shift-1];
           }
         else
           {
            switch(ma_method)
              {
               case MODE_SMA :
                 {
                  double sum = 0.0;

                  for(int i = total-shift-period; i < total-shift; i++)
                    {
                     sum += array[i];
                    }

                  output = sum / period;

                  break;
                 }
               case MODE_EMA :
                 {
                  // 
                  // The major difference with the EMA is that old data points never leave the average.
                  // To clarify, old data points retain a multiplier (albeit declining to almost nothing)
                  // even if they are outside of the selected data series length.

                  // TODO: This indicator calculates all candles every time and it's extemely slow on smaller timeframes

                  double smoothing = 2.0 / (period + 1);

                  output = array[0];

                  for(int i = 1; i < total-shift; i++)
                    {
                     output = (array[i]*smoothing) + (output*(1-smoothing));
                    }

                  break;
                 }
               case MODE_SMMA :
                 {
                  // 
                  // Smoothed Moving Average takes all prices into account and uses a long lookback period.
                  // Old prices are never removed from the calculation, but they have only a minimal impact
                  // on the Moving Average due to a low assigned weight.

                  // TODO: This indicator calculates all candles every time and it's extemely slow on smaller timeframes

                  // First value is calculated as SMA
                  double sum = 0.0;

                  for(int i = 0; i < period; i++)
                    {
                     sum += array[i];
                    }

                  output = sum / period;

                  // main loop
                  for(int i = period; i < total-shift; i++)
                    {
                     output = (output*(period-1) + array[i]) / period;
                    }

                  break;
                 }
               case MODE_LWMA :
                 {
                  // 
                  // https://www.investopedia.com/terms/l/linearlyweightedmovingaverage.asp

                  double sum = 0.0;
                  double weight = 0.0;
                  double sumOfWeights = 0.0;

                  for(int i = total-shift-period; i < total-shift; i++)
                    {
                     weight++;
                     sumOfWeights += weight;
                     sum += array[i] * weight;
                    }

                  if(sumOfWeights > 0)
                     output = sum/sumOfWeights;

                  break;
                 }
              }
           }

         output = NormalizeDouble(output, 16);

         // INDICATOR SPECIFIC END
        }

      if(isSeries)
         ArraySetAsSeries(array, true);

      return output;
     }

   template<typename AP>
   static double     iRSI(
      string symbol,
      int timeframe,
      int period,
      AP applied_price,
      int shift
   )
     {
      return DBBE::_GetIndicatorValue_(
                ::iRSI(
                   symbol,
                   DBBE::_ConvertTimeframe_(timeframe),
                   period,
                   DBBE::_ConvertAppliedPrice_(applied_price)),
                0,
                shift
             );
     }

   /**
   * Overload for the case when numeric value is used for timeframe
   */
   static datetime   iTime(const string symbol, int timeframe, int shift)
     {
      return ::iTime(symbol, DBBE::_ConvertTimeframe_(timeframe), shift);
     }
  };
Dmitry Fedoseev  

В одном фале, для желающих посмотреть на это в редакторе:

Файлы:
13488.mq5  148 kb