[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 558

 
Chiripaha:

Non proprio...

Volevo fare qualcosa come un menu. Proprio come nella variabile bool o false o true.
In modo che l'utente possa cliccare solo su valori chiaramente definiti del parametro. In modo che "erroneamente" non inserisca quelli non necessari, perché in questo caso, l'Expert Advisor non funzionerà correttamente.

L'utente è addirittura me stesso. Poiché è possibile dimenticare quali parametri dovrebbero esserci per una particolare variabile.

MQL4 non ha questa possibilità (ma MQL5 sì). Potete controllare questo parametro nell'inizializzazione e se non corrisponde a un certo valore, allora segnalate un errore. Allora all'inizio dell'inizio dovrebbe essere controllato. L'ho fatto nel mio EA, per esempio:

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;
   ...
}
 

Ciao a tutti. Sto cercando di scrivere una funzione che scrive un file in una directory specificata dall'utente (lavorando fuori dalla sandbox).

Ho scritto il codice usando la libreria"ZI_File_Functions_Full_Lib"https://www.mql5.com/ru/code/8577

La funzione"PathFunctions.dll."https://www.mql5.com/ru/code/10873 non è adatto perché funziona con Vista, io ho Windows 7.

Tutte le cose inutili sono state rimosse perché la lettura non è necessaria, basta prendere la directory e creare il file con il valore che è inizialmente noto, questo è tutto.

Domande:

1. Non riesco a capire dove è il valore che stiamo scrivendo nel file?

2. Non riesco a individuare dove è scritto un errore?

Grazie in anticipo.

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

#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:

Ciao a tutti. Sto cercando di scrivere una funzione che scrive un file in una directory specificata dall'utente (lavorando fuori dalla sandbox).

Ho scritto il codice usando la libreria"ZI_File_Functions_Full_Lib"https://www.mql5.com/ru/code/8577

La funzione"PathFunctions.dll."https://www.mql5.com/ru/code/10873non è adatto perché funziona con Vista, io ho Windows 7.

Tutte le cose inutili sono state rimosse perché la lettura non è necessaria, basta prendere la directory e creare il file con il valore che è inizialmente noto, questo è tutto.

Domande:

1. Non riesco a capire dove è il valore che stiamo scrivendo nel file?

2. Non riesco a individuare dove è scritto un errore?

Grazie in anticipo.

Artyom!!! Dove sta scritto che non funziona con Windows 7? Perché leggi con tanta disattenzione? Non mi sorprende che non funzioni per te.



Ho guardato il tuo codice e ho capito che non sai programmare. Prendete prima l 'esempio della guida. Esegui. Vedi come funziona. Poi passare a cose più complicate.

Un file viene prima creato o aperto. Poi scrivete o leggete. Allora chiudilo. Hai appena copiato le dichiarazioni delle funzioni nell'inizio. Avete strappato un pezzo di codice da una funzione universale. Ora è solo appeso lì. Non ha niente a che vedere con niente. A cosa serve quello? Non funzionerà.

 
Buon pomeriggio, potreste dirmi come chiudere lo strategy tester, cosa devo premere?
 
angelina8:
Buon pomeriggio, potreste dirmi come chiudere lo strategy tester, cosa devo premere?

 
Potete premere Ctrl+R, o il pulsante - nel menu di mt4, che è cerchiato in rosso nell'illustrazione qui sopra.
 
Quale documento devo caricare sul mio account personale?
 
angelina8:
Quale documento devo caricare sul mio account personale?

Per quale motivo?
 
per ritirare i fondi
 
angelina8:
per ritirare i fondi


Dipende dalla società di intermediazione. Io, per esempio, ho una copia del mio passaporto e un questionario