Excel vs MT

 

Всем доброго времени суток!
Надоело мне заниматься кодингом, решил облегчить себе жизнь используя Эксель и его возможности, но столкнулся с проблемой:

Через DDE передаются только OHLC D1. Можно ли через DDE передавать котировки каких-то других периодов и баров отличных от нулевого?
Заранее благодарен.

 
Debugger:

Всем доброго времени суток!
Надоело мне заниматься кодингом, решил облегчить себе жизнь используя Эксель и его возможности, но столкнулся с проблемой:

Через 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\, ставим тип файлов: "Все файлы (*.*)", выбираем файл -> Открыть -> далее

Ставим птичку, что разделителем является ";" -> далее -> Нажимаем "Подробнее", выбираем в качестве разделителя целой и дробной части точку -> ОК -> Готово -> ОК.

Файл загружен, форматируем данные. При обновлении данных форматы будут сохраняться. Можно работать. Удобно импортируемые данные держать на отдельном листе.

Обновление информации:

Курсор должен находиться на любом из полей загруженной таблицы. Данные -> Обновить данные

Чтобы каждый раз не спрашивали имя обновляемого файла, делаем следующее:

Данные -> Импорт внешних данных -> Свойства диапазона данных. Убираем птичку "Запрашивать имя файла при обновлении" ОК

Удобно значок "Обновить данные" кинуть на панель инструментов :

Вид -> Панели инструментов -> Настройка. Выбираем закладку "Команды", в левом окне становимся на строку "Данные", в правом окне ищем строку "Обновить данные" и перетаскиваем значок на панель инструментов

 
Mislaid:

Что же так наезжать на программистов.

Существует простой способ загрузки данных в Excel: пишете индикатор, который может ничего не рисовать, а только собирает в массив информацию (любую, по вашему усмотрению) и, с определенной периодичностью, пишет ее в текстовый файл. Секретов здесь всего два:

после операции записи файл нужно обязательно закрыть;

массив должен иметь фиксированную размерность.

Второе условие важно, чтобы в Excel не падали формулы при обновлении данных. Ниже пример процедуры, которая записывает в текстовый файл следующую информацию:

1я строка: число строк массива

последующие строки: время и элементы массивов b0[] - b7[] (разделитель ";")

Выходной файл будет расположен в каталоге: ...\experts\files\

Загружаем файл в Excel на примере 2003 офиса:

Данные -> Импорт внешних данных -> Импортировать данные

В адресной строке выбираем папку \files\, ставим тип файлов: "Все файлы (*.*)", выбираем файл -> Открыть -> далее

Ставим птичку, что разделителем является ";" -> далее -> Нажимаем "Подробнее", выбираем в качестве разделителя целой и дробной части точку -> ОК -> Готово -> ОК.

Файл загружен, форматируем данные. При обновлении данных форматы будут сохраняться. Можно работать. Удобно импортируемые данные держать на отдельном листе.

Обновление информации:

Курсор должен находиться на любом из полей загруженной таблицы. Данные -> Обновить данные

Чтобы каждый раз не спрашивали имя обновляемого файла, делаем следующее:

Данные -> Импорт внешних данных -> Свойства диапазона данных. Убираем птичку "Запрашивать имя файла при обновлении" ОК

Удобно значок "Обновить данные" кинуть на панель инструментов :

Вид -> Панели инструментов -> Настройка. Выбираем закладку "Команды", в левом окне становимся на строку "Данные", в правом окне ищем строку "Обновить данные" и перетаскиваем значок на панель инструментов


в кодбазе есть такое - лоудер https://www.mql5.com/ru/code/8102, и действия ваши понятны, но. Если так идти то для каждого инструмента и нужного тф данные будут писатся в отдельный файл экселя ив закрытом состоянии обновлятся (на заданную глубину баров)периодически через заданный промежуток времени. А итоговый файл экселя- где делаются расчеты берет данные из ... \experts\files\, т.е. ссылается на данные ячеек которые обновляемых периодически . и в итоге чтобы обновить данные в итоговом файле нужно открыть и закрыть все записываемые файлы экселя в каталоге ... \experts\files\,а их не мало (как и инструментов в терминале). Вот и получается что нужен либо макрос который будет периодически сам как бы в фоновом режиме открывать и закрывать все имеющиеся файлы экселя в каталоге ... \experts\files\ после чего и произойдет обновление итоговового файла, либо както в том эксперте сделать так чтобы данные писались не в отдельный файл экселя для каждого инструмента, а в один файл экселя но на отдельный лист по каждому инструменту.
 
trol222:

в кодбазе есть такое - лоудер 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.

Других мыслей не пришло.

Использовать промежуточные файлы конечно можно но слишком проблематично.

 
Mislaid:


Файлы экселя закрывать не надо. При описанном выше подходе в файле экселя нет никаких ссылок и никаких связей. Данные просто импортируются. Если вы импортируете несколько файлов, то данные для каждого обязательно следует размещать на отдельном листе. Написать макрос нет проблем:

Обновление данных для листа "С":

......

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\

 

ну правильно, тебе по таймеру нужно считывать эти твои файлы с данными

этот путь мне представляется не очень перспективным с точки зрения синхронизации потоков данных

 
Debugger:

ну правильно, тебе по таймеру нужно считывать эти твои файлы с данными

этот путь мне представляется не очень перспективным с точки зрения синхронизации потоков данных


да с синхронизацией тоже проблемы на минутных барах + еще дыры в истории надо обходить предварительно- прописывать предидущее значение если была дыра.
 
trol222:


Опишу подробнее проблему. имеется вот этот советник 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.

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

Может кто и создаст такое и если нежалко выложит (хотя что жалеть то, идеи то торговые тут не причем).

Кабы был спецом то выложил бы такое, но увы изначально пошел по другому пути....

Причина обращения: