[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 560

 

Прошу прощения, не могу найти... подскажите пожалуйста.

КАК СДВИНУТЬ ВСЕ ЭЛЕМЕНТЫ ОДНОМЕРНОГО МАССИВА НА 1 ИНДЕКС? 

Есть какая то операция или нужно в цикл заганять? 

 
peco:

Прошу прощения, не могу найти... подскажите пожалуйста.

КАК СДВИНУТЬ ВСЕ ЭЛЕМЕНТЫ ОДНОМЕРНОГО МАССИВА НА 1 ИНДЕКС? 

Есть какая то операция или нужно в цикл заганять? 

https://docs.mql4.com/ru/array/ArrayCopy
 
Chiripaha:

Не совсем...

Я хотел сделать так, чтобы было что-то типа менюшки. Так же как в при выборе переменной bool либо false, либо true.
Чтобы пользователь мог нажать только на четко определенные значения параметра. Чтобы он "ошибочно" не вбил ненужные, т.к. в этом случае советник будет работать некорректно.

Пользователь - это даже я сам. Т.к. можно забыть какие там параметры для конкретной переменной должны быть.


Тогда так и сделайте.  Внешняя переменная типа Bool . Если == false, переменным присваиваются одни значения, если  true -- другие. Если "комплектов"  параметров больше двух -- вместо булевской используйте переменную типа int и при 1 -- первый набор, 2 -- второй и.т.д.

Это можно сделать как для каждой внешней переменной, так и для всех разом (первый режим работы советника , второй ...) 

 
 
peco:

Прошу прощения, не могу найти... подскажите пожалуйста.

КАК СДВИНУТЬ ВСЕ ЭЛЕМЕНТЫ ОДНОМЕРНОГО МАССИВА НА 1 ИНДЕКС? 

Есть какая то операция или нужно в цикл заганять? 


https://www.mql5.com/ru/forum/131859/page8#434278    
 
Chiripaha:

Не совсем...

Я хотел сделать так, чтобы было что-то типа менюшки. Так же как в при выборе переменной bool либо false, либо true.
Чтобы пользователь мог нажать только на четко определенные значения параметра. Чтобы он "ошибочно" не вбил ненужные, т.к. в этом случае советник будет работать некорректно.

Пользователь - это даже я сам. Т.к. можно забыть какие там параметры для конкретной переменной должны быть.

В MQL4 такой возможности нет (а вот в MQL5 есть). Можно в инициализации сделать проверку данного параметра и если он не соответствует определённому значению, то сигнализировать ошибку. Затем в самом начаде старта делать проверку. Я так сделал в своём советнике, напр.:

extern int  val=5;
       bool val_error=false;
// -----
init()
{  ...
   if (val!=5  || val!=10 || val!=20 || val!=40 ||
       val!=60 || // и т.д.)
      {   val_error=true;
          Alert("Неправильный val!");
      }
   ...
}
// -----
start()
{  if (val_error=true) return;
   ...
}
 

Всем привет. Пытаюсь написать функцию, которая записывает файл в каталог указан пользователем (работаем вне песочницы).

Написал код с помощью библиотеки "ZI_File_Functions_Full_Libhttps://www.mql5.com/ru/code/8577

Функция " PathFunctions.dll.https://www.mql5.com/ru/code/10873 не подходит т.к. работает с Vista, у меня Windows 7.

Все лишнее удалил т.к. чтение не нужно, просто берем каталог и там создаем файл со значением, которое изначально известно, всё.

Вопросы:

1. Не могу разобраться где указывается значение которое мы пишем в файл?

2. Не могу понять где ошибка?

Заранее спасибо.

 

//===============================================================================================================================================================
//     Импортируемые функции.
//===============================================================================================================================================================

#import "ntdll.dll"
int RtlGetLastWin32Error();
int RtlSetLastWin32Error (int dwErrCode);
#import
#include <WinKernel32.mqh>                                      // Заголовочный файл библиотеки "kernel32.dll" функций API Windows XP.

//===============================================================================================================================================================
// Объявленные константы.
//===============================================================================================================================================================

#define FILE_FULL_CREATE    0                                   // Создать или переписать файл.

//===============================================================================================================================================================
//    Функция открывает или создаёт файл.
//    Функция открывает/создает файл для ввода и/или вывода. Если при открытии для записи файла нет, то он будет создан. Для создания директории
//    используется функция "CreateDirectory()". Функция возвращает: handle - файловый описатель, если функция выполнилась без ошибки;
//                                                               -1     - возникла системная ошибка;
//                                                               -2     - ошибка при перемещении файлового указателя в конец файла;
//                                                               -3     - указан недопустимый способ открытия файла.
//===============================================================================================================================================================
int start(){
   int FileOpenFull (string PathName="D:\files\DATA.csv",      // Имя файла с абсолютным путём.
                     int    ModeCWR=0)                         // Способ открытия файла: 0 - FILE_FULL_CREATE    Открытие файла для записи. Если файл существует, то содержимое файла будет
                                                               //                                                уничтожено. Если файл с таким именем не существует, то будет создан новый.
    {
     int Error;                                                // Номер последней ошибки.
     int Handle;                                               // Файловый описатель.
//===============================================================================================================================================================
  RtlSetLastWin32Error(0);                                                                                              // Обнуляем ошибку.
  if (ModeCWR != FILE_FULL_READ)                                                                                        // Если функция вызвана не для чтения, проверяем на наличие файла.
   {                                                                                                                    // Проверяем на наличие файла. Читаем файл.
    Handle = CreateFileA (PathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (RtlGetLastWin32Error() == 2 && Handle == -1) ModeCWR = FILE_FULL_CREATE;                                        // Файла нет. Создаём файл.
    else
     {
      if (!CloseHandle (Handle))
       {
        Error = RtlGetLastWin32Error();
        Print ("Ошибка в функции \"FileOpenFull()\". Файл с путём \"", PathName, "\" не закрыт при проверки на наличие. Последняя ошибка: \"", Error, "\". ", StringError (Error));
        return (-1);
       }
     }
    RtlSetLastWin32Error(0);                                                                                            // Обнуляем ошибку.
   }
   
//===============================================================================================================================================================
//     Переключатель по способам открытия файла.
//===============================================================================================================================================================
  
  switch (ModeCWR)
   {                                                                                                                    // Создаём файл.
    case FILE_FULL_CREATE:
     {
      Handle = CreateFileA (PathName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
      if (Handle == -1)
       {
        Error = RtlGetLastWin32Error();
        Print ("Ошибка в функции \"FileOpenFull()\". Файл с путём \"", PathName, "\" не открыт. Последняя ошибка: \"", Error, "\". ", StringError (Error));
       }
      return (Handle);
     }
    
//===============================================================================================================================================================
//     Функция закрытия файла.
//     Функция закрывает ранее открытый файл. Если файл закрыт успешно, функция возвращает TRUE, иначе возвращает FALSE.
//===============================================================================================================================================================

   bool FileCloseFull (int Handle)                                                                                   // Файловый описатель, возвращаемый функцией "FileOpenFull()".
    {
     int Error;                                                                                                      // Номер последней ошибки.
     //----
     RtlSetLastWin32Error (0);
     if (!CloseHandle (Handle))
      {
       Error = RtlGetLastWin32Error();
       Print ("Ошибка в функции \"FileCloseFull()\". Последняя ошибка: \"", Error, "\". ", StringError (Error));
       return (false);
      }
     else return (true);
    }

//===============================================================================================================================================================
//    Функция возвращает код системной ошибки.
//===============================================================================================================================================================

   int SystemError()
    {
     return (RtlGetLastWin32Error());
    }
 
//===============================================================================================================================================================
//    Функция возвращает строковое описание кода системной ошибки.
//===============================================================================================================================================================

   string StringError (int ErrorCode)                                                     // Код системной ошибки.
    {
     int    i;
     string String = "";
     //----
     int    Buffer[128];
     //----
     ArrayInitialize (Buffer, 0);
     FormatMessageA (0x1000, 0, ErrorCode, 0, Buffer, ArraySize (Buffer), 0);
     //----
     for (i = 0; i < ArraySize (Buffer); i++)
      {
       String = String + CharToStr (Buffer[i]       & 0xFF)
                       + CharToStr (Buffer[i] >>  8 & 0xFF)
                       + CharToStr (Buffer[i] >> 16 & 0xFF)
                       + CharToStr (Buffer[i] >> 24 & 0xFF);
      }
     return (StringTrimRight (String));
    }
//===============================================================================================================================================================
//    Конец
//===============================================================================================================================================================
}
 
merkulov.artem:

Всем привет. Пытаюсь написать функцию, которая записывает файл в каталог указан пользователем (работаем вне песочницы).

Написал код с помощью библиотеки "ZI_File_Functions_Full_Libhttps://www.mql5.com/ru/code/8577

Функция " PathFunctions.dll.https://www.mql5.com/ru/code/10873 не подходит т.к. работает с Vista, у меня Windows 7.

Все лишнее удалил т.к. чтение не нужно, просто берем каталог и там создаем файл со значением, которое изначально известно, всё.

Вопросы:

1. Не могу разобраться где указывается значение которое мы пишем в файл?

2. Не могу понять где ошибка?

Заранее спасибо.

Артём!!! Где написано что с Windows 7 не работает? Почему так невнимательно читаете? Не удивляюсь, что у Вас ничего не выходит.



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

Файл сначала создают или открывают. Потом пишут или читают. Потом закрывают. Вы просто скопировали объявления функций в старт. Вырвали кусок кода из универсальной функции. Теперь он просто висит. Ни к чему не относится. Зачем это? Это работать не будет.

 
Добрый день! Подскажите, пожалуйста, как закрыть тестер стратегий, что нужно нажать?
 
angelina8:
Добрый день! Подскажите, пожалуйста, как закрыть тестер стратегий, что нужно нажать?

Причина обращения: