MetaTrader4-DDE-Excel 2007 Сохранение Котировок на Листе
All, Excel, Трейдерам 04.12.2008Метки: dde, metatrader4, vba, макросы
В комментариях к статье про передачу данных из MeteTrader4 в Excel, появился вопросик – Как можно сохранить данные поступающие через DDE?
Решение следующее:
Создаем новый лист в Excel.
В любую ячейку записываем запрос к MetaTreder =MT4|QUOTE!GBPUSD и присваиваем имя этой ячейке как GBPUSD_QUOTE. В данную ячейку будем получать данные из MT4.
Дальше определяем столбец куда надо сохранять данные и первой верхней ячейке этого столбца присваиваем имя. QUOTE_COLLECT.
Сохраняем файл как Excel Macro Enabled Workbook (.xlsm).
Запускаем MetaTrader и получаем приблизительно такой вид …
Теперь надо написать небольшую программку на VBA.
Алгоритм программы следующий – через определенный промежуток времени, считываются данные из ячейки с именем GBPUSD_QUOTE и записываются в столбец с под ячейкой QUOTE_COLLECT. Интервал времени считывания должен устанавливатся пользователем (по умолчанию интервал – 1 секунда).Все понятно? Начинаем.
Заходим в редактор VBA (сочетание клавиш Alt+F11) и создаем форму (UserForm1) и модуль (Module1) для записи VBA кода.
На форму помещаем текстовое поле (TextBox1), текстовую метку (Label1) и две кнопочки (CommandButton1, CommandButton2)
Для наглядности, можно изменить свойства Caption у формы и кнопок.
Я присвоил Caption форме как – Сохраняем Котировки … , а кнопкам – Старт и Стоп.
В свойстве Value поля TextBox1 записываем 1, а у метки Label1 в Caption пишем: Интервал считывания котировок в секундах.
Получаем вот такую форму …
Дальше начинаем писать сам код.
В Module1 создаем процедуру CollectQuoteRun для запуска формы UserForm1:
1 2 3 | Sub CollectQuoteRun() UserForm1.Show End Sub |
Затем переходим к программированию формы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | '---------------------- 'создаем глобальную переменную для управления программой Public StartStop As Integer '---------------------- 'код для кнопки "Старт" Private Sub CommandButton1_Click() Dim PauseTime, Start Dim LastQuote As String 'передаем переменной значение времени паузы PauseTime = UserForm1.TextBox1.Value 'устанавливаем курсор на ячейку под которой будут записыватся данные Range("QUOTE_COLLECT").Select StartStop = 1 'запускаем цикл обращения к ячейке с данными из дде Do While StartStop = 1 'перемещаем курсор на одну ячейку вниз ActiveCell.Offset(1, 0).Select 'записываем в переменную значение котировок LastQuote = Range("GBPUSD_QUOTE").Value 'записываем в переменную значение текущего времени в секундах Start = Timer 'запускаем цикл для задержки времени (по дефолту 1 секунда) Do While Timer < Start + PauseTime DoEvents Loop 'спустя одну секунду, записываем значение котировок в нужном месте ActiveCell.Value = LastQuote 'находимся в цикле пока переменная StartStop = 1 Loop End Sub '-------------------------- 'код для кнопки "Стоп" Private Sub CommandButton2_Click() 'передаем переменной значение 2 для остановки цикла StartStop = 2 'закрываем форму Unload Me End Sub '-------------------------- |
Сохраняем документ и запускаем наш макрос. В появившейся форме ставим количество секунд, через которое нужно сохранять данные. Нажимаем кнопку Старт. Пьем кофе и наблюдаем как записываются котировки.
Такой вот, простенький макрос получился.
Если есть вопросы – welcome to comments!
Двери Montblanc! Покупай окна в коттедж в Крупках на сайте http://beloknadveri.ru
15.12.2008 в 18:00
Спасибо огроменное!!!
Все работает!!!
Кучу форумов перелазил только ты помог!!!
Все сделал с 1-го раза хотя никогда в Exel не программировал. Все просто и подробно расписано!!
Спасибо еще раз огромное!!!
15.12.2008 в 23:11
Да, пожалуйста! Рад, что помог!
01.01.2009 в 07:38
Да, действительно, очень важная и полезная статья. Спасибо огромное!
08.01.2009 в 00:37
Спасибо за столь полезную программку, заработало всё сразу, если можно подскажите как внести изменение в код, если я получаю по DDE данные в 3-5 ячеек в excel и сохранять соответственно тоже, пробовал присвоить имя 3-5 ячейкам, выдаёт ошибку, заранее благодарен.
08.01.2009 в 14:02
Думаю, что самый простой способ – это создать несколько отдельных макросов (для каждой ячейки – свой макрос). Единственное что надо поменять – это имена ячеек. Например, ячейку куда мы принимаем данные по GBPUSD -называем как в данном примере – GBPUSD_QUOTE, по EURUSD – называем EURUSD_QUOTE и так далее…
Ячейку, которая называется QUOTE_COLLECT, переименовываем в QUOTE_COLLECT_GBPUSD и, соответственно для EURUSD называем ячейку QUOTE_COLLECT_EURUSD.
То есть – основная идея в том, что для каждого инструмента создается отдельный макрос с уникальными именами ячеек.
11.01.2010 в 16:08
Антон, подскажите пожалуйста, как сделать чтобы при повторном входе в excel, котировки автоматически подкачивались?
12.01.2010 в 14:50
В рамках данного макроса, пожалуй – никак. Можно организовать экспорт из MT4 в текстовый файл, а уже потом данные из этого файла подставлять в таблицу и запускать макрос. НО! необходимо учесть соответствие временных интервалов. В метатрейдере минимальный интервал 1 минута, а в данном макросе можно использовать любой интервал.
12.01.2010 в 15:55
Egor, спасибо за ответ