Максимальная длина строки.

 

Есть класс который собирает данные котировок со всех таймфреймов и записывает в формате JSON в виде строки, но при достижении какой-то длинны строки данные из переменной пропадают, и там оказывается пусто:

class RatesProvider
  {

   string            _rates_butch_formatter;

   string            _rates_formatter;

public:
                     RatesProvider()
     {
      _rates_formatter = "{ \"open\": %G, \"high\": %G, \"low\": %G, \"close\": %G, \"tickVolume\": %d, \"time\": %d, \"spread\": %d, \"realVolume\": %d }";
      _rates_butch_formatter = "{ \"M_1\": %s, \"M_2\": %s, \"M_3\": %s, \"M_4\": %s, \"M_5\": %s, \"M_6\": %s, \"M_10\": %s, \"M_12\": %s, \"M_15\": %s, \"M_20\": %s, \"M_30\": %s, \"H_1\": %s, \"H_2\": %s, \"H_3\": %s, \"H_4\": %s, \"H_6\": %s, \"H_8\": %s, \"H_12\": %s, \"D_1\": %s, \"W_1\": %s, \"MN_1\": %s }";
     }
                    ~RatesProvider() {}


public:
   string            GetRates(string symbol, int to_copy)
     {
      string m1 = CopyMqlRates(symbol, PERIOD_M1, to_copy);
      string m2 = CopyMqlRates(symbol, PERIOD_M2, to_copy);
      string m3 = CopyMqlRates(symbol, PERIOD_M3, to_copy);
      string m4 = CopyMqlRates(symbol, PERIOD_M4, to_copy);
      string m5 = CopyMqlRates(symbol, PERIOD_M5, to_copy);
      string m6 = CopyMqlRates(symbol, PERIOD_M6, to_copy);
      string m10 = CopyMqlRates(symbol, PERIOD_M10, to_copy);
      string m12 = CopyMqlRates(symbol, PERIOD_M12, to_copy);
      string m15 = CopyMqlRates(symbol, PERIOD_M15, to_copy);
      string m20 = CopyMqlRates(symbol, PERIOD_M20, to_copy);
      string m30 = CopyMqlRates(symbol, PERIOD_M30, to_copy);
      string h1 = CopyMqlRates(symbol, PERIOD_H1, to_copy);
      string h2 = CopyMqlRates(symbol, PERIOD_H2, to_copy);
      string h3 = CopyMqlRates(symbol, PERIOD_H3, to_copy);
      string h4 = CopyMqlRates(symbol, PERIOD_H4, to_copy);
      string h6 = CopyMqlRates(symbol, PERIOD_H6, to_copy);
      string h8 = CopyMqlRates(symbol, PERIOD_H8, to_copy);
      string h12 = CopyMqlRates(symbol, PERIOD_H12, to_copy);
      string d1 = CopyMqlRates(symbol, PERIOD_D1, to_copy);
      string w1 = CopyMqlRates(symbol, PERIOD_W1, to_copy);
      string mn1 = CopyMqlRates(symbol, PERIOD_MN1, to_copy);
      return StringFormat(_rates_butch_formatter, m1, m2, m3, m4, m5, m6, m10, m12, m15, m20, m30, h1, h2, h3, h4, h6, h8, h12, d1, w1, mn1);
     }

private:
   string            CopyMqlRates(string symbol, ENUM_TIMEFRAMES  timeframe, int to_copy)
     {
      string items = "";
      MqlRates rates[];
      ArraySetAsSeries(rates, true);
      int copied = CopyRates(symbol, timeframe, 0, to_copy, rates);
      if(copied == to_copy)
        {
         for(int i = 0; i < copied; i++)
           {
            string item = StringFormat(_rates_formatter, rates[i].open, rates[i].high, rates[i].low,
                                       rates[i].close, rates[i].tick_volume, rates[i].time,
                                       rates[i].spread, rates[i].real_volume);
                                       
            items += item;
            if(i != copied - 1)
               items += ", ";
           }
        }
      else
         Print("Failed to get history data for the symbol ", symbol);

      return StringFormat("[%s]", items);
     }
  };

В методе GetRates переменные m1, m2 и так далее заполняются верно, только когда количество баров для копирования не большое.


return StringFormat(_rates_butch_formatter, m1, m2, m3, m4, m5, m6, m10, m12, m15, m20, m30, h1, h2, h3, h4, h6, h8, h12, d1, w1, mn1);

Не возвращается ничего, я пробовал результат StringFormat присвоить переменной но так же никакого значения не получил.

Единственный вариант при котором функционал GetRates работает, это если указать to_copy = 1, тогда видимо данные не влезают за рамки ограничений.


Почему такое происходит, и как мне получить свою строку, пусть даже мне понадобится скопировать по 100 баров с каждого таймфрейма?

 
uchar result[];//сюда складываем все строки в виде массива char

string s = CharArrayToString(result); //получаем строку из массива. 

Насколько я сталкивался, то как раз идет отправка массива uchar и на стороне сервера тоже ожидается массив. 

int res=WebRequest("POST","https://адрес","",0,data,gdata,gheader);

где data - и есть отсылаемый массив данных.

НА Питоне так же на входе сервера ожидается массив uchar 

 
Сначала надо Bars() вызвать для каждого таймфрейма, чтобы произошло построение таймфремов, проверить результат, возвращаемый Bars(), только потом копировать данные.
 
Dmitry Fedoseev:
Сначала надо Bars() вызвать для каждого таймфрейма, чтобы произошло построение таймфремов, проверить результат, возвращаемый Bars(), только потом копировать данные.

Спасибо за замечание про Bars(). А что происходит со строками не знаете? Может в документации где-то есть информация по ограничениям я ее что-то не нашел.

 
Павел Раввич:

Спасибо за замечание про Bars(). А что происходит со строками не знаете? Может в документации где-то есть информация по ограничениям я ее что-то не нашел.

замените _rates_butch_formatter  на простую конкатенацию строк, ограничение скорее всего у stringformat.

кстати batch наверное? butch это слегка ругательство.

 
TheXpert:

замените _rates_butch_formatter  на простую конкатенацию строк, ограничение скорее всего у stringformat.

кстати batch наверное? butch это слегка ругательство.

Да я имел в виду batch, спасибо.