Скачать MetaTrader 5

проблема со структурой

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmitiry Ananiev
9306
Dmitiry Ananiev  

Есть структура 

struct Pos
{
   string sym[10]
   int dir[10];
};

Pos  open[10];

// Здесь структура наполняется и сохраняется в файл с помощью 

FileWriteStruct(filehandle,open);

В другом советнике надо данные с файла считать и охранить в такую же структуру. 

пробую FileReadStruct(handle,open);

struct Pos
{
   string         sym[10]; 
   int            dir[10];
};

Pos  open[10];

 int handle =  FileOpen("Master.csv",FILE_BIN|FILE_READ|FILE_COMMON|FILE_SHARE_READ);
    FileReadStruct(handle,open);
     FileClose (handle);

Как считать структуру ? 
Можно конечно без структур,через csv файл, но хочется через структуры. 

Структуру считываем в MQL4.

fxsaber
10841
fxsaber  
// string в виде простой структуры
#define DEFINE_STRING(NAME, LENGTH)       \
struct NAME                               \
{                                         \
protected:                                \
  uchar Data[LENGTH];                     \
                                          \
public:                                   \
  void operator =( const string Str )     \
  {                                       \
    StringToCharArray(Str, this.Data);    \
  }                                       \
                                          \
  string Get( void ) const                \
  {                                       \
    return(CharArrayToString(this.Data)); \
  }                                       \
};

#define MAX_SYMBOL_LENGTH 20
DEFINE_STRING(SYMBOLNAME, MAX_SYMBOL_LENGTH)

template <typename T>
struct Pos
{
   T         sym[10]; 
   int       dir[10];
};

void OnStart()
{
  Pos<SYMBOLNAME> Save[1]; // Будем сохранять в файл
  Pos<SYMBOLNAME> Load[];  // Сюда считаем из файла
  
  Save[0].sym[0] = _Symbol;
  
  if (FileSave(__FILE__, Save) && FileLoad(__FILE__, Load))
    Print(Load[0].sym[0].Get()); // через Get() получаем string-значение
}

FileSave и FileLoad разработчики не перенесли из MQL5 в MQL4. Поэтому для MT4 используйте запись/чтение по старинке - будет работать.
Dmitry Fedoseev
47921
Dmitry Fedoseev  

Строковое поле мешает. Его надо заменить на какой-нибудь массив фиксированного размера, на uchar.

George Merts
5218
George Merts  

Боюсь, что без структур - никак, там же у тебя string.

В принципе, вон, fxsaber - вполне годный костыль предлагает.

Но, лично я бы предпочел через csv-файл или ему подобный (у меня, скажем, есть класс ini-файла, мне этот формат более приятен). 

Dmitry Fedoseev
47921
Dmitry Fedoseev  

Так наглядней:

struct Pos{
   protected:
      uchar sym[100];
   public:
      int dir[10];   
      string GetSym(int i){
         return CharArrayToString(sym,10*i,10);
      }
      void SetSym(int i,string str){
         StringToCharArray(str,sym,10*i,10);
      }
};

Вместо поля sym использовать методы GetSym() и SetSym(). Длина символа не более 10-ти знаков.

Эту структуру (и массив структур) получится сохранять в файл.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий