Ошибки, баги, вопросы - страница 2237

 
A100:
Включил MetaTrader, нашёл свой давний пример, добавил FILE_SHARE_WRITE (хотя он там и не нужен) - результат не поменялся... возможно у меня по другой причине не работало

как вариант спозиционировать файл в память (MemMap) и там работать через семафор, по окончании работы так же через семафор сбросить в файл данные

такой способ кстати даст большой выигрыш в скорости

 
Konstantin:

как вариант спозиционировать файл в память (MemMap) и там работать через семафор, по окончании работы так же через семафор сбросить в файл данные

такой способ кстати даст большой выигрыш в скорости

Дело в том что у меня был небольшой файл конфигурации и каждый эксперт должен был лишь только прочитать его один раз перед началом работы - простейшая операция - посмотрите пример по ссылкам выше... а Вы говорите - семафоры )
 
A100:
Дело в том что у меня был небольшой файл конфигурации и каждый эксперт должен был лишь только прочитать его один раз перед началом работы - простейшая операция - посмотрите пример по ссылкам выше... а Вы говорите - семафоры )

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

 
Stanislav Korotky:

Вот на это простом скрипте, запущенном сперва с writing = true, а потом на другом чарте с writing = false, получаю ошибку.


#property script_show_inputs

input bool writing = false;

int OnStart()
{
  int handle = FileOpen("xyz.foo", FILE_READ|FILE_BIN|FILE_SHARE_READ|(writing?FILE_WRITE:0));
  if(handle == INVALID_HANDLE)
  {
    Print("FileOpen failed: ", GetLastError());
    return INIT_FAILED;
  }
  
  if(writing) FileWriteInteger(handle, 0);
  
  Print("handle=", handle);
  
  while(!IsStopped())
  {
    Sleep(1000);
  }

  Print("Closing");
  FileClose(handle);

  return 0;
}

Открывающему на чтение не хватает флага FILE_SHARE_WRITE (разрешить запись), т.к. имеется пишущий.

Это ограничение системы (WinAPI).

Вот правильные флаги, при котором ваш код будет работать:

int handle = FileOpen("xyz.foo", FILE_READ|FILE_BIN|FILE_SHARE_READ|(writing?FILE_WRITE:FILE_SHARE_WRITE));
 
Ilyas:

Вот правильные флаги, при котором ваш код будет работать:

Просьба починить FileLoad

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2018.07.10 19:26

Ошибка в FileLoad. Если с флагом FILE_COMMON два локальных Агента пытаются считать данные через FileLoad, то один из Агентов обламывается.

В FileOpen можно задать соответствующие флаги, а вот в FileLoad - нет. Поэтому просьба разрешить доступ к файлу через FileLoad, если другой FileLoad его считывает.

 
TheXpert:

почему? )

Потому, что в списке флагов нет нуля

Идентификатор

Значение

Описание

FILE_READ

1

Файл открывается для чтения. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ

FILE_WRITE

2

Файл открывается для записи. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ

FILE_BIN

4

Двоичный режим чтения-записи (без преобразования из строки и в строку). Флаг используется при открытии файлов (FileOpen())

FILE_CSV

8

Файл типа csv (все записанные элементы преобразуются к строкам соответствующего типа, unicode или ansi, и разделяются разделителем). Флаг используется при открытии файлов (FileOpen())

FILE_TXT

16

Простой текстовый файл (тот же csv, однако разделитель не принимается во внимание). Флаг используется при открытии файлов (FileOpen())

FILE_ANSI

32

Строки типа ANSI (однобайтовые символы). Флаг используется при открытии файлов (FileOpen())

FILE_UNICODE

64

Строки типа UNICODE (двухбайтовые символы). Флаг используется при открытии файлов (FileOpen())

FILE_SHARE_READ

128

Совместный доступ по чтению со стороны нескольких программ. Флаг используется при открытии файлов (FileOpen()), но не заменяет при открытии файла необходимости указать FILE_WRITE и/или флаг FILE_READ

FILE_SHARE_WRITE

256

Совместный доступ по записи со стороны нескольких программ. Флаг используется при открытии файлов (FileOpen()), но не заменяет при открытии файла необходимости указать FILE_WRITE и/или флаг FILE_READ

FILE_REWRITE

512

Возможность перезаписывания файла функциями FileCopy() и FileMove(). Файл должен существовать или открываться для записи. В противном случае файл открыт не будет

FILE_COMMON

4096

Расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files. Флаг используется при открытии файлов (FileOpen()), копировании файлов (FileCopy(), FileMove()) и проверке существования файлов (FileIsExist())


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

Документация по MQL5: Константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Файл открывается для чтения. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ Файл открывается для записи. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ Файл...
 
fxsaber:

Бывает, что последний тик, полученный 16 секунд назад, не воспринимается актуальным для OrderSend. Наверное, это все таки баг.

Этот баг

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2018.07.24 09:46

Обновленный скрипт в приложении. Быстро находит, например, такие проблемы
2018.07.24 10:24:19.177 Trades  '35247942': market buy 0.01 USDHKD
2018.07.24 10:24:19.246 Trades  '35247942': failed market buy 0.01 USDHKD [No prices]
2018.07.24 10:24:19.246 Trades  '35247942': buy limit 0.01 USDHKD at 7.83618
2018.07.24 10:24:19.315 Trades  '35247942': failed buy limit 0.01 USDHKD at 7.83618 [No prices]
2018.07.24 10:24:19.316 Trades  '35247942': buy stop 0.01 USDHKD at 7.85618
2018.07.24 10:24:19.384 Trades  '35247942': failed buy stop 0.01 USDHKD at 7.85618 [No prices]

где-то за минуту можно воспроизвести с помощью данного скрипта на ForexTimeFXTM-Demo01, если перед запуском включить в Обзор рынка все символы.

 
Ilyas:

Это ограничение системы (WinAPI).

Вот правильные флаги, при котором ваш код будет работать:

да ладно )

проверяли же - винда может файл открыть а скрипт нет. проблема с флагом FILE_SHARE_READ

 
fxsaber:

Просьба починить FileLoad

Спасибо за сообщение.

Добавил флаги FILE_FLAG_SHARE_READ | FILE_FLAG_SHARE_WRITE в реализацию функций FileLoad/FileSave

Будьте внимательны, при одновременной записи и чтении одного файла необходимо правильно организовать синхронизацию, т.к. результат чтения будет неопределён.

 
Ilyas:

Спасибо за сообщение.

Добавил флаги FILE_FLAG_SHARE_READ | FILE_FLAG_SHARE_WRITE в реализацию функций FileLoad/FileSave

Будьте внимательны, при одновременной записи и чтении одного файла необходимо правильно организовать синхронизацию, т.к. результат чтения будет неопределён.

Спасибо за исправление, на грабли синхронизации это повлиять не должно.