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

 

Спасибо! Я полдня поработал с отладчиком и понял, почему не использую его каждый день — это занимает слишком много времени, мне проще просто поставить Print в функцию, чтобы быстро получить информацию.

Но я начал это потому, что хотел понять, почему всем элементам массива сразу присваивается 0. Это уже число по своей природе и что может привести к неправильному результату в дальнейшем. Как бы вы поступили? ArrayInitialize(arr1,EMPTY_VALUE) это лучшее решение или что-то другое?


 
Nauris Zukas #:

Но я начал это потому, что хотел понять, почему всем элементам массива сразу присваивается 0. Это уже число по своей природе и что может привести к неправильному результату в дальнейшем. Как бы вы поступили? ArrayInitialize(arr1,EMPTY_VALUE) это лучшее решение или что-то другое?

Массивам не присваиваются значения нулей. Это вам просто повезло, скажем так случайно.

Если не инициализировать массив, то в нём зачастую оказывается мусор.

на вашем скрине, где вы указываете, что там не корректное значение вместо нуля могло оказаться любое число.

 
Здравствуйте, подскажите пожалуйста.

Сохраняю данные в файл.
void OrderExport(MqlTradeRequest &request)
  {
   static long trans = 0;
   static long keepTrans = 0;
   string file = "OrderExchange" + (request.magic > 0 ? IntegerToString(request.magic) : "") + ".csv";
   int handle = FileOpen(file, FILE_CSV | FILE_READ | FILE_SHARE_READ | FILE_WRITE | FILE_SHARE_WRITE | (Common ? FILE_COMMON : 0), ';');
   if(handle != INVALID_HANDLE)
     {
      FileSeek(handle, 0, SEEK_END);
      long tr = TimeGMT();
      trans = (tr > trans) ? tr : (trans + 1);
      FileWrite(handle,
                trans,
                request.action,
                request.magic,

Достаю данные из файла

void OrderImport(MqlTradeRequest &aReq[], int magic, string symbol)
  {
   ArrayFree(aReq);
   long tr;
   static long trans = 0;
   if(trans == 0)
      trans = TimeGMT() - 3;
   string file = "OrderExchange" + (magic > 0 ? IntegerToString(magic) : "") + ".csv";
   int handle = FileOpen(file, FILE_TXT | FILE_READ | FILE_SHARE_READ | FILE_ANSI | (Common ? FILE_COMMON : 0));
   if(handle != INVALID_HANDLE)
     {
      FileSeek(handle, 0, SEEK_SET);
      while(!FileIsEnding(handle))
        {
         string s = FileReadString(handle);
         string aS[];
         int cnt = StringSplit(s, ';', aS);
         if(cnt <= 0)
            continue;
         //---   ПРОБЛЕМНОЕ МЕСТО ОТ
          tr = StringToInteger(aS[0]);
         //---    ПРОБЛЕМНОЕ МЕСТО ДО
         if(tr <= trans)
            continue;

GetLastError() Ошибку выдаёт что -  Испорченный параметр типа string

Если выводить массив aS[0] через Print(), то шрифт отличается от остального.


Если просто выводить параметр tr , то = 0

 
Mikhail Toptunov #:
Здравствуйте, подскажите пожалуйста.

Сохраняю данные в файл.

Достаю данные из файла

GetLastError() Ошибку выдаёт что -  Испорченный параметр типа string

Если выводить массив aS[0] через Print(), то шрифт отличается от остального.


Если просто выводить параметр tr , то = 0

сам по себе файл не пробовали посмотреть ?

вы записываете бинарные значения, а читаете текстовую строку..

 
Maxim Kuznetsov #:

сам по себе файл не пробовали посмотреть ?

вы записываете бинарные значения, а читаете текстовую строку..

у импорта сделал  так

void OrderImport(MqlTradeRequest &aReq[], int magic, string symbol)
  {
   ArrayFree(aReq);
   long tr;
   static long trans = 0;
   if(trans == 0)
      trans = TimeGMT() - 1;
   string file = "OrderExchange" + (magic > 0 ? IntegerToString(magic) : "") + ".csv";
   int handle = FileOpen(file, FILE_READ | FILE_SHARE_READ | (Common ? FILE_COMMON : 0));

у экспорта так

void OrderExport(MqlTradeRequest &request)
  {
   static long trans = 0;
   static long keepTrans = 0;
   string file = "OrderExchange" + (request.magic > 0 ? IntegerToString(request.magic) : "") + ".csv";
   int handle = FileOpen(file, FILE_READ | FILE_SHARE_READ | FILE_WRITE | FILE_SHARE_WRITE | (Common ? FILE_COMMON : 0), ';');

стало лучше, но первый импорт  строки  первого параметра  (aS[0]) всегда ошибка.


далее

tr - отражает переведённую строку в int (aS[0])

Файл просматривается, всё на своём месте. 


Но импорт первого параметра aS[0]  первой строки, не переводит в int.
 
Aleksandr Slavskii #:

Если не инициализировать массив, то в нём зачастую оказывается мусор.

Спасибо, я даже вспомнил, что уже встречался с таким (тут 0 меня смутил). Жаль, что в документации это не указано, приходится такие вещи держать в голове.

 
Mikhail Toptunov #:

у импорта сделал  так

у экспорта так

стало лучше, но первый импорт  строки  первого параметра  (aS[0]) всегда ошибка.


далее

tr - отражает переведённую строку в int (aS[0])

Файл просматривается, всё на своём месте. 


Но импорт первого параметра aS[0]  первой строки, не переводит в int.

Как такое может быть? - первый aS[0] всегда битый (ошибка 5040)


 
Люди добрые, подскажите пожалуйста. У меня стоит задача прогнать оптимизацию, но для оптимизации нужно использовать внешние данные. Я сделал так: создал файл с данными и при каждом проходе открываю файл записываю в массив и закрываю. Как можно оптимизировать и ускорить этот процесс?
 
Mikhail Toptunov #:

Как такое может быть? - первый aS[0] всегда битый (ошибка 5040)


поставьте в Export и Import кодировку UTF-8 (или по крайней мере одинаковую, однобайтовую без BOM)

(посмотрите файл в бинарном виде - там наверняка первые два байта BOM, то есть он юникод) - вы когда FileSeek(0,SEEK_SET) и далее чтение, то вы их считываете в строку и конвертация фейлится

 
Maxim Kuznetsov #:
BOM

Ну похоже получилось. Правда один раз всё же не отражает , но потом при удаления файла хоть перестало глючить.


FILE_CSV | FILE_READ | FILE_SHARE_READ | FILE_ANSI | (Common ? FILE_COMMON : 0),CP_UTF8

Большое Вам СПАСИБО!