Ошибки, баги, вопросы - страница 3269

 
Господа, а какое ограничение на кол-во входных параметров конструктора класса mql5?
 

Недавно применил для МТ5 обновление, и код для работы в БД sqlite перестал корректно работать. 

Имеется БД и таблица, которая создается вот так:

if(!DatabaseTableExists(d.db_handle, d.t_name)){
      if(!DatabaseExecute(d.db_handle, "CREATE TABLE " + d.t_name + "("
                                       "id                   INTEGER PRIMARY KEY AUTOINCREMENT,"
                                       "datetime             TEXT,"
                                       "open                 REAL,"
                                       "high                 REAL,"
                                       "low                  REAL,"
                                       "close                REAL,"
                                       "volume               REAL   );")){
         MessageBox("Ошибка создания таблицы " + d.t_name + " в базе данных -> " + IntegerToString(GetLastError()));
         DatabaseClose(d.db_handle);
         return false;
      }
   }

Код корректно отрабатывает, таблица создается.

Далее по коду выполняется insert:

string time = TimeToString(d.bar.time, TIME_DATE|TIME_MINUTES|TIME_SECONDS);
   string query = StringFormat(
      "INSERT INTO %s (datetime, open, high, low, close) "
      "VALUES (\"%s\", %g, %g, %g, %g);", d.t_name, time, d.bar.open, d.bar.high, d.bar.low, d.bar.close);
   Print(query);
   PrintFormat("Add bar in %s -> T: \"%s\", O: %g, H: %g, L: %g, C: %g", d.t_name, time, d.bar.open, d.bar.high, d.bar.low, d.bar.close);
   if(!DatabaseExecute(d.db_handle, query)){
      Print("DB: ", DB_NAME, " insert failed with code ", GetLastError());
   }

И вывод соотв. в консоль:

Раньше этот код работал корректно, после обновления - нет. С какой именно версии, нее могу сказать. Не обновлял примерно с сентября.

 
Dmitri Custurov #:

Недавно применил для МТ5 обновление, и код для работы в БД sqlite перестал корректно работать. 

Имеется БД и таблица, которая создается вот так:

Код корректно отрабатывает, таблица создается.

Далее по коду выполняется insert:

И вывод соотв. в консоль:

Раньше этот код работал корректно, после обновления - нет. С какой именно версии, нее могу сказать. Не обновлял примерно с сентября.

Теперь для SQLite выключен режим SQLITE_DQS с запретом использования двойных кавычек для строковых значений в SQL запросах. Это давно уже рекомендуемый режим.

Используйте одиночные кавычки:

   string query = StringFormat(
      "INSERT INTO %s (datetime, open, high, low, close) "
      "VALUES ('%s', %g, %g, %g, %g);", d.t_name, time, d.bar.open, d.bar.high, d.bar.low, d.bar.close);
 
Sunriser #:
Господа, а какое ограничение на кол-во входных параметров конструктора класса mql5?

Выходит, что максимум 63 параметра, я в шоке. Мне вот реально не хватило)

class cTEST
  {
public:
                     cTEST(
      double x1,
      double x2,
      double x3,
      double x4,
      double x5,
      double x6,
      double x7,
      double x8,
      double x9,
      double x10,
      double x11,
      double x12,
      double x13,
      double x14,
      double x15,
      double x16,
      double x17,
      double x18,
      double x19,
      double x20,
      double x21,
      double x22,
      double x23,
      double x24,
      double x25,
      double x26,
      double x27,
      double x28,
      double x29,
      double x30,
      double x31,
      double x32,
      double x33,
      double x34,
      double x35,
      double x36,
      double x37,
      double x38,
      double x39,
      double x40,
      double x41,
      double x42,
      double x43,
      double x44,
      double x45,
      double x46,
      double x47,
      double x48,
      double x49,
      double x50,
      double x51,
      double x52,
      double x53,
      double x54,
      double x55,
      double x56,
      double x57,
      double x58,
      double x59,
      double x60,
      double x61,
      double x62,
      double x63,
      double x64)
     {
     }
                    ~cTEST() {} //деструктор
  };


 
//+------------------------------------------------------------------+
//|                                                        float.mq4 |
//|                        Copyright 2022, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() 
{ 
 
  float a, b, f;
        a=123456789;
        b=123456788;     
        f=a-b;  
  printf("Result: %f\n", f);    
        
}

эта ошибка во всех языках такая ??? 8 вместо 1 ?

 
ruslan #:
эта ошибка во всех языках такая ??? 8 вместо 1 ?

https://otvet.mail.ru/question/64570269

int вычисляется адекватно

Ответы Mail.ru: Вот значит такой интересный вопрос) float a= 123456789 float b= 123456788 float c=a-b чему равно выражение?)
Ответы Mail.ru: Вот значит такой интересный вопрос) float a= 123456789 float b= 123456788 float c=a-b чему равно выражение?)
  • 2011.10.04
  • otvet.mail.ru
А ларчик просто открывался.. . Всё дело в используемом типе float. Когда вы присваиваете ему значение float a = 123456789, на самом деле оно преобразуется в экспонентную форму, и записывается в виде a = 1.23456792e+008 (то есть, число от единицы до 10, и после e количество нулей у числа, на которое надо домножить это дробное значение, чтоб...
 
Sunriser #:

Выходит, что максимум 63 параметра, я в шоке. Мне вот реально не хватило)


а что мешает массив в качестве параметра передать?

хоть массив структур, в которых есть свои массивы структур.
 
Nikolai Semko #:

а что мешает массив в качестве параметра передать?

хоть массив структур, в которых есть свои массивы структур.

Все параметры в один массив не запихнуть т.к. там типы такие: double, int, bool, ENUM_TIMEFRAMES, color и т.д.

Можно конечно кое-как ухитриться, но это напрягает и ограничение в 63 параметра само по себе выглядит странно - не 64/128/256/512/1024, а 63

 
имеет ли смысл на нейросетивике поменять  double на float для ускорения расчетов , а то при смене таймфрейма тормоза достали
 
Sunriser #:

Все параметры в один массив не запихнуть т.к. там типы такие: double, int, bool, ENUM_TIMEFRAMES, color и т.д.

Можно конечно кое-как ухитриться, но это напрягает и ограничение в 63 параметра само по себе выглядит странно - не 64/128/256/512/1024, а 63

Структуры могут содержать внутри себя любые типы и массивы