<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; Автоматизация терминала QUIK внешними средствами]]></title>
		<link>https://quik2dde.ru/index.php</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;fid=4&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние темы раздела «QUIK -> DDE».]]></description>
		<lastBuildDate>Sat, 27 Mar 2021 08:26:09 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Автологин в QUIK при двухфакторной авторизации по СМС (на Lua)]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=341&amp;action=new</link>
			<description><![CDATA[<p><strong>BlaZed</strong>, я всё же вынесу эту тему отдельным топиком, т.к. она сама по себе может иметь своё параллельное развитие.</p><p>В дополнение к теме [url=https://quik2dde.ru/viewtopic.php?id=80]автологина QUIK[/url]<br />[url]https://quik2dde.ru/viewtopic.php?id=80[/url]</p><p>Что делать в случае двухфакторной авторизации по SMS ?</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Sat, 27 Mar 2021 08:26:09 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=341&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Ошибка при запуске QUIK через Планировщика заданий. Internal exception]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=338&amp;action=new</link>
			<description><![CDATA[<p>Не получается запуск квика с помошью Планировщика заданий. Пишет:Internal exception happened. При этом предлагается прислать в support&nbsp; arquatech файл /dmp/&quot;info_20210308_123057.dmp&quot;&nbsp; Но такого файла нет!<br />При этом, если просто запускать тот же файл запуска info@exe из папки QUICK, то квик открывается успешно. Пробовал на демо версии и на рабочей версии 8.9.0.107&nbsp; &nbsp;Как преодолеть эту проблему?</p>]]></description>
			<author><![CDATA[null@example.com (charjy)]]></author>
			<pubDate>Mon, 08 Mar 2021 09:38:57 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=338&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Создание таблиц из скриптов на нужной вкладке]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=329&amp;action=new</link>
			<description><![CDATA[<p>Берём [url=https://quik2dde.ru/viewtopic.php?id=78]свежую версию библиотеки w32[/url].<br />Для выбора нужной вкладки, на которой требуется создать таблицу из скрипта, используем функции <strong>TabCtrl_</strong>*</p><p>Ниже пример использования разных возможностей работы с вкладками.<br />Обратите внимание, что основной код по переключения / получению информации с вкладок сделан под условием<br />if hTabWnd &gt; 0 then<br />В этом тестовом скрипте всё удалось уложить под один if, возможно в реальном скрипте придётся добавлять такую проверку для несколько раз. Хотя, если такую проверку не сделать - ничего страшного не случится, просто не получим параметры вкладок / не сменим текущую вкладку. Но терминал точно не упадёт при отсутствии такой проверки.</p><div class="codebox"><pre><code>w32 = require(&quot;w32&quot;)

-- Возвращает handle главного окна QUIK или 0 при ошибке
-- Если запущено несколько терминалов - выбирается тот QUIK, из которого запущен наш скрипт
function GetQuikMainWindowHandle()
    local hQuikWnd = 0
    while true do
        hQuikWnd = w32.FindWindowEx(0, hQuikWnd, &quot;InfoClass&quot;, &quot;&quot;)
        if hQuikWnd == 0 then
            break
        end
        local t,WinProcId = w32.GetWindowThreadProcessId(hQuikWnd)
        if WinProcId == w32.GetCurrentProcessId() then
            break
        end
    end

    return hQuikWnd
end

-- Тестовая функция создания пользовательского окна с таблицей
function CreateTableWindow(caption)
    local t_id = AllocTable()   
    AddColumn(t_id, 0, &quot;1&quot;, true, QTABLE_INT_TYPE, 15)
    AddColumn(t_id, 1, &quot;2&quot;, true, QTABLE_INT_TYPE, 15)
    local t = CreateWindow(t_id)
    SetWindowCaption(t_id, caption)
    InsertRow(t_id, -1)
    SetCell(t_id, 1, 1, &quot;&lt;&lt;&quot; .. caption .. &quot;&gt;&gt;&quot;)
end

-- Основной код

hQuikWnd = GetQuikMainWindowHandle()

-- получим handle окна вкладок, далее все операции по переключению вкладок будем совершать с этим окном
hTabWnd = 0
if hQuikWnd &gt; 0 then
    hTabWnd = w32.FindWindowEx(hQuikWnd, 0, &quot;SysTabControl32&quot;, &quot;&quot;)
    if hTabWnd ~= 0 and not w32.IsWindowVisible(hTabWnd) then
        -- Если окно вкладок найдено, но отображение вкладок отключено - сбросим в 0
        hTabWnd = 0
    end
end

if hTabWnd &gt; 0 then
    -- Если вкладки в терминале отображаются
    -- Сохраним индекс текущей активной вкладки
    local prevIdx = w32.TabCtrl_GetCurFocus(hTabWnd)

    -- Определим и выведем через message() наименование активной вкладки на момент старта
    -- (индекс активной вкладки сохранён ранее, так что здесь получаем / отображаем имя просто так)
    -- w32.TabCtrl_GetItemText() вызываем только с 1 параметром, т.к. нас интересует имя активной вкладки
    local activeTabName = w32.TabCtrl_GetItemText(hTabWnd)
    if activeTabName then
        -- т.к. явно проверили, что имя вкладки получить удалось (оно не nil)
        -- просто отображаем его без tostring()
        message(&quot;Активна вкладка: &quot; .. activeTabName)
    end

    -- Получим индекс вкладки с именем &quot;Графики&quot; (если такая существует)
    local idxGr = w32.TabCtrl_GetItemIndexByText(hTabWnd, &quot;Графики&quot;)
    if idxGr &gt;= 0 then
        -- Если вкладка &quot;Графики&quot; найдена
        -- переключимся на неё и создадим таблицу на ней, получив имя
        w32.TabCtrl_SetCurFocus(hTabWnd, idxGr)
        -- Получим название текущей активной вкладки (только что на нее переключились)
        local txt = w32.TabCtrl_GetItemText(hTabWnd)
        -- Используем tostring(), т.к. TabCtrl_GetItemText при ошибке возвращает nil
        CreateTableWindow(&quot;Вкладка &#039;&quot; .. tostring(txt) .. &quot;&#039;&quot;)
    end

    -- Получим общее количество вкладок
    cnt = w32.TabCtrl_GetItemCount(hTabWnd)
    for i = 0, cnt-1 do
        -- Переключаемся поочередно на каждую вкладку и создаем таблицу с именем вкладки
        w32.TabCtrl_SetCurFocus(hTabWnd, i)
        -- Получим название вкладки
        -- т.к. получаем название текущей активной вкладки (только что на нее переключились),
        -- то второй параметр можно не указывать; но здесь оставлен второй параметр для тестов
        local txt = w32.TabCtrl_GetItemText(hTabWnd, i)
        -- Используем tostring(), т.к. TabCtrl_GetItemText при ошибке возвращает nil
        CreateTableWindow(tostring(txt))
    end

    -- Переключимся назад на исходную вкладку
    w32.TabCtrl_SetCurFocus(hTabWnd, prevIdx)
else
    -- Если вкладки в терминале не отображаются
    CreateTableWindow(&quot;Вкладки отключены&quot;)
end</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Tue, 17 Nov 2020 20:39:51 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=329&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Автоматическое подключение к серверу с помощью lua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=258&amp;action=new</link>
			<description><![CDATA[<p>Друзья у меня такая проблема: Периодически пропадает соединение с сервером от 1 мин до 1 часа. В самом терминале уже настроено &quot;Восстанавливать связь автоматически ...&quot; но видимо работает коряво. Если вручную нажать &quot;Установить соединение&quot; начинает всё работать.<br />Как с помощью lua, после потери связи, устанавливать соединение с сервером? Поделитесь скриптом))</p>]]></description>
			<author><![CDATA[null@example.com (ixorek)]]></author>
			<pubDate>Sat, 24 Mar 2018 11:36:32 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=258&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Упраление QUIK через ICQ]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=180&amp;action=new</link>
			<description><![CDATA[<p><span class="postimg"><img src="https://static.wixstatic.com/media/58b8ef_2de4e98367ce4b8a80dd2dbf7afeb68d.jpg/v1/fit/w_990,h_542,q_90,usm_0.66_1.00_0.01/58b8ef_2de4e98367ce4b8a80dd2dbf7afeb68d.jpg" alt="https://static.wixstatic.com/media/58b8ef_2de4e98367ce4b8a80dd2dbf7afeb68d.jpg/v1/fit/w_990,h_542,q_90,usm_0.66_1.00_0.01/58b8ef_2de4e98367ce4b8a80dd2dbf7afeb68d.jpg" /></span></p>]]></description>
			<author><![CDATA[null@example.com (GSergey2005)]]></author>
			<pubDate>Wed, 09 Dec 2015 17:54:17 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=180&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Програмная выгрузка новостей из QUIK]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=142&amp;action=new</link>
			<description><![CDATA[<p>Добрый день. Возможно ли &quot;подцепится&quot; любыми способами&nbsp; к QUIK и забирать новости которые есть в нём? <br />P.S. В Lua (выгрузка хотя бы в файл новости с контентом) такой возможности не наблюдаю, в DDE не возможен, в trans2quik возможности так же не наблюдаю.</p>]]></description>
			<author><![CDATA[null@example.com (maval)]]></author>
			<pubDate>Thu, 12 Mar 2015 17:38:47 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=142&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Quik оповещения по заданным параметрам]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=89&amp;action=new</link>
			<description><![CDATA[<p>Есть такая замечательная функция в программе Quik как оповещения. Т.е к примеру нужно задать звуковой сигнал по Сберу при цене 75,0р. Но у меня это не работает или работает не так как я хотел бы.<br />Подробно:<br />Есть стандартные функции «оповещения по звуку» к примеру, задаю «рыночную цену» =&gt; или &lt;=, проставляю галочки до снятия. Но все оповещения приходят в конце сессии, т.е прошли торги и спустя минут 20 начинают появятся таблички с оповещением. В чем проблема? Серверы все менял, далее перебрал все имеющиеся строки выбора и ничего не получалось, скажите как вы задаете звуковые оповещения и всем ли Вам приходят они?</p><p>Уже начал думать о роботе установленном на учебном квике параллельно включенным с рабочим. Есть ли у кого какие либо идеи и простые роботы? Нужна всего одна функция — звуковой сигнал по заданной рыночной цене.</p><p>Всем заранее спасибо!!!</p><p>Я совершенно не умею программировать. И только начал свой путь трейдера, не судите строго.</p>]]></description>
			<author><![CDATA[null@example.com (mda-33)]]></author>
			<pubDate>Thu, 20 Mar 2014 03:18:02 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=89&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Автологин в QUIK (на Lua)]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=80&amp;action=new</link>
			<description><![CDATA[<p><span class="bbu">Установка:</span><br /></p><ul><li><p>распаковываем из [url=https://quik2dde.ru/static-img/78/w32.dll.zip]архива с библиотекой w32[/url] файл <strong>w32.dll</strong>, копируем его в каталог с терминалом QUIK (туда, где info.exe). ([url=https://quik2dde.ru/viewtopic.php?id=78]почитать подробнее про библиотеку w32[/url])</p></li><li><p>сохраняем [url=https://quik2dde.ru/static-img/80/quik_autologin.lua]скрипт Lua для автологина[/url] на диск (не обязательно в папку с терминалом QUIK, можно в любую другую)</p></li></ul><p>В скрипте изменяем логин и пароль на нужные в следующих строках:<br /></p><div class="codebox"><pre><code>-- логин и пароль для терминала
QUIK_LOGIN = &quot;7&quot;
QUIK_PASSW = &quot;123&quot;</code></pre></div><p><span class="bbu">Использование:</span><br />Настраиваем вывод экрана логина QUIK сразу при запуске терминала:</p><p><span class="postimg"><img src="https://quik2dde.ru/static-img/80/quik_autologin-01.png" alt="https://quik2dde.ru/static-img/80/quik_autologin-01.png" /></span></p><p><span class="postimg"><img src="https://quik2dde.ru/static-img/80/quik_autologin-02.png" alt="https://quik2dde.ru/static-img/80/quik_autologin-02.png" /></span></p><p>Добавляем скрипт в терминал через меню <strong>Таблицы</strong> --&gt; <strong>Lua</strong> --&gt; <strong>Доступные скрипты</strong><br />Запускаем скрипт на выполнение.</p><p>Теперь каждый раз, когда связь с сервером отсутствует и появится окно логина - скрипт обнаружит появление окна, автоматически подставит логин и пароль и подключить терминал.</p><p>Останавливать скрипт не следует, в этом случае сразу после запуска терминала QUIK после его загрузки и при условии настройки автоматического отображения окна логина, как указано выше, произойдет автоматическое подключение терминала.</p><br /><p>Разумеется, для пущей секретности места хранение логина и пароля можно изменить, поправив соответствующим образом скрипт.</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Mon, 28 Oct 2013 20:34:20 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=80&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Проигрывание звуковых файлов из Lua (mp3, wav, midi и т.д.)]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=79&amp;action=new</link>
			<description><![CDATA[<p><span class="bbu">Установка:</span> распаковываем из [url=quik2dde.ru/static-img/78/w32.dll.zip]архива с библиотекой w32[/url] файл <strong>w32.dll</strong>, копируем его в каталог с терминалом QUIK (туда, где info.exe). ([url=https://quik2dde.ru/viewtopic.php?id=78]почитать подробнее про библиотеку w32[/url])</p><p><span class="bbu">Использование:</span> добавляем в код робота текст</p><div class="codebox"><pre><code>-- подключить библиотеку w32
local w32 = require(&quot;w32&quot;)

-- функция проигрывания файла
-- вызов: PlaySoundFile(&quot;имя файла&quot;)
function PlaySoundFile(file_name)
  w32.mciSendString(&quot;CLOSE QUIK_MP3&quot;) 
  w32.mciSendString(&quot;OPEN \&quot;&quot; .. file_name .. &quot;\&quot; TYPE MpegVideo ALIAS QUIK_MP3&quot;)
  w32.mciSendString(&quot;PLAY QUIK_MP3&quot;)
end</code></pre></div><p><span class="bbu">Пример использования:</span></p><div class="codebox"><pre><code>-- проиграть звуковой файл из каталога Windows XP
PlaySoundFile(&quot;C:\\WINDOWS\\Media\\Windows XP - запуск.wav&quot;)</code></pre></div><p>При задании строковых констант путей к файлу не забывайте &quot;удваивать&quot; символы обратного слэша.</p><p><span class="bbu">Полезные особенности данного метода</span>:<br /></p><ul><li><p>проверил проигрывание файлов wav, mp3, midi: проигрываются</p></li><li><p>на время проигрывания файла выполнение Lua-скрипта <strong>не останавливается</strong></p></li><li><p>если проигрывание одного файла еще не закончилось и снова вызвана функция PlaySoundFile(), то тут же начинает играть новый файл</p></li></ul><p>Описание разных команд для mciSendString в интернете:<br /></p><ul><li><p>[url=http://web.archive.org/web/20180130234313/http://free-basic.ru/mcisendstring.html]http://free-basic.ru/mcisendstring.html[/url] - есть примеры разных команд для mciSendString</p></li><li><p>[url]https://frolov-lib.ru/books/bsp/v15/ch2_2.htm[/url] - очень подробное описание разных команд, особенно связанных с проигрыванием звуков</p></li></ul>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Mon, 28 Oct 2013 18:44:43 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=79&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Вывод исторических данных через pipe]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=19&amp;action=new</link>
			<description><![CDATA[<p>Хочу поделиться простой функцией экспорта данных графиков через pipe. Много работал с DDE серверами, но только недавно узнал про возможность такого простого экспорта данных через pipe. Открываем экспорт данных - данные для технического анализа, там выбираем инструмент, интервал и обязательно систему ТА - Amibroker. В общем-то все, после этого появится пайп с именем вида AmiBroker2QUIK_SBER@EQBR_1_1MINUTES, где SBER@EQBR_1 заданное мной имя. Теперь функция для чтения этого пайпа: </p><div class="codebox"><pre><code>using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.InteropServices;
using System.IO;
using System.IO.Pipes;
using System.Threading;
using System.ComponentModel;
using System.Timers;
using System.Linq;

namespace TestPipe
{
    /// &lt;summary&gt;
    /// Логика взаимодействия для MainWindow.xaml
    /// &lt;/summary&gt;
    public partial class MainWindow : Window
    {
        protected override void OnClosing(CancelEventArgs e)
        {
            if (pipe != null)
            {
                pipe.Dispose();
            }
        }

        System.Timers.Timer _Timer = new System.Timers.Timer();
        NamedPipeClientStream pipe;
        public MainWindow()
        {
            InitializeComponent();
            string pipeName = &quot;AmiBroker2QUIK_SBER@EQBR_1_1MINUTES&quot;;
            if (System.IO.Directory.GetFiles(@&quot;\\.\pipe\&quot;).FirstOrDefault(p =&gt; p == &quot;\\\\.\\pipe\\&quot; + pipeName) != null)
            {
                pipe = new NamedPipeClientStream(pipeName);
                bool cr = pipe.CanRead;
                pipe.Connect();
                _Timer.Elapsed += UpdateChart;
            }
            else 
            { 
                pipe = null;
            }
        }

        public void WriteLine(string Line)
        {
            if ((Line.Length &lt; 3) &amp;&amp; (Line != Environment.NewLine))
            { Line = &quot;0&quot; + Line; }
            Dispatcher.BeginInvoke(new Action(() =&gt;
            {
                this.textBox1.Text = this.textBox1.Text + Line;
            }));
        }

        private byte[] ReadPipe(NamedPipeClientStream NamedPipe, int size)
        {
            int bc = 0;
            int bc2 = 0;
            byte[] outByte = new byte[size];
            try
            {
                if (size &gt; 1024)
                {
                    do
                    {
                        bc = NamedPipe.Read(outByte, bc2, size - bc2);
                        bc2 = bc + bc2;
                    }
                    while (bc2 &lt; size);
                }
                else
                {
                    bc = NamedPipe.Read(outByte, 0, size);
                    bc2 = bc;
                }
            }
            catch { }
            return outByte.Take(bc2).ToArray();
        }

        int i = 0;
        byte[] CandleBytes = new byte[48];
        bool IsStream = false;
        bool IsFirstRead = true;
        int BarCount = 0;
        int cs = 0;
        private void UpdateChart(object sender, ElapsedEventArgs args)
        {
            UpdateChart();
        }

        int size = 1024;
        private void UpdateChart()
        {
            if (pipe != null)
            {

                byte[] bytes;
                if (IsFirstRead)
                {
                    bytes = ReadPipe(pipe, size);
                    int _cb = 0;
                    foreach (var b in bytes)
                    {
                        if (_cb &gt; 3)
                        {
                            if ((bytes[_cb - 3] == 7) &amp;&amp; (bytes[_cb - 2] == 0))
                            {
                                byte[] BarCountB = bytes.Skip(_cb - 1).Take(2).ToArray();
                                BarCount = BitConverter.ToInt16(BarCountB, 0);
                                size = (BarCount + 36) * 49;
                                break;
                            }
                        }
                        _cb++;
                    }
                }
                else
                {
                    bytes = ReadPipe(pipe, size);
                    size = 1024;
                }

                int cb = 0;
                string outStr = &quot;&quot;;
                foreach (var b in bytes)
                {
                    if (cb &gt; 2)
                    {
                        if ((bytes[cb - 2] == 8) &amp;&amp; (b == 0) &amp;&amp; (!IsStream))
                        {
                            IsStream = true;
                        }
                    }
                    if (IsStream)
                    {
                        if ((i &gt;= 48) &amp;&amp; (IsStream))
                        {
                            i = 0;
                            byte[] CandleBytes2 = CandleBytes;
                            CandleBytes = new byte[48];
                            IsStream = false;
                            byte[] dateB = CandleBytes2.Take(8).ToArray();
                            long dDate = BitConverter.ToInt64(dateB, 0);
                            if (dDate != 0)
                            {
                                DateTime pDate = (new DateTime(1970, 1, 1, 4, 0, 0, 0)).AddSeconds(Convert.ToInt64(dDate.ToString().Substring(0, 11)) - 11644488000);
                                byte[] OpenB = CandleBytes2.Skip(8).Take(8).ToArray();
                                double Open = BitConverter.ToDouble(OpenB, 0);
                                byte[] HighB = CandleBytes2.Skip(16).Take(8).ToArray();
                                double High = BitConverter.ToDouble(HighB, 0);
                                byte[] LowB = CandleBytes2.Skip(24).Take(8).ToArray();
                                double Low = BitConverter.ToDouble(LowB, 0);
                                byte[] CloseB = CandleBytes2.Skip(32).Take(8).ToArray();
                                double Close = BitConverter.ToDouble(CloseB, 0);
                                byte[] VolumeB = CandleBytes2.Skip(40).Take(8).ToArray();
                                double Volume = BitConverter.ToDouble(VolumeB, 0);

                                outStr += cs.ToString() + &quot;; &quot;;
                                outStr += pDate.ToString() + &quot;; &quot;;
                                outStr += Open.ToString() + &quot;; &quot;;
                                outStr += High.ToString() + &quot;; &quot;;
                                outStr += Low.ToString() + &quot;; &quot;;
                                outStr += Close.ToString() + &quot;; &quot;;
                                outStr += Volume.ToString();
                                outStr += Environment.NewLine;
                                cs++;
                            }
                        }
                        else
                        {
                            CandleBytes[i] = b;
                            ++i;
                        }
                    }
                    ++cb;
                }
                if (outStr != &quot;&quot;)
                {
                    WriteLine(outStr);
                }

                if ((!IsFirstRead)&amp;&amp;(_Timer.Interval != 200))
                {
                    _Timer.Interval = 200;
                    _Timer.Start();
                }

                if (IsFirstRead)
                {
                    IsFirstRead = false;
                    UpdateChart();
                }
            }
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            UpdateChart();
        }
    }
}</code></pre></div><p>С разбором даты я не совсем до конца разобрался, но в таком виде корректно отображает с точностью до секунд. Ну и чтобы уж совсем автоматизировать выгрузку, можно самому формировать файлик metastok.dat - в нем содержатся параметры для выгрузки.</p>]]></description>
			<author><![CDATA[null@example.com (boris)]]></author>
			<pubDate>Thu, 20 Dec 2012 11:18:10 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=19&amp;action=new</guid>
		</item>
	</channel>
</rss>
