[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 558

 
Chiripaha:

并非如此...

我想做一个类似于菜单的东西。就像Bool变量中的假或真一样。
这样,用户就可以只点击明确定义的参数值。这样,他就不会 "错误地 "输入不必要的,因为在这种情况下,专家顾问将无法正常工作。

用户甚至是我自己。因为有可能忘记某个特定变量应该有哪些参数。

MQL4没有这种可能性(但MQL5有)。你可以在初始化时检查这个参数,如果它不对应于某个值,那么就发出错误信号。那么在开始的时候就应该进行检查。例如,我在我的EA中就是这样做的。

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_Lib"库编写代码https://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_Lib"库编写代码https://www.mql5.com/ru/code/8577

函数"PathFunctions.dll."https://www.mql5.com/ru/code/10873不适合,因为它适用于Vista,我有Windows 7

所有不必要的东西都去掉了,因为不需要阅读,只需要取目录,并在那里创建带有最初已知值的文件,这就是全部。

问题。

1.我搞不清楚我们要写到文件中的值在哪里?

2.我无法找到写错的地方?

提前感谢。

Artyom!!!哪里写着它不能在Windows 7下工作?你为什么这么不专心致志地阅读?我并不惊讶它对你不起作用。



我看了你的代码,发现你不知道如何编程。首先以帮助中的例子为例。运行它。看看它是如何工作的。然后再去做更复杂的事情。

一个文件首先被创建或打开。然后写或读。然后关闭它。你只是把函数的声明复制到了开始。你从一个通用函数中撕下了一段代码。现在它只是挂在那里。这与任何事情都没有关系。那是为了什么?这是不可能的。

 
下午好,请告诉我如何关闭策略测试器,我需要按什么?
 
angelina8:
下午好,请告诉我如何关闭策略测试器,我需要按什么?

 
你可以按Ctrl+R,或者按mt4菜单中的"-"按钮,上图中红色圈出的就是这个。
 
我必须向我的个人账户上传哪些文件?
 
angelina8:
我必须向我的个人账户上传哪些文件?

为了什么?
 
提取资金
 
angelina8:
以便提取资金


这取决于经纪公司的情况。比如说我,我有一份护照的复印件和一份调查问卷