общий доступ к файлам

 
int filehandle=FileOpen(TerminalInfoString(TERMINAL_COMMONDATA_PATH)+"\\Files\\filename.csv",FILE_WRITE|FILE_BIN);
вот не хочет записывать файл. Почему ? 
 
Dmitiry Ananiev:
вот не хочет записывать файл. Почему ?

Не надо так путь указывать.

int filehandle=FileOpen(signal+".bin",FILE_WRITE|FILE_BIN|FILE_COMMON);

Флаг FILE_COMMON отвечает за расположение файла и тип файла должен совпадать с указанным флагом.

 

файл сохраняется в 

C:\Program Files (x86)\MetaTrader 4 TeleTrade\MQL4\Files

а хочу чтоб сохранялся в 

C:\Users\comp\AppData\Roaming\MetaQuotes\Terminal\Common

и отсюда же считывался другим терминалом 


int filehandle=FileOpen(signal+".csv",FILE_WRITE|FILE_CSV|TERMINAL_COMMONDATA_PATH);
 
Dmitiry Ananiev:

хочу чтоб сохранялся в 

C:\Users\comp\AppData\Roaming\MetaQuotes\Terminal\Common

и отсюда же считывался другим терминалом 

Залинкуйте все терминалы на одну MQL-папку.

Такой обмен данными имеет проблему, которую затрагивали здесь.


Попробуйте это решение

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

Библиотеки: File Mapping без DLL

fxsaber, 2017.04.03 16:07

Спасибо автору за библиотеку!

Сварганил функции для передачи любых данных. Ниже скрипт показывает их работу на примере тиков

#include <MemMapLib.mqh>
#include <TypeToBytes.mqh>

// Выделяет память заданной длины под данные 
template <typename T>
bool GetFileMemory( CMemMapFile* &FileMemory, const int Amount, const string FileName = "Local\\test" )
{
  FileMemory = new CMemMapFile;
    
  return(FileMemory.Open(FileName, sizeof(T) * Amount + sizeof(int) + HEAD_MEM, modeCreate) == 0);
}

// Записывает данные в память
template <typename T>
void DataSave( CMemMapFile* FileMemory, const T &Data[], const bool FromBegin = true  )
{
  const int Size = ArraySize(Data) * sizeof(T);
  uchar Bytes[];
  
  _ArrayCopy(Bytes, _R(Size).Bytes);              // Записали количество  
  _ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // Записали данные

  if (FromBegin)
    FileMemory.Seek(0, SEEK_SET);

  FileMemory.Write(Bytes, ArraySize(Bytes)); // Сбросили все в память
  
  return;
}

// Считывает данные из памяти
template <typename T>
int DataLoad( CMemMapFile* FileMemory, T &Data[], const bool FromBegin = true )
{
  if (FromBegin)
    FileMemory.Seek(0, SEEK_SET);

  uchar Bytes[];
          
  FileMemory.Read(Bytes, sizeof(int));  // Прочли из памяти количество данных   
  FileMemory.Read(Bytes, _R(Bytes)[0]); // Получили сами данные

  _ArrayCopy(Data, Bytes);              // Сбросили данные в массив
  
  return(ArraySize(Data));
}

#define AMOUNT 1000

#define TOSTRING(A) #A + " = " + (string)(A) + " "

// Пример передачи тиков
void OnStart()
{  
  CMemMapFile* FileMemory;
  
  if (GetFileMemory<MqlTick>(FileMemory, AMOUNT))
  {
    MqlTick Ticks4Save[];    
    CopyTicks(_Symbol, Ticks4Save, COPY_TICKS_INFO, 0, AMOUNT);
    
    DataSave(FileMemory, Ticks4Save);
    
    MqlTick Ticks4Load[];    
    
    if (DataLoad(FileMemory, Ticks4Load) > 0)    
      Print(TOSTRING((_R(Ticks4Save) == Ticks4Load)) +
            TOSTRING(ArraySize(Ticks4Save)) +
            TOSTRING(ArraySize(Ticks4Load)));
     
    FileMemory.Close();   
  }
  
  delete FileMemory;
}


Результат

(_R(Ticks4Save)==Ticks4Load) = true ArraySize(Ticks4Save) = 1000 ArraySize(Ticks4Load) = 1000

Только на 1589+ не переходите.

 

а немного подробней можно ? 

Есть 2 терминала, как из одного терминала прочитать файл созданный другим терминалом ? Можно конечно положить терминал в папку MQL/Files. Но если надо чтоб 3-5 терминалов делали то же самое? 

 
Dmitiry Ananiev:

а немного подробней можно ?

На какую тему?
 
Dmitiry Ananiev:
вот не хочет записывать файл. Почему ? 

Так попробуйте:

string subfolder="folder_name\\";
int filehandle=FileOpen(subffolder+"filename.csv",FILE_WRITE|FILE_CSV|FILE_COMMON);
 
Dmitiry Ananiev:

файл сохраняется в 

C:\Program Files (x86)\MetaTrader 4 TeleTrade\MQL4\Files

а хочу чтоб сохранялся в 

C:\Users\comp\AppData\Roaming\MetaQuotes\Terminal\Common

и отсюда же считывался другим терминалом 


Дмитрий, а ткнуть в ссылку и прочесть что мешает???

FILE_COMMON

4096

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


Это именно то что тебе надо...

 

Alexey Viktorov СПАСИБА! Изначально так и сделал, но что-то не получилось ... 

 
Dmitiry Ananiev:

Alexey Viktorov СПАСИБА! Изначально так и сделал, но что-то не получилось ... 

Не получилось наверное из-за типа файла */csv с флагом FILE_BIN
 
Alexey Viktorov:
Не получилось наверное из-за типа файла */csv с флагом FILE_BIN

Расширение нужно только операционной системе, чтобы ассоциировать файл с приложением, его открывающим.

А содержимое при этом может быть любым — и текстовым в файле *.bin, и бинарным в файле *.csv или *.txt

Можно вообще назвать файл без расширения, на работу влиять не будет.

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