Проблема с получением биржевой информации., Примерно с 17-18 часов дня перестают приходить данные графиков, также не отображаются заявки отправленные в систему.
Алексей написал: В связи с этим, вопросы к техподдержке разработчиков торгового терминала QUIK:1. Почему данные на "графике" и в "стакане" отображаются НЕ СИНХРОННО?2. Что нужно сделать, чтобы устранить эту проблему? Я имею в виду, чтобы ничего не "висло" и работало синхронно.
Добрый день.
1. Немного уточним: в стакане отображаются котировки, а на графике - сделки, это разные вещи. 2. Нам известно о имевшей место проблеме трансляции графиков у Вашего брокера, и мы совместно с ним принимаем усилия по недопущению подобного в будущем. Приносим свои извинения за доставленные неудобства.
Здравствуйте.
1. Действительно, в стакане отображаются котировки, а на графике цены совершенных сделок. Когда же я говорю о том, что "данные в стакане и на графике отображаются не синхронно", то я имею в виду, что с течением времени данные в стакане меняются (то есть "транслируются"), а на графике нет (график просто "висит"), несмотря на то, что сделки не просто совершаются, а совершаются по разным ценам (я ведь написал, что в то время, когда график в КВИКЕ "висит", в ТРАНЗАКЕ данные о совершенных сделках с течением времени нормально отображаются). Кроме этого, я выложил "скрин" 5-минутного графика, на котором текущее время сервера 17:58, а на графике время последней отображенной свечи 17:30. То есть на графике отсутствуют данные, как минимум за последние 20 минут. При этом данные в стакане в течение указанного времени продолжали меняться. То есть, используя вашу терминологию, стакан "транслировался", а график нет.
2. Проблемы с трансляцией графиков, кроме указанной вами "имевшей места проблеме", продолжаются по настоящее время с завидной регулярностью, практически каждый день (длительность "зависания графиков", как правило, увеличивается после 18 часов). При этом, техническая поддержка брокера "Финам" говорит, что у них никаких проблем с трансляцией данных нет.
Учитывая все выше изложенное, задам свои вопросы иначе: 1. Почему сделки совершаются, а график "не транслируется"? 2. Проблема в "трансляции графиков" связана: - с брокером и его оборудованием (если так, то подскажите, пожалуйста, брокера, у которого все работает нормально); - особенностями работы торгового терминала QUIK (если так, то подскажите, пожалуйста, как учитывать эти особенности); - иными причинами (естественно кроме работы интернета, у меня интернет работает нормально)?
Проблема с получением биржевой информации., Примерно с 17-18 часов дня перестают приходить данные графиков, также не отображаются заявки отправленные в систему.
Поддерживаю всех, кто столкнулся с данной проблемой, а именно - ЗАВИСАНИЕ ГРАФИКОВ в торговом терминале QUIK.
Кроме всего сказанного, могу добавить следующее. В то время, когда график "висит", данные в стакане торгового терминала QUIK по тому же инструменту отображаются относительно корректно (по крайней мере данные в "стакане" КВИКА совпадают с данными в "стакане" ТРАНЗАКА). То есть "график" и "стакан" по одному и тому же инструменту в КВИКЕ отображаются НЕ СИНХРОННО (при этом в ТРАНЗАКЕ все данные на "графике" и в "стакане" отображаются нормально, по крайней мере СИНХРОННО).
Сделал "скрин" этой ситуации и отправил брокеру (в "Финам"). На картинке фьючерс на индеск РТС, расхождение более 500 пунктов.
На мой вопрос: "Почему данные отображаются НЕ СИНХРОННО? Может быть для отображения информации на "графике" и в "стакане" используются данные из разных потоков? Ведь если для отображения информации на "графике" и в "стакане" используются одни и те же исходные данные и есть какие-то задержки при получении данных с сервера (хотя у меня нормальный интернет), то при них должен виснуть не только "график", но и "стакан", то есть ВМЕСТЕ.", внятного ответа получить не удалось. Работник техподдержки Финама только повторял одно и тоже: "Для отображения информации используются одни и те же данные, а зависание графика связано с задержками в получении данных с сервера".
В связи с этим, вопросы к техподдержке разработчиков торгового терминала QUIK: 1. Почему данные на "графике" и в "стакане" отображаются НЕ СИНХРОННО? 2. Что нужно сделать, чтобы устранить эту проблему? Я имею в виду, чтобы ничего не "висло" и работало синхронно.
Определение размера денежных средств на торговом счете, Как определить размер доступных денежных средств для открытия сделки на фондовом и срочном рынке при использовании как выделенного, так и единого торгового счета?
Возникла следующая проблема: Открыл у брокера "Единый торговый счет" (то есть счет, с которого можно одновременно совершать сделки как на фондовом, так и на срочном рынке). При этом, при совершении сделок на фондовом рынке используется "Код торгового счета 1" и "Код клиента 1", а для сделок на срочном рынке используется "Код торгового счета 2" и "Код клиента 2".
До этого у меня было два отдельных счета для работы на фондовом и срочном рынке, и для определения состояния счета на срочном рынке я использовал данные из таблицы "futures_client_limits", где "trdaccid" - это код моего торгового счета на срочном рынке, а для определения состояния счета на фондовом рынке я использовал данные из таблицы "money_limits", где "client_code" - это мой код клиента на фондовом рынке.
После открытия "Единого торгового счета" в таблице "futures_client_limits" есть одна единственная запись с кодом торгового счета "Код торгового счета 2" (это код счета для торговли на срочном рынке), в которой все показатели равны НУЛЮ, а в таблице "money_limits" есть четыре записи с кодом клиента "Код клиента 1" (это код клиента для торговли на фондовом рынке), в которых я вижу состояние своего счета в РУБЛЯХ и $USA для режимов Т0 и Т2 соответственно.
ВОПРОСЫ:
1. Как определить входящие остатки и текущий размер свободных денежных средств для совершения сделок на фондовом рынке, при условии, что используется: "Код торгового счета 1" и "Код клиента 1"? 2. Как определить входящие остатки и текущий размер свободных денежных средств для совершения сделок на срочном рынке, при условии, что используется: "Код торгового счета 2" и "Код клиента 2"?
Подскажите, пожалуйста, как можно получить ЦЕНУ входящей позиции на начало торговой сессии?
В QLUA можно получить данные о текущих позициях:
- по инструментам срочного рынка (фьючерсам) из таблицы "futures_client_holding". В ней есть поле "startnet" - "Входящие чистые позиции", в котором, как я понимаю, указано КОЛИЧЕСТВО лотов по входящей чистой позиции
- по инструментам фондового рынка (акциям) из таблицы "depo_limits". В ней есть поле "openbal" - "Входящий остаток", в котором, как я понимаю, указано КОЛИЧЕСТВО лотов по входящей позиции.
А как получить ЦЕНУ входящей позиции на начало торговой сессии по инструментам срочного и фондового рынка?
В описаниях торгового терминала QUIK и языка QLUA используются два термина "Торговый счет" и "Код клиента". При этом в разных таблицах QUIK могут присутствовать как оба этих значения, так и только одно из них, например:
- в таблице "orders": account STRING Торговый счет client_code STRING Код клиента
- в таблице "depo_limits": trdaccid STRING Счет депо client_code STRING Код клиента
- в таблице "money_limits": client_code STRING Код клиента
- в таблице "futures_client_holding": trdaccid STRING Торговый счет
А есть еще таблица " transaction", которая передается в виде параметра в функцию sendTransaction(transaction). Так в этой таблице также есть эти два параметра: ['ACCOUNT'] - InputTradeAccount ['CLIENT_CODE'] - InputClientCode При этом, если послать транзакцию на создание новой заявки по фьючерсу и при этом не указывать 'CLIENT_CODE', то все нормально срабатывает и заявка выставляется.
Как видно из приведенных примеров в таблицах, которые имеют отношение к фьючерсам, везде обязательно присутствует "Торговый счет", а в таблицах, которые имеют отношение к фондовому рынку, везде обязательно присутствует "Код клиента", а в некоторых присутствуют оба.
Таким образом:
Насколько я понимаю "Торговый счет" - это код торгового счета, открытого у брокера. Если это так, то тогда: что такое "Код клиента", где его взять и в каких случаях его необходимо использовать?
DLL для LUA: Ошибка при получении индексированного массива из DLL, В LUA-скрипте при получении индексированного массива из DLL-библиотеки возникает ошибка и QUIK "падает"
Антон. Огромное спасибо за ваш ответ. Все проверил, работает "как часы". Честно говоря, о таком очевидном решении (правда, оно стало очевидным только после того, как вы его подсказали) у меня даже и предположений не было. Не помню, откуда я скачал сборку библиотеки "lua5.1.lib", скорее всего по какой-нибудь ссылке с примерами по созданию DLL-библиотек для QLUA или что-то подобное. Хорошо, что ошибка проявилась на этапе тестирования (путем непрерывного вызова из функции main() LUA-скрипта соответствующих функций DLL-библиотеки с выводом результата в LOG-файл), а не в процессе реальной работы с деньгами.
К стати, именно по причине появления подобных ошибок, я не стал использовать свою GUI DLL-библиотеку (нормальные окна, кнопки и прочие контролы WinAPI) при создании торгового инструмента, а перешел на "таблицы QUIK",убого правда, но зато стабильно работает. А опять менять интерфейс, рука не поворачивается, слишком много времени было потрачено на его организацию с помощью "таблиц квика".
DLL для LUA: Ошибка при получении индексированного массива из DLL, В LUA-скрипте при получении индексированного массива из DLL-библиотеки возникает ошибка и QUIK "падает"
Здравствуйте. Помогите, пожалуйста, разобраться. Очень странная ситуация.
При тестировании взаимодействия LUA-скрипта и DLL-библиотеки была обнаружена ошибка, когда из DLL-библиотеки в LUA-скрипт передается простой индексированный массив.
Тест был простой: из LUA-скрипта вызывается функция DDL-библиотеки, которая просто возвращает сформированный массив.
Код из DDL-библиотеки на C++:
Код
// luaTest.cpp: определяет экспортированные функции для приложения DLL.
#include "stdafx.h"
// ----------------------------------------------------------------------------
// Заголовок Lua
// ----------------------------------------------------------------------------
#ifndef LUA_LIB
// Необходимые для Lua константы
#define LUA_LIB
#define LUA_BUILD_AS_DLL
// Заголовочные файлы LUA из дистрибутива LUA
extern "C" {
#include "./lauxlib.h"
#include "./lua.h"
}
#endif
// -------------------------------------------
// Выбор режима формирования элементов массива
// -------------------------------------------
#define TEST_INDEX_INTEGER
//#define TEST_INDEX_STRING
//#define TEST_INDEX_INTEGER_STRING
// --------------------------------------------------
// Наша единственная функция.
// Формирует и возвращает LUA-скрипту простой массив.
// --------------------------------------------------
static int GetValue(lua_State *L)
{
lua_newtable(L);
for (int i = 1; i <= 15; i++)
{
char strIndex[20] = "";
sprintf_s(strIndex, 10, "%d", i);
// Добавим в стек ключ элемента
#ifdef TEST_INDEX_INTEGER_STRING
// Вот так работает идеально
if (i == 3)
{
// Добавим всего один элемент массива со строковым индексом
lua_pushstring(L, strIndex);
}
else
{
// Все остальные индексы числовые
lua_pushinteger(L, i);
}
#else
#ifdef TEST_INDEX_STRING
// Вот так работает идеально
lua_pushstring(L, strIndex);
#else
// Вот так возникает ошибка (когда все элементы массива имеют целочисленные индексы)
lua_pushinteger(L, i);
#endif
#endif
// Добавим в стек значение элемента
lua_pushinteger(L, i);
// Вставим в стек итератор
lua_settable(L, -3);
}
// Даем lua знать, какое количество значений возвращается нашей функцией
return (1);
}
// ----------------------------------------------------
// Структура "Регистрация реализованных в dll функций",
// что бы те стали доступны из lua.
// ----------------------------------------------------
static struct luaL_reg ls_lib[] =
{
{ "GetValue", GetValue },
{ NULL, NULL }
};
// ------------------------------------------------------------
// Эту функцию lua будет искать при подключении dll,
// ее название заканчиваться названием dll, luaopen_ИмяНашейDLL
// ------------------------------------------------------------
extern "C" LUALIB_API int luaopen_luaTest(lua_State *L)
{
luaL_openlib(L, "luaTest", ls_lib, 0);
return 0;
}
Код LUA-скрипта:
Код
-- Добавим в переменную окружения путь расположения нашего скрипта для подключения *.lua скриптов
package.path = package.path..";"..getScriptPath().."\\?.lua";
-- Добавим в переменную окружения путь расположения нашего скрипта для подключения *.dll библиотек
package.cpath = package.cpath..";"..getScriptPath().."\\?.dll";
-- Загружаем DLL
require('luaTest');
-- Признак работы скрипта
local IsRun = false;
-- Функция инициализации вызывается до запуска скрипта,
-- перед началом работы функции main()
function OnInit()
end
-- Функция вызывается, когда пользователь нажимает кнопку "Остановить" или закрывает терминал.
function OnStop(s)
IsRun = false;
end
function main()
IsRun = true;
while IsRun do
-- Вызываем функцию из DLL
local value = luaTest.GetValue();
-- Если в полученном массиве есть хотя-бы один элемент со строковым индексом,
-- то все работает идеально.
-- Если же в полученном массиве все элементы имеют целочисленные индексы,
-- то возникает следующее:
-- Если оставить указанный ниже код, то через 1-2 секунды QUIK падает
if (type(value) == 'table') then
end
-- Если этого кода нет, то все работает, но при остановке скрипта в QUIK
-- (в поле "Ошибки выполнения скрипта") появляется сообщение "LuaVM closed with error"
--if (type(value) == 'table') then
--end
-- пауза
sleep(10)
end
end
Весь фокус заключается в том, что ошибка возникает не сразу (не при первом вызове функции из DLL-библиотеки), а после нескольких итераций. Кроме того, ошибка возникает именно в том случае, когда в полученном из DLL массиве все элементы имеют целочисленные индексы. Если же в полученном массиве есть хотя бы один элемент со строковым индексом, никакой ошибки не возникает.
При всем этом не понятно, где ошибка. Я, конечно, не исключаю, что это может быть ошибка в программном коде, который я привел. А если это не так, то в чем тогда дело? Может быть дело в "lua5.1.dll", которая поставляется вместе с торговым терминалом QUIK или в самом QUIK-е?
Самое обидное заключается в том, что эта ошибка проявилась, когда вся DLL-библиотека (для хранения и обмена данными между разными LUA-скриптами: простые типы, строки, любые вложенные массивы) была полностью написана и показала неплохие результаты с точки зрения производительности и потоко-безопасности.
Когда ошибка проявилась, для проведения теста и исключения возможной ошибки в коде DLL-библиотеки был создан самый простой проект в "Visual Studio 2015", а LUA-скрипт запускался из торгового термина QUIK без подключения к серверу.
Ссылка на архив с исходниками для тестирования: https://yadi.sk/d/4_WNa6WWWBpMbQ DLL-библиотека компилировалась в "Visual Studio 2015". LUA-скрипт запускался из торгового терминала QUIK.