МГС  Московская Гигабитная Сеть
 www.umos.su info@umos.su  Выделенные линии Ве/б-Студия Хостинг Collocation
 Тарифы Вопросы и ответы Полезная информация Контакты

Софт >> Excel

Страниц в ветке: 1
krest
Гость


Зарегистрирован: 24/05/2013
Сообщений: 4
Нахождение: Ростов-на-Дону
Данные IB в эксель
      #394188 - 22/06/2017 16:32

Здравствуйте уважаемые!
Возникла надобность получать исторические данные из TWS в Wealth-Lab4.
Думаю, что самым простым вариантом для человека почти не знакомого с программированием, является Эксель. Возможно такой вариант получения данных будет полезен кому-то еще. Получать данные по которым торгуешь гораздо лучше, как мне кажется, чем брать их у стороннего поставщика и гораздо дешевле :-)
Промурыжился две недели, но так работу и не закончил...
Прошу помощи, уважаемые!

Вначале опишу логику согласно с которой мне видится решение этой задачи.
1) Из Эксель отправояется DDE ссылка в TWS.
(пример ссылки: =SЛОГИН|hist!'id4?req?ADP_STK_SMART_USD_~/20170611singleSpace23singleColon59singleColon59_5singleSpaceW_11_TRADES_1_1'
Логин я заменил словом ЛОГИН)
2) Подготовленные данные сохраняются в новый файл эксель который именуется именем акции и сохраняется в папку.
3) Отправляется следующая ссылка с запросом другой акции.

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

Для второго пункта
(Подготовленные данные сохраняются в новый файл эксель который именуется именем акции и сохраняется в папку.)
Мне удалось составить из пары разных макросов код который сохраняет полученные данные в новый файл:

Code:
 Sub fetchHistoricalData()
'This variable will store the incoming data
'Эта переменная будет хранить поступающие данные
Dim TheArray() As Variant
'Fetch the data from the TWS...
'Принесите данные от TWS...
'(Replace sample123 with your own TWS username!)
'(Заменяют sample123 Вашим собственным именем пользователя TWS!)
TheArray = getData("sample123", "hist", "id4?result")
'... and pass the result into another function which will populate the sheet
'... и переносим результат в другую функцию, которая заполнит лист
Call populate(TheArray)
End Sub

'This function triggers a DDE request and returns its response
'Эта функция вызывает запрос DDE и возвращает его ответ
Function getData(serverName, topic, request)
Dim chan As Integer
'Initiate the DDE channel
'Инициация канала DDE
chan = Application.DDEInitiate(serverName, topic)
'Perform the request
'Выполняем запрос
getData = Application.DDERequest(chan, request)
'Terminate the channel
'Закрываем канал
Application.DDETerminate chan
End Function

'Populate our blank sheet with the incoming data
'Заполняем наш чистый лист с поступающими данными
Sub populate(ByRef TheArray() As Variant)

'Книга
NewBook = ""
' Путь, где будут храниться наши карточки
' Т.е. в той папке, откуда запустился файл с макросом
Path = ThisWorkbook.Path

' Выбираем лист с данными
Sheets("Лист1").Select
' Запускаем цикл, скажем на 100000 итераций
' Начиная со второй строки, не учитывая заголовок
For k = 2 To 10000
' Выйдем из него, когда акции закончатся, т.е. строки
If Cells(k, 1).Value = "" Then
k = 10000
Exit For
End If
' Имя файла карточки, назовем по названию акции
Name_file = Path & "\" & Sheets("Лист1").Cells(k, 1).Value & ".xls"

' Создаем новую книгу или делаем ее активной
If NewBook = "" Then
Workbooks.Add
NewBook = ActiveWorkbook.Name
Else
Workbooks(NewBook).Activate
Cells(1, 1).Select
End If

'Watch out for empty possible errors and handle properly.
'Не упустите пустые возможные ошибки и ручку должным образом.
On Error GoTo ErrHandler
For i = 1 To UBound(TheArray)
Range("A" & i + 1).Value = TheArray(i, 1)
Range("B" & i + 1).Value = TheArray(i, 2)
Range("C" & i + 1).Value = TheArray(i, 3)
Range("D" & i + 1).Value = TheArray(i, 4)
Range("E" & i + 1).Value = TheArray(i, 5)
Range("F" & i + 1).Value = TheArray(i, 6)
Range("G" & i + 1).Value = TheArray(i, 7)
Range("H" & i + 1).Value = TheArray(i, 8)
Range("I" & i + 1).Value = TheArray(i, 9)
Next
ErrHandler:

' Сохраняем с нашим новым названием
ActiveWorkbook.SaveAs Filename:= _
Name_file, FileFormat:=xlExcel8, _
Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
CreateBackup:=False
NewBook = ActiveWorkbook.Name
Application.DisplayAlerts = True
' Снова активируем файл с макросом и выбираем лист
Workbooks("Книга1.xlsm").Activate
Sheets("Лист1").Select
' Переходим к следующей строке
Next k
' Закроем книгу
Workbooks(NewBook).Close
' Выведем сообщение об окончании
MsgBox ("Выполнено!")
Exit Sub
End Sub






Осталось совсем чуть чуть, заставить все это последовательно работать как единое целое.

Очень прошу помощи!

--------------------
бой с самим собой, самый трудный бой.


Опции: Распечатать пост   Напомнить мне!   Оповестить модератора  
krest
Гость


Зарегистрирован: 24/05/2013
Сообщений: 4
Нахождение: Ростов-на-Дону
Re: Данные IB в эксель [re: krest]
      #394289 - 28/06/2017 07:41 прикреплённые файлы (11 загрузок)

Все же странно, более 900 просмотров и ни одного ответа... Немного продвинулся в работе, осталось совсем чуть-чуть. Как я понял, суть проблемы в том, что получив данные, макрос fetchHistoricalData продолжает по циклу сохранять одни и те же данные под разными именами содержащимися в столбце A. Но должен, окончив первый цикл перейти к макросу formula, для запроса новых, чтобы получив их, сохранить под уже другим именем, содержащимся на строку ниже. Наверняка проблема там совсем простая. Нужно чтобы макрос "fetchHistoricalData" не переходил к следующей строке пока не сработает макрос "formula". Подскажите пожалуйста, как это сделать? P.s. У файла изменил расширение. Было .xlsm. Иначе не загружается.

--------------------
бой с самим собой, самый трудный бой.


Опции: Распечатать пост   Напомнить мне!   Оповестить модератора  
krest
Гость


Зарегистрирован: 24/05/2013
Сообщений: 4
Нахождение: Ростов-на-Дону
Re: Данные IB в эксель [re: krest]
      #394320 - 30/06/2017 16:16 прикреплённые файлы (12 загрузок)

1000 просмотров!!! И тишина...
Совсем никому не интересно?
Может знаете как выкачивать данные у IB?
Тогда поделитесь пожалуйста методом.

На данный момент работа с макросами принесла плоды в виде возможности скачивать историю, но очень медленно и с ограничением по ликвидности данных. Кому интересно почитайте об этих ограничениях: http://interactivebrokers.github.io/tws-api/historical_limitations.html#gsc.tab=0

А на этой странице описывается как формируется DDE ссылка на конкретные исторические данные: http://interactivebrokers.github.io/tws-api/dde_historical_tutorial.html#gsc.tab=0

Работает но криво и медленно... Буду рад советам и помощи по улучшению!
Файл прикрепляю. Он сохраняет каждую акцию в отдельный файл с расширением .xls в той же папке где сам и находится.
Названия акций должны быть в первом столбце, начиная с ячейки A2 и ниже. Каждый раз перед началом нужно нажать кнопку СБРОС, а потом СТАРТ. И в макросах модуля1 нужно поменять везде слово ЛОГИН на свой логин от TWS. И расширение файла xls на xlsm.

--------------------
бой с самим собой, самый трудный бой.


Опции: Распечатать пост   Напомнить мне!   Оповестить модератора  
Страниц в ветке: 1



Дополнительная информация
0 зарегистрированных и 2 незарегистрированных пользователей просматривает форум.

Модератор:  michaelus, SGN, EVM, x4x, 000, Akelo, Socol, Ленивый, Ptem, Kadavr, podval, untoxa, VovaM, Igonter 

Распечатать тему

Доступ и ограничения:
      Вы не можете начать новую тему
      Вы не можете отвечать на тему
      HTML включён
      UBBCode включён

Рейтинг:
Тема прочитана: 1663

Рейтинг темы

Перейти на

Send letter to Poul | Предупреждение Poul Trade Forum

Powered by UBB.threads™ 6.5.4

Generated in 0.016 seconds in which 0.003 seconds were spent on a total of 12 queries. Zlib compression enabled.