В комментариях к статье про передачу данных из 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