Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1432

 
Всем привет!!!    Подскажите пожалуйста как мне допустим из массива копирнуть значения в базу данных?   вот код из примера работы с БД и при попытке вставить данные из массива в БД в поле SALARY  получается ошибка при запуске скрипта.     И ещё вопрос, а если например у меня есть массив с данными ордеров и их достаточно много, как мне например весь этот массив переместить в таблицу в БД?
 VALUES (1,'Paul',a,'California',29000.00)  -->  VALUES (1,'Paul',a,'California',Mass[0])

void OnStart()
  {
  double Mass[4]={1,2,5,6};
  int a =222;
  Alert(Mass[3]);
   string filename="company.sqlite";
//--- создадим или откроем базу данных в общей папке терминалов
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " open failed with code ", GetLastError());
      return;
     }
//--- если таблица COMPANY существует, то удалим её
   if(DatabaseTableExists(db, "COMPANY_2"))
     {
      //--- удаляем таблицу
      if(!DatabaseExecute(db, "DROP TABLE COMPANY_2"))
        {
         Print("Failed to drop table COMPANY with code ", GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- создаем таблицу COMPANY
   if(!DatabaseExecute(db, "CREATE TABLE COMPANY_2("
                       "ID INT PRIMARY KEY     NOT NULL,"
                       "NAME           TEXT    NOT NULL,"
                       "AGE            INT     NOT NULL,"
                       "ADDRESS        CHAR(50),"
                       "SALARY         REAL );"))
     {
      Print("DB: ", filename, " create table failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }

//--- вставляем данные в таблицу
   if(!DatabaseExecute(db, "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1,'Paul',a,'California',Mass[0]); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2,'Allen',25,'Texas',Mass[1]); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3,'Teddy',a,'Norway',Mass[2]);"
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4,'Mark',25,'Rich-Mond',65000.00);"))
     {
      Print("DB: ", filename, " insert failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }

//--- создадим запрос и получим хендл на него
   int request=DatabasePrepare(db, "SELECT * FROM COMPANY_2");
   if(request==INVALID_HANDLE)
     {
      Print("DB: ", filename, " request failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }

   DatabasePrint(
      db,          // хендл базы данных, полученный в DatabaseOpen
      "COMPANY_2",      // таблица или SQL-запрос
      0              // комбинация флагов
   );
  }
//+------------------------------------------------------------------+


 

Попробуйте сделать, например, так.

Вместо 

if(!DatabaseExecute(db, "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1,'Paul',a,'California',Mass[0]); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2,'Allen',25,'Texas',Mass[1]); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3,'Teddy',a,'Norway',Mass[2]);"
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4,'Mark',25,'Rich-Mond',65000.00);"))

написать

if(!DatabaseExecute(db, "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1,'Paul',a,'California'," + DoubleToString(Mass[0]) + "); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2,'Allen',25,'Texas'," + DoubleToString(Mass[1]) + "); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3,'Teddy',a,'Norway'," + DoubleToString(Mass[2]) + ");"
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4,'Mark',25,'Rich-Mond',65000.00);"))

Это не единственный способ.

 
Yuriy Bykov #:

Попробуйте сделать, например, так.

Вместо 

написать

Это не единственный способ.

Спасибо!  работает.  А где можно прочитать про это? И другие способы?

 
lego9955 #:

 Добрый день! Прошу помочь переделать скрипт, который просто создает кастомный символ.

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

К примеру три AB AC AD, в будущем любое количество по этому принципу.  

Зациклить с подстановкой каждый раз следующего имени символа из списка.

Что-то типа:

string sNames = "AB,AC,AD";
string aNames[];

void OnStart()

  {
   int i;
   bool ch=true;

   if(StringSplit(sNames,StringGetCharacter(",",0),aNames) <= 0)return;

   ResetLastError();
   for(i=0; i<ArraySize(aNames); i++)
      {
       ch=ch && CustomSymbolCreate(aNames[i]);
       if(!ch)
         {
          PrintFormat("Symbol '%s' : error %d",aNames[i],GetLastError());
          break; // При первой ошибке выходим
         }
      }
   if(!ch)return;
   ...
  } 
 

Перед этим сделал так, посчитал что справился и удалил свой пост. 

void OnStart()
{
string arr[]= { "AB", "AC", "AD" };

  for(int i=0; i<ArraySize(arr); i++)

  {
   bool ch =CustomSymbolCreate(arr[i]);
   SymbolSelect(arr[i],true); 
  }  
}

Когда обновил страницу увидел что ответили. Да, с обработкой ошибок правильнее. Спасибо!

 
lego9955 #:

Перед этим сделал так, посчитал что справился и удалил свой пост. 

Когда обновил страницу увидел что ответили. Да, с обработкой ошибок правильнее. Спасибо!

ArraySize(arr)

правильней будет в ushort за пределами цикла определить

 
lynxntech #:

правильней будет в uint за пределами цикла определить

Часто так делаю, но всё же очень хочется верить, что такие стандартные вещи компилятор умеет оптимизировать.

 

У робота есть два фильтра: Stochastic и RSI, у каждого набор параметров. Использоваться должен только один фильтр. Т.е. если включен Stochastic, то RSI должен быть выключен и наоборот.

Сейчас сделал так:

  • Сделал input переменные для Stochastic и RSI, включающую и выключающую их работы.
  • В блоке OnInit проверяю, если Stochastic и RSI одновременно включены, то ошибка INIT_PARAMETERS_INCORRECT.
  • В блоке OnInit проверяю, если Stochastic выключен, то все его параметры должны быть равны нулю, иначе ошибка INIT_PARAMETERS_INCORRECT/ Аналогично с RSI.

Цель:

  • Не тратить время при оптимизации на несовместимые варианты. Например, чтобы в случае, если выбран RSI, чтобы не перебирались параметры Stochastic (размер зон перекупленности/перепроданности, периоды K, D, замедление, метод сглаживание, цены).
  • Оказалось, что мой вариант не работает. При оптимизации эти варианты похоже все равно перебираются, что отражается на конечном результате оптимизации.

Посоветуйте, как сделать, чтобы оптимизатор при включенном RSI не перебирал параметры Stochastic и наоборот.

 
lego9955 #:

Перед этим сделал так, посчитал что справился и удалил свой пост. 

Когда обновил страницу увидел что ответили. Да, с обработкой ошибок правильнее. Спасибо!

На всякий случай обращу внимание, что при большом количестве имён проще их писать одной строкой, как у меня показано, чем массив отдельных строк.

 
Alexey Petrov #:

Здравствуйте,

Попробуйте поискать готовые решения на рынке - https://www.mql5.com/fr/search#!keyword=money%20management&module=mql5_module_market

Вы также можете заказать индивидуальное решение у Freelance - https://www.mql5.com/fr/job.

Здравствуйте и спасибо за ваш ответ. Я смог создать скрипт, который соответствует моим ожиданиям, но, к сожалению, есть две ошибки, которые я не могу понять или исправить. Не могли бы вы знать, к кому обратиться за небольшой помощью? Это всего лишь две строки кода, которые регистрируются как ошибки после компиляции...
Причина обращения: