Заметка

Пишем торгового робота на C#. Часть 1. Основы языка программирования и связь с терминалом

  17  

В последнее время всё чаще слышу от многих трейдеров заявления, что очень здорово знать язык программирования и самому писать роботов. Многие усиленно пытаются изучать модный в последнее время язык C#. Однако новичку с нуля написать какое-либо стоящее приложение будет довольно сложно. В этой статье я попытаюсь дать минимальные знания языка программирования, показать логику построения приложения, спроектировать и запустить торгового робота для терминала QUIK.

Сразу хотелось бы отметить, что данная статья более всего ориентирована на новичков в программировании, знания которых ограничиваются школьной/университетской программой и опытом программирования на языках типа Pascal, Basic. В качестве литературы по языку C# лучше всего подойдут книги Шилдта и справка Microsoft.

В начале посмотрим, какие средства представлены в настоящий момент, для разработки роботов и создания автоматизированных алгоритмических торговых систем:

1)      Инструменты встроенные в терминал

  1. Qpile – встроенный язык в наиболее популярный терминал для торговли QUIK, язык довольно просто. Однако у этой простоты помимо очевидного плюса в легком освоении, есть очевидные минусы, как ограниченный функционал, сложность отладки.
  2. LUA – еще один несложный язык для терминала QUIK. Имеет больший функционал, чем Qpile. Однако большую популярность еще не приобрел. Сам код работает непосредственно в терминале QUIK.

2)      Внешние коробочные продукты – очень схожие по функционалу:  возможность тестирования на исторических данных, написание торговых систем на языке платформы .NET (обычно C#), интеграция с торговым терминалом.

  1. TradeMatic — система для создания торговых систем со встроенным механизмом тестирования на истории.
  2. TSLab – система аналогичная TradeMatic. Имеет визуальный редактор для проектирования торговой стратегии.
  3. LiveTrade RobotLab – терминал и визуальный конструктор роботов с возможностью написания кода самому.

3)      Внешние программы, разработанные самостоятельно. В данном случае можно использовать любой язык программирования, который знает человек.  Несколько лет назад была популярна связка терминала QUIK и Excel с роботом, написанным на Visual Basic. В настоящий момент можно воспользоваться довольно мощной и гибкой библиотекой для написания роботов Stock#, однако не программисту будет довольно сложно в ней разобраться.

Для разработки своего робота «с нуля» определимся со списком задач:

1)      Реализация импорта данных из терминала QUIK в нашу программу

2)      Программирование торгового алгоритма

3)      Создание механизма отправки заявок на совершение торговых операций в терминал

Этот список можно разбить на множество подпунктов, которые мы будем формулировать по ходу реализации этих этапов.

Прежде чем начать реализовывать импорт данных из терминала QUIK в нашу программу, вспомним основы программирования. Чтобы не превращать статью в очередной нудный учебник по программированию, опишем основные конструкции языка, которые нам понадобятся только для разработки программы.

В C# есть два способа построения интерфейсов клиентских приложений. Первый – использовать Windows Forms – технология построения приложений, которая уже более 10 лет применяется при проектировании визуального интерфейса. Второй — Windows Presentation Foundation (WPF) – довольно новая система для построения интерфейса, имеет возможность создавать привлекательный элементы с использованием 3D-графики, использует MVC-подход, однако требует больших ресурсов компьютера, чем WinForms. Поскольку Windows Forms проще и менее требователен к ресурсам, мы будем использовать именно эту технологию.

Начнем с создания приложения. Для этого надо запустить Visual Studio 2010 и создать проект «Приложение Windows Forms» (Рис. 1).

 

Рис. 1. создание приложения Windows Forms

После создания мы видим Форму – на ней будут размещаться визуальные элементы и дерево файлов, включая файл с кодом (Рис. 2, 3). Чтобы перейти к коду приложения, нужно нажать клавишу F7.

 

Рис. 2. Форма

 

Рис. 3. Код приложения

Если посмотреть на код, который был создан Visual Studio, то мы видим что, платформа нам автоматически создала объект класса Form. Класс — это логическая структура, позволяющая создавать свои собственные пользовательские типы путем группирования переменных других типов, методов и событий. Класс подобен чертежу. Он определяет данные и поведение типа. Класс и объект — это разные вещи, хотя в некоторых случаях они взаимозаменяемы. Класс определяет тип объекта, но не сам объект. Объект — это конкретная сущность, основанная на классе и иногда называемая экземпляром класса.

Также нам потребуется вспомнить это такое переменные. Переменные объявляются следующим образом:

ТипДанных Идентификатор;

Например:

int i = 10;                             //переменная целого типа

string st = “text”;             //переменная строкового типа

bool flag = true;               //переменная логического типа, принимает значения только true или false

Переменная представляет числовое или строковое значение или объект класса. Значение, хранящееся в переменной, может измениться, однако имя остается прежним.

Точно также обозначаются и массивы, которые представляют собой набор данных одного типа.

Прежде чем начать писать код для импорта данных, определим какие данные нам нужно импортировать из QUIK в нашу программу. В упрощенном варианте для нас будут важны исторические свечи и текущие цены торгуемого инструмента.

Хочу обратить внимание, что импортировать свечи просто так у нас не получится. Чтобы импортировать свечи в нашу программу придется написать портфель на языке терминала Qpile и открыть его в терминале, выбрав в меню QUIK пункт Таблицы-Портфели-Задать портфель (Рис. 4) и нажать кнопку загрузить локально. После чего выбрать Таблицы-Портфели-Просмотр портфеля, нажать кнопки «Добавить все» и затем кнопку «Да», установив значение поля «Имя таблицы» как «candles» (Рис.5). После чего в QUIK появится новое окно со списком свечей (Рис. 6).

 

Рис. 4. Загрузка портфеля

 

Рис. 5. Открытие и запуск портфеля

 

Рис.6. Результат открытия портфеля

Теперь давайте подумаем, как можно получить данные из терминала QUIK. Из QUIK данные можно получить тремя способами:

1) экспортировать данные через ODBC

2) экспортировать данные через DDE

3) брать данные непосредственно из памяти

Третий способ очень трудозатратный для программирования, хотя является самым быстрым для получения данных. Вывод данных через ODBC, как пишут разработчики Quik, работает медленнее, чем вывод через DDE. Поэтому мы воспользуемся наиболее простым способом – выводом через DDE.

Настроим сразу же QUIK для вывода данных (Рис. 7). Для этого нужно выделить нужную таблицу и нажать в меню Экспорт данных – Вывод по DDE. В качестве DDE сервера нужно указать имя «DDEServer». В качестве рабочей книги нужно указать следующее:

1)      для таблицы исторических свечей – «candles»

2)      для таблицы котировок и инструментов – «quotes»

3)      для таблицы заявок – «orders»

Не забудьте установить галочку «Вывод при нажатии Ctrl+Shift+L».

 

Рис. 7. Настройка вывода таблицы по DDE

В итоге окно QUIK будет выглядеть следующим образом:

 

Рис. 8. QUIK

Для импорта по DDE нам потребуется:

1) Класс XLTable, реализующий приведение данных из формата Excel к обычному виду (все необходимые файлы есть в приложении к статье)

2) Библиотека NDde.dll для создания DDE сервера

Чтобы добавить динамическую библиотеку, которая содержит необходимый набор функций для нашего приложения, нужно выбрать пункт «Добавить ссылку» в Обозревателе решений и открыть файл NDde.dll (Рис. 4).

 

Рис. 9. Импорт DLL

Сформируем класс для работы с DDE сервером:

class MyDDEServer : DdeServer

{

    public MyDDEServer(string service) : base(service)

    {

    }

}

В этом классе должны быть предусмотрен минимальный набор функции:

1)      Регистрация сервера

2)      Разрегистрация сервера

3)      Событие срабатывания таймера для получения новых данных

4)      Метод для обработки принятия данных

Добавим объекты на форму, для которых назначим эти события (Рис. 5).

 

Рис. 10. Кнопки на форме

Теперь назначим на кнопку «Запустить» событие нажатия мышью, дважды кликнув на эту кнопку в конструкторе и добавим код запуска DDE сервера:

private void buttonRunDDEServer_Click(object sender, EventArgs e)

{

     server = new MyDDEServer("DDEServer");  //Создаем объект DDE сервер

     server.Register();  //Регистрируем его

}

В этом случае мы создали объект класса MyDDEServer и затем вызвали метод этого объекта Register(). Конструктор класса принимает одно значение – строковую переменную, которая обозначает название имя нашего сервера. В реализации конструктора класса MyDDEServer мы используем таймер, который будет отвечать за оповещение при получении новых  данных:

System.Timers.Timer _Timer = new System.Timers.Timer();


public MyDDEServer(string service) : base(service)

{

   _Timer.Elapsed += this.OnTimerElapsed;  //подписываемся на событие принятия данных

   _Timer.Interval = 100;  //Интервал таймера в мс

}

Рассмотрим теперь метод получения данных через DDE:

    protected override PokeResult OnPoke(DdeConversation conversation, string item, byte[] data, int format)

    {

            XLTable table = new XLTable(data);

            // Данные и Заголовки таблиц

            double[,] impdata = new double[table.Rows, table.Columns];

            string[,] imptitles = new string[table.Rows, table.Columns];

            //Конвертируем данные в понятный вид

            XLTable.BytesToMatrix(data, ref impdata, ref imptitles);       

            switch (conversation.Topic)

            {

                case "candles":

                    break;

                case "orders":

                    break;

                case "quotes":

                    break;

            }

        }

        return PokeResult.Processed;

    }

Этот метод вызывается каждый раз при срабатывании таймера, который был установлен в конструкторе класса. Данные содержатся в массиве data, который мы с помощью метода BytesToMatrix класса XLTable преобразуются в привычный нам вид. Затем мы используем условный оператор switch для определения, какую таблицу обрабатывать.

На форму приложения я также добавил визуальные объекты для отображения пришедших данных. В результате компиляции (F5)  приложения и запуска импорта по DDE получилось следующее (Рис. 11):

 

Рис. 11. Импорт данных их QUIK в окно приложения

Как мы видим, данные успешно импортируются в наше приложение из терминала QUIK, теперь перед нами встает задача создания логики торгового робота и его программная реализация, о чем я постараюсь написать в следующей статье.

Структура архива:

1)      NDde.dll — динамическая библиотека, в которой реализованы функции для работы с DDE сервером

2)      XLTable.cs – класс для обработки данных из QUIK в приложение

3)      charts.qpl – портфель для QUIK на языке Qplie для формирования исторических счевек

4)      INFO.wnd – настройки QUIK

5)      Robot – код робота на C#

Прикрепленные файлы

·   arhive.zip

Комментарии

cm_ss — 17 сентября 2013 г.

А где ссылка на архив?

0 +

dK7n3oebfF — 22 сентября 2013 г.

А что будет с программой если QUIK не будет запущен?
Как сделать привязку к счету?

0 +

Максим Милованов — 22 сентября 2013 г.

С программой ничего не будет, просто данные не будут в нее приходить.
Привязку к счету мы рассмотрим в следующей части, когда будем отправлять заявки в Quik

0 +

dK7n3oebfF — 26 сентября 2013 г.

1. Как быть ,если нужно передавать котировки не 1го инструмента, а скажем 2х сразу?
2. Как передавать в программу значения индикаторов?
3. Какой можете посоветовать учебник по C# для освоения логики и синтаксиса этого языка?

0 +

Максим Милованов — 26 сентября 2013 г.

dK7n3oebfF,
1. тут два варианта - открыть два стакана и их уже импортировать либо написать портфель который будет аггрегировать данные по двум инструментам
2. значения индикаторов можно передать через портфель написанный на qpile, я таким образом передаю исторические свечи
3. по языку C# лучше всего подойдут книги Шилдта и справка Microsoft. Лучшая практика изучения языка - это как можно больше программировать на нем

0 +

hobbit63-22 — 6 октября 2013 г.

Уважаемый Максим, скажите пожалуйста когда появится часть 2? Поясните подробнее как можно брать данные(котировки) из памяти quik(другого терминала), если можно приведите пример? Спасибо большое!

1 +

Максим Милованов — 7 октября 2013 г.

hobbit63-22, вторая часть думаю появится в течении ближайшей недели-двух.
Если в двух словах - чтобы брать данные из памяти - нам надо обратится к адресному пространству другого приложения использую Windows API

0 +

hobbit63-22 — 7 октября 2013 г.

Уважаемый Максим! Могли ли Вы в одной из частей рассмотреть пример как обратиться к адрессному пространству другого приложения используя Windows API ? Спасибо большое!

0 +

Максим Милованов — 28 октября 2013 г.

hobbit63-22, это довольно трудозатратный процесс, ну и не всем скорее всего это будет интересно. Программисты со стажем, думаю, могут разобраться без проблем, а новичкам просто это незачем.

0 +

sweet11 — 24 октября 2013 г.

Доброе утро, Максим. Меня зовут Иван. Меня очень заинтересовала Ваша статья. Хотелось бы попробовать сперва создать кое-что простое, (как у Вас:))) а потом уже подработать по своему алгоритму.
К своему сожалению, я профан в программировании. Вот решил немного поизучать. У меня тут же пошли проблемы. Первая - это:
при попытке задать портфель candles - я его создаю. Но он у меня пустой (т.е. пустые всестолбцы и строки). Сам QUIK пишет, что портфель candlesexport успешно задан. Но потом, когда я пытался вывести по DDE данные, то вылазиет след. окно
"Не удалось создать соединение с 2DDEServer2. Либо не запущен candles, либо в него не загружен лист. "таблица 'candles'

Помогите пожалуйста, что я делаю не так. Почему у меня quik не выводит портфель?
Премного благодарен.
С глубоким уважением, Иван.

0 +

Максим Милованов — 28 октября 2013 г.

sweet11, Прежде чем запускать экспорт данных из квика, надо запустить DDE сервер, т.е. ту программу про которую я писал. Если таблица в квике пустая, то скорее всего у вас разные таймфреймы на графике и в портфеле.

0 +

Croadeb — 25 октября 2013 г.

Максим, помогите пожалуйста написать такой портфель на qpile

0 +

Максим Милованов — 28 октября 2013 г.

Croadeb, Там будет абсолютно все тоже самое, просто нужно исправить одну из первых строк в файле charts.qpl изменив переменную таймфрейм на необходимую.

0 +

Croadeb — 25 октября 2013 г.

т.е. мне нужно поменять таймфрейм на 1 минуту=)

0 +

truvor — 30 ноября 2013 г.

Такая же ситуация с таблицей candles, она у меня пустая. Открыл окошко "отладка", там после того, как функция GET_CANDLE отрабатывает, значение свечи candle остаётся пустой. Файл портфеля использовал из вашего архива.

Таймфрейм, в коде, как я понял, - это таймфрейм портфеля. Значение же таймфрейма на графике тогда я не совсем понял, что имели ввиду. Это значение "Период расчёта (сек)", которое можно изменить в разделе "работа с портфелями" или где? По идее ведь, на момент, когда появляется таблица, никакого графика нет.

Я думал, может зависит от того, что я к учебному серверу через quik junior подключаюсь, но ведь данные в таблице котировок обновляются и я могу исполнять заявки из клиента.

Помогите, пожалуйста, разобраться с этой проблемой.

0 +

Максим Милованов — 2 декабря 2013 г.

truvor, учебный или реальный счет - это не важно. Попробуйте проверить
1) одинаковые ли таймфреймы на графике и в портфеле
2) проверьте название инструмента в портфеле и на графике

Для проверки можете воспользоваться импортом настроек из архива.

0 +

lasleon — 2 декабря 2013 г.

Архива нету.

0 +

lasleon — 2 декабря 2013 г.

Сори, Архив скачался. Сижу, разбираюсь.

0 +

lasleon — 2 декабря 2013 г.

На купайе аккуратненько написано. Подключил, проверил - все норм, таблицу данные идут.

0 +

truvor — 3 декабря 2013 г.

Создал график инструмента, после этого таблица заполнилась. Значит для каждого инструмента, данные о котором нужно будет импортировать в своё приложение, должен быть построен график в клиенте квика?

0 +

Максим Милованов — 3 декабря 2013 г.

truvor, Да, абсолютно верно, именно так.

0 +

sewet — 16 января 2014 г.

открыл график сбера на 15мин - толку нету

0 +

sewet — 16 января 2014 г.

не на 15 а на 5...не получается.
Может видео какое нибудь на эту тему есть?

0 +

Максим Милованов — 17 января 2014 г.

sewet, проверьте, возможно в портфели QUIK установлен другой таймфрейм. Также проверьте какой тикер выбран в портфеле (переменная).

0 +

lasleon — 17 января 2014 г.

Что бы выводилось в таблицу - надо сделать привязку Инструмента к графику.
Выделяете свечку на графике правой кнопкой - Параметры - Дополнительно - Идентификатор - Пишете имя инструмента как в написано в купайле.
Ну и про таймфрейм не забываем - об этом автор постоянно всем напоминает.

2 +

lasleon — 20 января 2014 г.

Жаль нельзя исправить текст ((((
Решил так написать.
* надо сделать привязку ПРОГРАММЫ к ГРАФИКУ

0 +

micstura — 26 января 2014 г.

Максим не могли бы вы сделать проект для пользователей Transaq. Как я знаю из него тоже существует импорт по DDE. Я изучаю ATF встроенный язык в Transaq однако документация написана так что разобраться может только программист. Поэтому решил перейти на изучение S# , разработчики предлагают обучение в отличии от разработчиков АТФ, но до этого хочу попробовать программирование на C# на чём собственно и строится S#.

0 +

Максим Милованов — 27 января 2014 г.

micstura, возможно в будущем что-нибудь напишу про Transaq, пока что просто с ним не очень хорошо знаком.

0 +

qtw — 5 марта 2014 г.

Здравствуйте, Максим. У меня такая проблема: я настроил таймфрейм, код бумаги и тд, более того, из графиков EDH4 и GZP4 все свечи нормально экспортируются в портфель, НО, когда я ставлю код бумаги SiH4, таблица не работает. Не знаете, в чем может быть проблема?

0 +

Максим Милованов — 6 марта 2014 г.

qtw, очень странно, что нет экспорта по доллар-рублю, попробуйте сделать следующее:
1) изменить таймфрейм в квике и настройках робота
2) обновить справочники квика
3) проверить шаг цены установленный в настройках робота

один из этих способов, должен помочь.

Если не помогло, попробуйте воспользоваться отладчиком квика.
Проблема не тривиальная, поэтому что-то конкретное сказать, решающее вашу проблему, очень сложно.

1 +

ovie8 — 21 марта 2014 г.

Здравствуйте Максим, пытаюсь разобраться в вашей статье, следую вашим инструкциям. Но после того как локально загрузил портфель, задаю имя таблицы candles, нажимаю да, открывается пустое окно с таблицей candles, что необходимо сделать, чтобы данные отображались? Нужно ли для этого соединение с quik или все должно работать локально? В вашем файле charts таймфрейм равен 5, где и как если это необходимо нужно изменить таймфрейм в quik?

0 +

Максим Милованов — 21 марта 2014 г.

ovie8, добрый день!

ДА, подключение к серверу брокеру нужно обязательно, иначе таблица будет пустая.
Для тестирования попробуйте использовать файл настроек для квика info.wnd из архива.
Помимо этого в портфеле должен быть таймфрейм равен теймфрейму на графике.

0 +

ovie8 — 21 марта 2014 г.

Максим Милованов, а где посмотреть таймфрейм графика?

0 +

Максим Милованов — 22 марта 2014 г.

ovie8, нужно таймфрейм изменить в настройках диаграммы квика и в портфеле - файл qpl, параметр timeFrame = 5.

0 +

Evgenich1983 — 1 апреля 2014 г.

Здравствуйте! Подскажите, как получать данные дневного графика. Меняю значение timeframe на day, не работает, -1 тоже

0 +

Andreynov — 16 мая 2014 г.

Evgenich1983, я был прав) поменяй код класса, удали старый портфель из списка портфелей и загрузи подправленный снова.
P.S. мне помогло.

0 +

Andreynov — 16 мая 2014 г.

Таблица candles пустая. Код класса теперь другой и файла info.wnd в архиве нет( есть info.ini)

0 +

Максим Милованов — 16 мая 2014 г.

Andreynov, действительно, файл info.wnd -настройки квика отсутствует. Воспользуйтесь, пожалуйста, аналогичным файлом из прикрепленного архива к статье http://robostroy.ru/community/article.aspx?id=436

Если таблица candles пустая, то причин может быть несколько:
1. Таймфрейм в портфеле и на графике разные
2. Не выбран нужный инструмент на графике
3. Внутренняя ошибка

Попробуйте запустить отладчик квика.

0 +

Максим Милованов — 16 мая 2014 г.

Andreynov, епли торги не ведутся, таблица также можеть быть пустая

0 +

Andreynov — 17 мая 2014 г.

Максим Милованов, проблема была решена (сменился код класса) вот и получалось что он не видит бумагу(

0 +

HPotter — 8 августа 2014 г.

Что то файла INFO.wnd в архиве нет.

0 +

HPotter — 8 августа 2014 г.

Что то не работает купайл скрипт. Хочу получить фьючерс РТС, изменил код так:
secClass = "SPBFUT"
secCode = "RIU4"
Чарт с пятиминуткой открыт. Но данные не появляются.
Что может быть?
Спасибо.

0 +

HPotter — 8 августа 2014 г.

Блин, что только не делал. Все коменты перечитал, пробовал по всякому. Не риходят данные в таблицу (.
Чарт открыт, В чарте привязка стоит RIU4, чарт пятиминутка. В коде тожя пятиминутка. Не приходят данные ((((((

0 +

HPotter — 8 августа 2014 г.

С открытием рынка, появилась последняя свеча. А как получить исторические? Или они только онлайн добавляются?

0 +

HPotter — 8 августа 2014 г.

Кажись понял в чем проблема. Если на чарте меньше 100 баров, то он не грузит их. Т.е. надо чтобы на чарте было больше. Ну или что бы торги уже были открыты, одно из двух. Но скорее первое.

0 +

PLe — 10 августа 2014 г.

При таком подходе можно получать данные из QUIK в стороннее приложение из нескольких таблиц по DDE? Если да, то как? На (Рис. 7) одна таблица показана, значит можно получать только из Таблицы текущих значений параметров, например, или из одного Окна котировок, а как быть если робот нужен который должен работать с несколькими инструментами и с несколькими окнами котировок, это возможно? Я выбираю какой язык начать учить, чтоб побыстрее чем QPIL работало всё. С# это оптимальный вариант или нет?

0 +

Максим Милованов — 13 августа 2014 г.

PLe, да, получать можно данные из нескольких таблиц. Здесь для примера идёт импорт из одной таблицы. Проще всего выгружать еще заголовок таблицы чтобы знать данные какой таблицы мы обрабатываем.
На мой взгляд, оптимальный вариант - изучать QLUA для написания роботов и тестировать системы в программах Wealth Lab, Trade Matic.

0 +

TrunkyGoo — 13 августа 2014 г.

Большое спасибо за статью. С нее начал, очень пригодилась. Делаю сейчас приложение, экспорт работает.

Моя ситуация - сейчас время от времени приостанавливается экспорт по DDE. Сообщение про неверные параметры. Проявляется через раз. Сделал уже асинхронную обработку сообщений от quik, по dde серверу на таблицу, но все равно - время от времени отваливается.

Начал смотреть, какой еще есть транспорт и quik в приложение - нашел следующее:
1. Использование qlua, из него вызов функций моих dll. Сейчас смотрю, где-то задействуется ZeroMQ для транспорта и т.д.
2. Использование pipe (через экспорт исторических данных для AmiBroker) - http://quik2dde.ru/viewtopic.php?id=19, пример еще не пробовал, но похоже на правду.

Интересует, скажем так, ваша экспертная оценка - в какую сторону идти-то. Может еще что-то есть надежное и удобное? Что еще интересно - посмотрел привод qscalp - там говорят, что экспорт через DDE - это устаревшее и используйте для интеграции с quik способ через lua (они все поставляют вместе со своей библиотекой).

0 +

Максим Милованов — 13 августа 2014 г.

TrunkyGoo, я бы смотрел в сторону использования QLUA, т.к. и передача данных происходит быстрее и ошибок в обработке/передаче данных можно сделать меньше при программировании.

0 +

TrunkyGoo — 13 августа 2014 г.

Максим Милованов, спасибо.

0 +

corrivalis — 26 августа 2014 г.

Можно не париться с qpile, а собирать в своем роботе любые свечи из данных таблицы всех сделок.

0 +

Sgho — 2 декабря 2014 г.

День добрый. Попробовал импортировать разные таблицы. Все работает. Спасибо за статью. Очень было бы хорошо, если бы тут же были бы еще и инструкции, каким образом передавать обратно поручения. Если вышла вторая часть, поделитесь, пожалуйста.

0 +

Максим Милованов — 2 декабря 2014 г.

Sgho, поручения передаются через специальный синтаксис QUIK. Об этом во второй части статьи - http://robostroy.ru/community/article.aspx?id=696

0 +

reg05 — 16 января 2015 г.

Хотел скачать архив, ладно, хрен с ним, зарегистрировался, хотя не понимаю зачем, т.к. скорее всего первый и последний раз на этом сайте. Но при скачивании нахера спрашивать номер сотового и какие-то смс подтверждения ? Тут чё интернет-банк что ли ? Может вместе с телефоном ещё и паспортные данные оставить кому попало ?

Автор, или тот, кто уже скачал, если не трудно, киньте архив на адрес reg05@mail.ru

0 +

physic2000 — 9 февраля 2015 г.

Добрый день.

Программу вложенную в эту статью скомпилировать в MS Visual Studio 2013 и запустить её exe получилось. Не получается в Квике открыть созданный портфель: charts.qpl. Конкретнее не получается выполнить вот эту инструкцию автора:
"... Чтобы импортировать свечи в нашу программу придется написать портфель на языке терминала Qpile и открыть его в терминале, выбрав в меню QUIK пункт Таблицы-Портфели-Задать портфель (Рис. 4) и нажать кнопку загрузить локально. После чего выбрать Таблицы-Портфели-Просмотр портфеля, нажать кнопки «Добавить все» и затем кнопку «Да», установив значение поля «Имя таблицы» как «candles» (Рис.5). После чего в QUIK появится новое окно со списком свечей (Рис. 6). ..."
В Квике появлялось окно как и на Рис. 4. "Загрузка портфеля", в нём я делал всё по инструкции, затем открывал окно такое же как и на Рис. 5. "Открытие и запуск портфеля", нажимал в нём кнопку [Добавить все], изменял имя таблицы на "candles", и нажимал на кнопку [Да]. В результате открывалось окно как на Рис.6. "Результат открытия портфеля", которое правда остаётся всё время пустым, т.е. без данных (Квик естественно подключён к счёту).

0 +

hitmax87 — 12 августа 2015 г.

physic2000, Скорее всего вы смотрите Si, поставьте USE_CASE_SENSITIVE_CONSTANTS. Но тогда в правильном регистре потребуется остальные значения выставить (LOW, OPEN, и проч.). Ну и данные должны приходить, либо таблица открыта, либо в списках проставлено.

0 +

vovannn — 12 июля 2016 г.

Уважаемый Максим, скажите пожалуйста когда появится часть 2?
Вы обещали продолжение в октябре 2013г. , сейчас 2016, июль.
Спасибо большое!

0 +

k-222189 — 12 июля 2016 г.

vovannn,
http://robostroy.ru/community/article.aspx?id=696

0 +

Arhn — 23 декабря 2016 г.

Подскажите, пожалуйста, как написать стакан где заявки выставляют. Как я понял это не грид. Может быть ссылку дадите где есть описание или на исходники? Спасибо.

1 +

Написать комментарий

Чтобы написать комментарий, необходимо авторизоваться.

Написать администратору