[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 364
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ув. alsu, в вашем коде непонятна пременная 'n'. Если это к-во полей, то как его найти, если заранее оно не известно?
но ведь вы же что-то собираетесь писАть в файл? или Вы имеете в виду, что и структура CSV заранее неизвестна? Тогда какой смысл в него дописывать если не знаем ни число полей, ни их тип (строка, целое, с плавающей, время), ни смысловую нагрузку?
но ведь вы же что-то собираетесь писАть в файл? или Вы имеете в виду, что и структура 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(), то строки добавляются с каждым тиком, а надо, чтобы на текущем баре переписывалась последняя строка файла.
Надеюсь, теперь всё понятно. Н всякий случай полный неоптимизированный работающий код:
Моя задача проста - запись в 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(), то строки добавляются с каждым тиком, а надо, чтобы на текущем баре переписывалась последняя строка файла.
Надеюсь, теперь всё понятно. Н всякий случай полный неоптимизированный работающий код:
а не проще запомнить текущую позицию в файле вначале.
Менять со сменой бара.
а не проще запомнить текущую позицию в файле вначале.
Менять со сменой бара.
Если вам не сложно, то как это будет выглядеть в коде?
А не подскажите, нет ли такой фичи, чтобы из текущего скрипта отключить все скрипты, которые висят на других графиках? Или еще лучше вырубить терминал вообще.
Собственно делается это с той целью, что если один из включенных скриптов "заметит" что надвигается кердык - он бы остановил работу и себя и всех остальных. Как такое можно сделать, если вышеперечисленные случаи всетаки невозможно реализовать?
Моя задача проста - запись в 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(), то строки добавляются с каждым тиком, а надо, чтобы на текущем баре переписывалась последняя строка файла.
Надеюсь, теперь всё понятно. Н всякий случай полный неоптимизированный работающий код:
Не понимаю в чем проблема
Вот выдержка из вашего текста, считайте поля:
Символ, период, дата, время, OHLCV - итого 9 полей в CSV. В приведенном мной выше листинге все они считываются как string, но это и не имеет значения, т.к. нам важно не их значение, а их количество в строке.
Подставьте вместо n 9 и пользуйтесь, подпрограмма универсальна.
В то же время, как справедливо заметил Sorento, можно просто ввести переменную, которая перед каждой записью будет запоминать позицию указателя, тогда перед следующей можно при необходимости передвинуть курсор на начало последней записи и перезаписать ее. Учтите, что при этом следует переместить открытие файла в init(), а закрытие, соответственно, в deinit(). Переменную f следует объявить на глобальном уровне.
Ну вот, вроде все максимально подробно. Считайте, что это домашнее задание:)))))))
А не подскажите, нет ли такой фичи, чтобы из текущего скрипта отключить все скрипты, которые висят на других графиках? Или еще лучше вырубить терминал вообще.
Собственно делается это с той целью, что если один из включенных скриптов "заметит" что надвигается кердык - он бы остановил работу и себя и всех остальных. Как такое можно сделать, если вышеперечисленные случаи всетаки невозможно реализовать?
Я бы выставлял из скрипта, "запалившего" кердык, флаг в виде глобальной переменной, который могли бы прочитать остальные скрипты и вовремя умыть руки
alsu писал(а) >>
Ну вот, вроде все максимально подробно. Считайте, что это домашнее задание:)))))))
Благодарю за ответ, буду пробовать, о результатах отпишусь.