експорт в файл

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
a.pikhotskiy
41
a.pikhotskiy  
int  TickCounter = 0;
datetime tmp_date_buff[]; // массив дат индикатора
extern datetime dateEnd = D'2019.03.08 00:00'; 


int OnInit()
  {
    ArrayResize(tmp_date_buff,30);
    return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
  datetime date_buff[]; // массив дат индикатора  

    ArrayResize(date_buff, TickCounter);
    for (int i = 0; i < ArraySize(date_buff); i++)
    {
       date_buff[i] = tmp_date_buff[i];
    } 
    

  string  InpFileName="MACD1.csv";    
  string  InpDirectoryName="Data";     
 
  ResetLastError();
 
  int file_handle = FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
   
  if(file_handle!=INVALID_HANDLE)
  {
       
    FileWrite(file_handle, IntegerToString( ArraySize(date_buff))); //  - здесь проблема , в файл записивается не реальное значение ArraySize(date_buff , а "0". Помогите пожалуйста 
   
  }
}  


void OnTick()
{
  if (TimeCurrent() <= dateEnd)
  {
    tmp_date_buff[TickCounter] = TimeCurrent();
    TickCounter++;
  }
}



BlackTomcat
298
BlackTomcat  
a.pikhotskiy:

Ну вообще-то перед записью в файл в целях отладки и самопроверки неплохо бывает сделать Print в журнал того, что вы вообще пытаетесь сохранить. Убедитесь сперва таким образом, что у вас там не 0.

Сергей Таболин
2839
Сергей Таболин  
Експорт и Ымпорт.... Нда уж...
a.pikhotskiy
41
a.pikhotskiy  
BlackTomcat:

Ну вообще-то перед записью в файл в целях отладки и самопроверки неплохо бывает сделать Print в журнал того, что вы вообще пытаетесь сохранить. Убедитесь сперва таким образом, что у вас там не 0.

ситуация в том, что Print показывает правильный результат, но ,  при передачи в функцию FileWrite значение переменной почемому-то становиться таким, как было при инициализации (все последующие расчеты не сохраняются).
Сергей Таболин
2839
Сергей Таболин  
a.pikhotskiy:

1. Я так понимаю, что код OnDeinit не полный? Иначе совершенно не понятно на кой леший нужно копировать один массив в другой... К тому же это проще.

2. У Вас нет проверки на размер массива. Возможно, он вообще имеет 0-й размер? Не заполнился. Уже говорили - для начала распринтуйте все значения и смотрите откуда ноги растут (скорее всего именно оттуда, откуда и положено).

3. Вот это для записи строк.

И не нужно стесняться заглядывать в документацию

a.pikhotskiy
41
a.pikhotskiy  
Сергей Таболин:

1. Я так понимаю, что код OnDeinit не полный? Иначе совершенно не понятно на кой леший нужно копировать один массив в другой... К тому же это проще.

2. У Вас нет проверки на размер массива. Возможно, он вообще имеет 0-й размер? Не заполнился. Уже говорили - для начала распринтуйте все значения и смотрите откуда ноги растут (скорее всего именно оттуда, откуда и положено).

3. Вот это для записи строк.

И не нужно стесняться заглядывать в документацию

Спасибо, я распрентировал. Нет, размер массива не равен 0. 

Передача данных происходит с функции  OnTick() в OnDeinit . Возможно в ошибка здесь ?

Массив данных создается в OnTick() , а используется в OnDeinit () .

Сергей Таболин
2839
Сергей Таболин  
a.pikhotskiy:

Спасибо, я распрентировал. Нет, размер массива не равен 0. 

Передача данных происходит с функции  OnTick() в OnDeinit . Возможно в ошибка здесь ?

Массив данных создается в OnTick() , а используется в OnDeinit () .

Ваш массив datetime tmp_date_buff[]; // массив дат индикатора объявлен на глобальном уровне. Он одинаково виден во всех функциях (поэтому и спрашивал зачем Вы его ещё и дублируете?). Возможно, где то в коде происходит деинициализация или удаление этого массива. Ищите.

Alexey Viktorov
27890
Alexey Viktorov  
a.pikhotskiy:

После записи, файл необходимо закрыть

void  FileClose( 
   int  file_handle      // handle файла 
   );
Пока файл не закрыт или не записан на диск принудительно содержимое прочесть не получится. И вся проблема.
a.pikhotskiy
41
a.pikhotskiy  
Alexey Viktorov:

После записи, файл необходимо закрыть

Пока файл не закрыт или не записан на диск принудительно содержимое прочесть не получится. И вся проблема.
Спасибо, но , к сожалению, не помогло. Я вставил FileClose()
a.pikhotskiy
41
a.pikhotskiy  
Сергей Таболин:

Ваш массив datetime tmp_date_buff[]; // массив дат индикатора объявлен на глобальном уровне. Он одинаково виден во всех функциях (поэтому и спрашивал зачем Вы его ещё и дублируете?). Возможно, где то в коде происходит деинициализация или удаление этого массива. Ищите.

Спасибо, деинициализации или удаления - нет.  Мне кажется, что проблема в том, что массив данных создается в OnTick() , а используется в OnDeinit () .

Alexey Viktorov
27890
Alexey Viktorov  
a.pikhotskiy:
Спасибо, но , к сожалению, не помогло. Я вставил  FileClose()

Пробуйте ещё и ещё. Должно помочь. Я проверил. И исправьте эту строку

int file_handle = FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);

так

int file_handle = FileOpen(InpDirectoryName+"\\"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);

Ещё можно добавить

int file_handle = FileOpen(InpDirectoryName+"\\"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV|FILE_COMMON);

тогда после закрытия тестера файл не потеряется.

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