Блог им. Tinych

Квик DDE, таблицы Экселя, Пайтон

Чтобы не свихнуться от захлестнувшего мир сумасшествия. Решил освоить модный нонче Пайтон.
До этого был небольшой опыт программирования на языке R. Столкнулся с одной проблемой. Пайтон прекрасно читает данные из таблиц Эксель. Например, копирую таблицу текущих параметров Квика. Сохраняю в Эксель, все читается, можно обрабатывать данные. Вывожу эту же таблицу по DDE в Эксель, данные выводятся. Если не сохранять эту таблицу, то Пайтон ничего не видит. Если же ее сохранить, то видит только последние сохраненные данные. Причина, скорее всего, не в Пайтоне, а Экселе. Собственно вопрос: как прочитать Пайтоном таблицу Эксель, с данными, получаемыми по DDE от Квика?

  • обсудить на форуме:
  • QUIK
★1
21 комментарий
Рекомендовал бы не связываться с DDE. Так себе решение, проходили. Попробуйте написать скрипт qlua, где в цикле каждые N секунд сбрасывайте таблицу в файл. Сбрасывать можно на диск в памяти.
Ну а потом этот файл читать из питона.
Рекомендую в конце файла ставить какой нибудь индикатор конца файла, а то квик еще не записал файл до конца, а питон уже начал читать и закончил, хотя данные еще не записались.
Счастливый Конец, Спасибо. А с помощью qlua Квик позволяет обращаться к своим штатным таблицам? 
Vladimir Diaditchev, конечно позволяет. Найдите в папке квика файл QLUA.chm и там перечислены таблицы и их поля. Читаете строка за строкой нужные поля, сбрасываете в файл и дальше делайте что хотите. А так вам выше написали, в экселе есть VBA, прямо в нем можно анализировать. VBA это visual basic for application, встроенный в эксель (и в ворд тоже) язык программирования. Можете повесить событие на изменение чего либо и выводить результат куда либо.
Счастливый Конец, Ок. надо попробовать, Спасибо.

нафига накручивать всякую всячину в виде питон-скриптов поверх excel если в том же VBA можно запилить любой код при изменении книги/листа/ячейки. Через DDE обновляется таблица в excel, это обновление обрабатывает vba на лету

Вот это вообще не понял:
Если не сохранять эту таблицу, то Пайтон ничего не видит. Если же ее сохранить, то видит только последние сохраненные данные.

скрин таблицы квика, которую пытаетесь влить в excel прикрепите. Если котировки, то для интрадей DDE при большой частоте тиков отвратителен.

копирую таблицу текущих параметров Квика. Сохраняю в Эксель

Что вы вкладываете в понятие «копировать таблицу в excel» и «сохранить в excel»? У вас питон-скрипт к чему обращается к текущим данным в книге «на лету» или к сохраненному файлу excel на диске?
avatar
Serj90,  чего тут непонятного, квик через DDE посылает данные в открытую таблицу Excel (сам эксель тоже запущен) и все работает. Но питон открывает таблицу как файл, а в файл после DDE никто не сохраняет и питон изменений не видит.
Счастливый Конец, Так и происходит. 
Vladimir Diaditchev, Попробуйте в VBA сделать сохранение документа после изменения листа экселя. Как это сделать уже не могу сказать, лет 20 уже этот VBA не трогаю. Зайдите в редактор макросов и посмотрите события листа на которые можно повесить созхранение.
Serj90, Скрин таблицы, данные из которой хотел получать в Пайтоне.
В Пайтоне достаточно просто решается обработка полученных данных, представление их в удобном для восприятия виде и тп.  
Вот таблица получаема по DDE:

Данные в таблице меняются, по мере поступления. Но Пайтон именно  изменения не видит, при периодическом чтении таблицы выводит одни и те же данные, у меня ячейку B2? таблицы.

В таблице Эксель данные меняются, Пайтон читает только сохраненные данные.

«копировать таблицу в excel» -копирование из Квик в Эксель через буфер обмена. «сохранить в excel» нажатие иконки сохранения. 
Vladimir Diaditchev, тогда решение: автосохранение по изменению значения в ячейке. Но представьте к вам валится 100 тиков в секунду… Повторюсь у меня i5, 8gb ram, ssd. Первые 30 минут начала торгов и я выгружаю только цену последней сделки — дикие просадки в произволительности, а вам еще и сохранение требуется.
avatar
Выгружайте через ODBC в MsAccess, а оттуда забирайте в Питон, например через SQL запросы 
avatar
T-800, если необходимо использовать  обезличенннеы слелки, ордера и стопы — access не тройгате. от него сам уходил на MS SQL+VB NET. Почему? потому что необходимо использовать bigint -19-значные номера сделок. Это при условии что робот полноценный. ODBC--MS SQL(здесь на вкус цвет)-- ЯП (на вкус и цвет). 
avatar
Счастливый Конец, ну перечитай мой коммент и поймешь что было из топика не понятно
avatar

Два варианта автосохранения файла Excel используя VBA.

Вариант 1:
Модуль ЭтаКнига:Private Sub Workbook_Open()      Call save20  End Sub   Модуль Модуле1:Sub save20()      thisWorkbook.Save      Application.OnTime Now + TimeValue(«00:00:20»), «save20»  End Sub

Вариант 2:
Module1 :Public TimerFlag As BooleanPublic MyEarliestTime As Variant Sub Timer_Tick()    If TimerFlag Then        ThisWorkbook.Save        MyEarliestTime = Now + TimeValue(«00:00:20»)        Application.OnTime EarliestTime:=MyEarliestTime, Procedure:=«Timer_Tick»    End IfEnd Sub Модуль ЭтаКнига:Private Sub Workbook_Open()    TimerFlag = True    Call Timer_TickEnd Sub Private Sub Workbook_BeforeClose(Cancel As Boolean)    TimerFlag = False    Application.OnTime EarliestTime:=MyEarliestTime, Procedure:=«Timer_Tick», Schedule:=False    ThisWorkbook.SaveEnd Sub
Сам пробовал вариант 2, он немного глючит при закрытии Excel. Вариант 1, не пробовал.



avatar
Спасибо, попробую эти варианты.

avatar
Vladimir Diaditchev, здравствуйте! Столкнулся с аналогичными проблемами. Подскажите, получилось ли у вас решить их?
avatar
OldDead, Добрый день. Нет. Одним кликов не решается. Оказалось, что мою задачку проще решить непосредственно в Excel.
avatar
Vladimir Diaditchev, есть вариант автосохранения Экселя через макрос, если еще нужно
www.planetaexcel.ru/forum/?FID=8&PAGE_NAME=read&TID=8004
После удалось соединить с питоном
avatar
OldDead, Спасибо, буду пробовать.
avatar

теги блога Vladimir Diaditchev

....все тэги



UPDONW
Новый дизайн