[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 364

 
Ув. alsu, в вашем коде непонятна пременная 'n'. Если это к-во полей, то как его найти, если заранее оно не известно?
 
sibemol >>:
Ув. alsu, в вашем коде непонятна пременная 'n'. Если это к-во полей, то как его найти, если заранее оно не известно?

но ведь вы же что-то собираетесь писАть в файл? или Вы имеете в виду, что и структура CSV заранее неизвестна? Тогда какой смысл в него дописывать если не знаем ни число полей, ни их тип (строка, целое, с плавающей, время), ни смысловую нагрузку?

 
alsu >>:

но ведь вы же что-то собираетесь писАть в файл? или Вы имеете в виду, что и структура CSV заранее неизвестна? Тогда какой смысл в него дописывать если не знаем ни число полей, ни их тип (строка, целое, с плавающей, время), ни смысловую нагрузку?

Моя задача проста - запись в csv файл котировок текущего инструмента для передачи другому приложению. Всё успешно пишется при условии цикла сбора данных for(int i=Bars-1; i>=0; i--). Но если оптимизировать код, используя:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

с циклом for(int i=limit; i>=0; i--),

и вместо int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

вставить int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");

то запись нулевого бара происходит в начале файла. Если использовать FileSeek(), то строки добавляются с каждым тиком, а надо, чтобы на текущем баре переписывалась последняя строка файла.

Надеюсь, теперь всё понятно. Н всякий случай полный неоптимизированный работающий код:

//+------------------------------------------------------------------+
//|                                                  iHisoryBars.mq4 |
//|                                        Copyright © 2009, Sibemol |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Sibemol"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 White
//---- input parameters
double v1[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators 
   SetIndexStyle(0,DRAW_LINE);  
   SetIndexBuffer(0,v1);      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
  int counted_bars=IndicatorCounted(), limit;
  if (counted_bars==0)  limit=Bars-1;
  if (counted_bars>0)   limit=Bars-counted_bars-1;    
  int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ",");
  //int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");    
  FileWrite(f,
  "<ticker>,<per>,<date>,<time>,<open>,<high>,<low>,<close>,<volume>,<oi>");
  for(int i=Bars-1; i>=0; i--)
    {
    v1[i]=Close[i];    
    int _Year=TimeYear(Time[i]),
        _Month=TimeMonth(Time[i]),
        _Day=TimeDay(Time[i]),
        _Hour=TimeHour(Time[i]),
        _Minute=TimeMinute(Time[i]);
        
    string Y, M, D, H, Mi, Date, _Time;
        
    if(_Month<10) M="0"+DoubleToStr(_Month, 0); else M=DoubleToStr(_Month, 0);
    if(_Day<10) D="0"+DoubleToStr(_Day, 0); else D=DoubleToStr(_Day, 0);
    if(_Hour<10) H="0"+DoubleToStr(_Hour, 0); else H=DoubleToStr(_Hour, 0);
    if(_Minute<10) Mi="0"+DoubleToStr(_Minute, 0); else Mi=DoubleToStr(_Minute, 0);
    Date=DoubleToStr(_Year, 0)+M+D;
    _Time=H+Mi;
        
    FileWrite(f,     
    Symbol(), Period(),
    Date, _Time,     
    Open[i], High[i], Low[i], Close[i], Volume[i], 0);
    
    }
    
    FileClose(f);
    
  return(0);
  }
//+------------------------------------------------------------------+
 
sibemol >>:

Моя задача проста - запись в csv файл котировок текущего инструмента для передачи другому приложению. Всё успешно пишется при условии цикла сбора данных for(int i=Bars-1; i>=0; i--). Но если оптимизировать код, используя:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

с циклом for(int i=limit; i>=0; i--),

и вместо int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

вставить int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");

то запись нулевого бара происходит в начале файла. Если использовать FileSeek(), то строки добавляются с каждым тиком, а надо, чтобы на текущем баре переписывалась последняя строка файла.

Надеюсь, теперь всё понятно. Н всякий случай полный неоптимизированный работающий код:


а не проще запомнить текущую позицию в файле вначале.

Менять со сменой бара.

 
Sorento >>:

а не проще запомнить текущую позицию в файле вначале.

Менять со сменой бара.


Если вам не сложно, то как это будет выглядеть в коде?

 

А не подскажите, нет ли такой фичи, чтобы из текущего скрипта отключить все скрипты, которые висят на других графиках? Или еще лучше вырубить терминал вообще.

Собственно делается это с той целью, что если один из включенных скриптов "заметит" что надвигается кердык - он бы остановил работу и себя и всех остальных. Как такое можно сделать, если вышеперечисленные случаи всетаки невозможно реализовать?

 
sibemol >>:

Моя задача проста - запись в csv файл котировок текущего инструмента для передачи другому приложению. Всё успешно пишется при условии цикла сбора данных for(int i=Bars-1; i>=0; i--). Но если оптимизировать код, используя:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

с циклом for(int i=limit; i>=0; i--),

и вместо int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

вставить int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");

то запись нулевого бара происходит в начале файла. Если использовать FileSeek(), то строки добавляются с каждым тиком, а надо, чтобы на текущем баре переписывалась последняя строка файла.

Надеюсь, теперь всё понятно. Н всякий случай полный неоптимизированный работающий код:


Не понимаю в чем проблема

Вот выдержка из вашего текста, считайте поля:

FileWrite(f,     
    Symbol(), Period(),
    Date, _Time,     
    Open[i], High[i], Low[i], Close[i], Volume[i], 0);

Символ, период, дата, время, OHLCV - итого 9 полей в CSV. В приведенном мной выше листинге все они считываются как string, но это и не имеет значения, т.к. нам важно не их значение, а их количество в строке.

Подставьте вместо n 9 и пользуйтесь, подпрограмма универсальна.

В то же время, как справедливо заметил Sorento, можно просто ввести переменную, которая перед каждой записью будет запоминать позицию указателя, тогда перед следующей можно при необходимости передвинуть курсор на начало последней записи и перезаписать ее. Учтите, что при этом следует переместить открытие файла в init(), а закрытие, соответственно, в deinit(). Переменную f следует объявить на глобальном уровне.

Ну вот, вроде все максимально подробно. Считайте, что это домашнее задание:)))))))

 
Mathers >>:

А не подскажите, нет ли такой фичи, чтобы из текущего скрипта отключить все скрипты, которые висят на других графиках? Или еще лучше вырубить терминал вообще.

Собственно делается это с той целью, что если один из включенных скриптов "заметит" что надвигается кердык - он бы остановил работу и себя и всех остальных. Как такое можно сделать, если вышеперечисленные случаи всетаки невозможно реализовать?

Я бы выставлял из скрипта, "запалившего" кердык, флаг в виде глобальной переменной, который могли бы прочитать остальные скрипты и вовремя умыть руки

 

alsu писал(а) >>

Ну вот, вроде все максимально подробно. Считайте, что это домашнее задание:)))))))

Благодарю за ответ, буду пробовать, о результатах отпишусь.

 
Переделал индикатор VSI.Хотел получить обьемы в плюс и минус.Результат ошеломил.Откуда что взялось? Непонятная математика.
Файлы:
Причина обращения: