Всем доброго времени суток!
Надоело мне заниматься кодингом, решил облегчить себе жизнь используя Эксель и его возможности, но столкнулся с проблемой:
Через DDE передаются только OHLC D1. Можно ли через DDE передавать котировки каких-то других периодов и баров отличных от нулевого?
Заранее благодарен.
Полностью поддерживаю . высказал свое мнение на этой странице https://forum.mql4.com/ru/44307/page2
(Но програмистам такое просто не выгодно..... ктож тогда кучу раззнообразных скриптов для проверки идей заказывать будет.)
Там в моем посте есть 2 ссылки посмотрите может из них выйдет что путное ....
я пока пытаю советник из второй ссылки (лоудер) но прооблема в том что для того чтобы обновить связи с загруженными цсв файлами нужно их все открывать и закрывать - автоматом пока не знаю как это делать. возможно нужен макрос который сам периодически будет открывать и закрывать все файлы которые лежат в какойто определенной папке.
Что же так наезжать на программистов.
Существует простой способ загрузки данных в Excel: пишете индикатор, который может ничего не рисовать, а только собирает в массив информацию (любую, по вашему усмотрению) и, с определенной периодичностью, пишет ее в текстовый файл. Секретов здесь всего два:
после операции записи файл нужно обязательно закрыть;
массив должен иметь фиксированную размерность.
Второе условие важно, чтобы в Excel не падали формулы при обновлении данных. Ниже пример процедуры, которая записывает в текстовый файл следующую информацию:
1я строка: число строк массива
последующие строки: время и элементы массивов b0[] - b7[] (разделитель ";")
void WriteToFile() { string FileName, TimeString; FileName = "8currencyIndexClear" + Period(); int i, FileHandle, ChrtBars; ChrtBars = ChartBars; FileHandle = FileOpen(FileName, FILE_CSV | FILE_WRITE, ";"); FileWrite(FileHandle, ChrtBars); for (i = 0; i < ChrtBars; i++) { TimeString = TimeToStr( Time[i], TIME_DATE|TIME_MINUTES); FileWrite(FileHandle, TimeString, b0[i], b1[i], b2[i], b3[i], b4[i], b5[i], b6[i], b7[i]); } FileClose( FileHandle); }Выходной файл будет расположен в каталоге: ...\experts\files\
Загружаем файл в Excel на примере 2003 офиса:
Данные -> Импорт внешних данных -> Импортировать данные
В адресной строке выбираем папку \files\, ставим тип файлов: "Все файлы (*.*)", выбираем файл -> Открыть -> далее
Ставим птичку, что разделителем является ";" -> далее -> Нажимаем "Подробнее", выбираем в качестве разделителя целой и дробной части точку -> ОК -> Готово -> ОК.
Файл загружен, форматируем данные. При обновлении данных форматы будут сохраняться. Можно работать. Удобно импортируемые данные держать на отдельном листе.
Обновление информации:
Курсор должен находиться на любом из полей загруженной таблицы. Данные -> Обновить данные
Чтобы каждый раз не спрашивали имя обновляемого файла, делаем следующее:
Данные -> Импорт внешних данных -> Свойства диапазона данных. Убираем птичку "Запрашивать имя файла при обновлении" ОК
Удобно значок "Обновить данные" кинуть на панель инструментов :
Вид -> Панели инструментов -> Настройка. Выбираем закладку "Команды", в левом окне становимся на строку "Данные", в правом окне ищем строку "Обновить данные" и перетаскиваем значок на панель инструментов
Что же так наезжать на программистов.
Существует простой способ загрузки данных в Excel: пишете индикатор, который может ничего не рисовать, а только собирает в массив информацию (любую, по вашему усмотрению) и, с определенной периодичностью, пишет ее в текстовый файл. Секретов здесь всего два:
после операции записи файл нужно обязательно закрыть;
массив должен иметь фиксированную размерность.
Второе условие важно, чтобы в Excel не падали формулы при обновлении данных. Ниже пример процедуры, которая записывает в текстовый файл следующую информацию:
1я строка: число строк массива
последующие строки: время и элементы массивов b0[] - b7[] (разделитель ";")
Выходной файл будет расположен в каталоге: ...\experts\files\Загружаем файл в Excel на примере 2003 офиса:
Данные -> Импорт внешних данных -> Импортировать данные
В адресной строке выбираем папку \files\, ставим тип файлов: "Все файлы (*.*)", выбираем файл -> Открыть -> далее
Ставим птичку, что разделителем является ";" -> далее -> Нажимаем "Подробнее", выбираем в качестве разделителя целой и дробной части точку -> ОК -> Готово -> ОК.
Файл загружен, форматируем данные. При обновлении данных форматы будут сохраняться. Можно работать. Удобно импортируемые данные держать на отдельном листе.
Обновление информации:
Курсор должен находиться на любом из полей загруженной таблицы. Данные -> Обновить данные
Чтобы каждый раз не спрашивали имя обновляемого файла, делаем следующее:
Данные -> Импорт внешних данных -> Свойства диапазона данных. Убираем птичку "Запрашивать имя файла при обновлении" ОК
Удобно значок "Обновить данные" кинуть на панель инструментов :
Вид -> Панели инструментов -> Настройка. Выбираем закладку "Команды", в левом окне становимся на строку "Данные", в правом окне ищем строку "Обновить данные" и перетаскиваем значок на панель инструментов
в кодбазе есть такое - лоудер https://www.mql5.com/ru/code/8102, и действия ваши понятны, но. Если так идти то для каждого инструмента и нужного тф данные будут писатся в отдельный файл экселя ив закрытом состоянии обновлятся (на заданную глубину баров)периодически через заданный промежуток времени. А итоговый файл экселя- где делаются расчеты берет данные из ... \experts\files\, т.е. ссылается на данные ячеек которые обновляемых периодически . и в итоге чтобы обновить данные в итоговом файле нужно открыть и закрыть все записываемые файлы экселя в каталоге ... \experts\files\,а их не мало (как и инструментов в терминале). Вот и получается что нужен либо макрос который будет периодически сам как бы в фоновом режиме открывать и закрывать все имеющиеся файлы экселя в каталоге ... \experts\files\ после чего и произойдет обновление итоговового файла, либо както в том эксперте сделать так чтобы данные писались не в отдельный файл экселя для каждого инструмента, а в один файл экселя но на отдельный лист по каждому инструменту.
в кодбазе есть такое - лоудер https://www.mql5.com/ru/code/8102, и действия ваши понятны, но. Если так идти то для каждого инструмента и нужного тф данные будут писатся в отдельный файл экселя ив закрытом состоянии обновлятся (на заданную глубину баров)периодически через заданный промежуток времени. А итоговый файл экселя- где делаются расчеты берет данные из ... \experts\files\, т.е. ссылается на данные ячеек которые обновляемых периодически . и в итоге чтобы обновить данные в итоговом файле нужно открыть и закрыть все записываемые файлы экселя в каталоге ... \experts\files\,а их не мало (как и инструментов в терминале). Вот и получается что нужен либо макрос который будет периодически сам как бы в фоновом режиме открывать и закрывать все имеющиеся файлы экселя в каталоге ... \experts\files\, либо както в том эксперте сделать так чтобы данные писались не в отдельный файл экселя для каждого инструмента, а в один файл экселя но на отдельный лист по каждому инструменту.
Файлы экселя закрывать не надо. При описанном выше подходе в файле экселя нет никаких ссылок и никаких связей. Данные просто импортируются. Если вы импортируете несколько файлов, то данные для каждого обязательно следует размещать на отдельном листе. Написать макрос нет проблем:
Обновление данных для листа "С":
......
Sheets("C").Select
Selection.QueryTable.Refresh BackgroundQuery:=False
И так перечислите в одном макросе все листы. Запустили макрос и одним нажатием кнопки обновили все данные.
Если вы используете эксель для предварительных исследований, то в периодическом обновлении потребности не должно быть. Только по запросу.
Да, и файлы экселя можно хранить в любом месте
Еще раз перечитал и понял вашу проблему. Все должно храниться в одной книге, в том числе и "итоговый файл", но на разных листах. Поэтому не возникает проблем с открытием/закрытием файлов эксель и обновлением связей.
Да, и индикатор пишет в текстовый файл, а не в файл Excel. Описанной выше процедурой настраиваете импорт текстовых файлов на отдельные листы
Долго размышлял сегодня над вариантами и пришел пока к единственному:
1. либо через разделяемую память с фиксированными характеристиками буфера
2. через OLE.
Других мыслей не пришло.
Использовать промежуточные файлы конечно можно но слишком проблематично.
Файлы экселя закрывать не надо. При описанном выше подходе в файле экселя нет никаких ссылок и никаких связей. Данные просто импортируются. Если вы импортируете несколько файлов, то данные для каждого обязательно следует размещать на отдельном листе. Написать макрос нет проблем:
Обновление данных для листа "С":
......
Sheets("C").Select
Selection.QueryTable.Refresh BackgroundQuery:=False
И так перечислите в одном макросе все листы. Запустили макрос и одним нажатием кнопки обновили все данные.
Если вы используете эксель для предварительных исследований, то в периодическом обновлении потребности не должно быть. Только по запросу.
Опишу подробнее проблему. имеется вот этот советник https://www.mql5.com/ru/code/8102. он работает как скрипт который периодически скидывает данные в каталог ... \experts\files\ и они обновляются
на рабочем столе другой файл экселя с расчетами где в ячейках прописано путь что ячейка а1 равна ячейке скажем а1 из ерокад, ячейка б1 равна ячейке а1 из евродоллар и т.д.
и когда скрипт обновляет все файлы из каталога ... \experts\files\ (при этом открыт только файл итоговый с рабочего стола), то обновление нет в итоговом файле, а чтобы было обновление итоговового файла нужно каждый раз заново открывать и закрывать все файлы из каталога ... \experts\files\
ну правильно, тебе по таймеру нужно считывать эти твои файлы с данными
этот путь мне представляется не очень перспективным с точки зрения синхронизации потоков данных
ну правильно, тебе по таймеру нужно считывать эти твои файлы с данными
этот путь мне представляется не очень перспективным с точки зрения синхронизации потоков данных
да с синхронизацией тоже проблемы на минутных барах + еще дыры в истории надо обходить предварительно- прописывать предидущее значение если была дыра.
Опишу подробнее проблему. имеется вот этот советник https://www.mql5.com/ru/code/8102. он работает как скрипт который периодически скидывает данные в каталог ... \experts\files\ и они обновляются
на рабочем столе другой файл экселя с расчетами где в ячейках прописано путь что ячейка а1 равна ячейке скажем а1 из ерокад, ячейка б1 равна ячейке а1 из евродоллар и т.д.
и когда скрипт обновляет все файлы из каталога ... \experts\files\ (при этом открыт только файл итоговый с рабочего стола), то обновление нет в итоговом файле, а чтобы было обновление итоговового файла нужно каждый раз заново открывать и закрывать все файлы из каталога ... \experts\files\
Ну, так я и предлагаю: завести одну книгу Excel. Для каждой пары отвести лист, настроить загрузку данных. С синхронизацией данных не будет проблем, если написать индюк, запускаемый на одном инструменте, передать ему список инструментов. При отсутствии данных он записывает последнюю известную цену на тот момент времени. А вот если индикаторы будут на разных чартах, проблема синхронизации на минутках в период низкой активности может совсем оказаться неразрешимой.
В свое время я тоже запускался на разных чартах. Чтобы решить проблему синхронизации данных приходилось тщательно, без пропусков, формировать данные в индикаторе. И, затем, за всем этим безобразием должен следить монитор - специальный индикатор, который контролирует готовность данных от всех индюков и дающий отмашку на итоговую обработку.
Я и говорю вместо того чтобы давно уже сделать хорошие продукты в нескольких направлениях связи (мт и эксель, мт и маткад, мт и статистика или типа того)
и выварачивать рынок наизнанку, легко и просто жанглируя расчетами в уже готовых специально созданных для этого программах (маткад, эксель, статистика, матлаб) (вместо выварачивания мозгов, програмируя постоянно новые скрипты индикаторы и прочую хрень для каждой мысли отдельно и тратя месяци и годы на отладку кода) и лишь потом после того как уже нашли чтото стоящее кодить для мт и расматривать варианты для меньшей загрузки процессора.
Но ксожалению в кодбазе будет только куча однотипных бесполезных и узколобых индюков.
У меня щас файл экселя с расчетами весит уже 100 Мб и через день другой будет весить 150-200 и это только для 3-х дневной минутной истории по 11 инструментам . представьте что инструментов будет 30 и более - весить файл не один гиг будет....а переносить расчеты на mql для меня самоубийство - я состарюсь быстрей, сначала надо все устаканить, потом сократить лишние расчеты и оптимизировать, потом можно уже о коде думать.... и то mql из принципа не изучаю почитав некоторых авторитетных для меня людей .... если и переносить код то в сишарпе буду ... и лучше его попозже (когда сформирую расчеты доканца) буду учить чем MQL.
Что тут еще сказат очень и очень жаль что нет таких грамотных и полезных скриптов в свободном доступе -связывающих мт и другие проги, созданные для расчетов.....вот и приходится клянчить там да сям чтобы хоть приблеженно сделать чтото подобное.... прм крик души.... хоть отдельную ветку заводи, только толку не будет- всеравно задавят пока сам не сделаешь....
Может кто и создаст такое и если нежалко выложит (хотя что жалеть то, идеи то торговые тут не причем).
Кабы был спецом то выложил бы такое, но увы изначально пошел по другому пути....
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем доброго времени суток!
Надоело мне заниматься кодингом, решил облегчить себе жизнь используя Эксель и его возможности, но столкнулся с проблемой:
Через DDE передаются только OHLC D1. Можно ли через DDE передавать котировки каких-то других периодов и баров отличных от нулевого?
Заранее благодарен.